Hi all,

After much debate and tweaking, the context-refactoring should now be in 
a good shape for merging on trunk.

For those who have missed the (sometimes heated) discussions of the past 
months, here's what it is about. During 0.11dev, I introduced a 
`Context` class which was meant to hold all the necessary information 
for rendering "content". To that end, this object encapsulated the 
commonly used env, req and db objects. A context was also indicating 
which Trac "resource" was being worked on, by the way of .realm, .id and 
.version properties. There were a few methods that could be used to 
describe that resource as well, like for getting the name or the url of 
that resource. In addition, contexts could be nested (have a parent 
context). Finally, the fine grained permission scheme introduced in 
0.11dev was using the context in order to grant different permissions 
for individual resources.

Now there were some concerns that this design was a bit crufty, and I 
agreed to rework this into something more consensual: a Context class 
focusing on the rendering aspects and a Resource class focusing on the 
identification of the resource.

The context doesn't contain unnecessary information anymore (no env, no 
db) and only keeps the req because at that point there's no way to do 
without. The longer term goal (hopefully 0.12) is to have a rendering 
layer _hence the Context_ be completely independent from the web Request 
object. The context is still associated to a resource by the way of a 
.resource property, which is a Resource object, so that among other 
things, relative links in the rendered wiki text can work.

A resource object bundles together .realm (like 'wiki', 'ticket', etc.), 
.id (unique identifier within a realm) and .version (a number or None 
for the latest), as well as a .parent resource in case of dependent 
resources (typical and only example for now, the resources in the 
'attachment' realm). There's no way to get to the underlying data model 
object implicitly; if you need it, you'll have to instantiate explicitly 
the appropriate model class for the given resource. Also, all the helper 
methods for getting the url, name etc. of a resource in a generic way 
have been replaced by helper functions taking an env and a resource 
(there are more convenient name_of(resource, url_of(resource) helper 
functions available in the templates, though). Finally, the fine grained 
permission scheme is now using exclusively the resources for doing the 
permission checks. A typical fined grained permission check can now be 
done by writing something like:

 req.perm(ticket.resource).require('TICKET_VIEW')

where ticket is the model object for some ticket.

There's no trac.context module anymore. The new Context class is now 
located in trac.mimeview. The new Resource class, along with the 
ResourceNotFound exception, IResourceManager interface and the 
ResourceSystem, is located in trac.resource.

The full set of changes can be examined using the following diff URL, 
but be warned that this is a somewhat big set of changes...

http://trac.edgewall.org/anydiff?new_path=%2Fsandbox%2Fcontext-refactoring&old_path=%2Fsandbox%2Fcontext-refactoring&new_rev=6117&old_rev=6117

Things are certainly not yet 100% polished at this point, but the branch 
did receive considerable attention, so almost everything should work (or 
is it's a bug ;-) ).


Now, once that branch is in trunk, the timeline refactoring will follow 
(I'll write  a second mail about that one, but it should be much less 
contentious) and after the most critical remaining bugs for 0.11 are 
committed as well (#5025 and #2048), I propose that we release a 
0.11beta1 and upgrade t.e.o to it. The advantage is that this will 
provide some clarity when talking about the 0.11dev API: pre-beta1 will 
be the old trac.context.Context and trac.timeline.TimelineEvent APIs, 
and post-beta1 will be the new trac.resource.Resource and 
trac.mimeview.Context ones. Therefore, a plugin would be either "beta1" 
compatible or not.

-- Christian


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Trac 
Development" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/trac-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to