[PEAK] sitemaps: <content> in non-root <location>

Radek Kanovsky rk at dat.cz
Fri Jan 7 12:50:44 EST 2005


On Fri, Jan 07, 2005 at 11:38:48AM -0500, Phillip J. Eby wrote:

> >> I think there's a simpler solution than either; the 'clone()' operation
> >> called inside Location.traverseTo() should simply become:
> >>
> >>             context = ctx.clone(current=cont, 
> >viewHandler=self.viewHandler)
> >>
> >> This should do the right thing in the specific circumstances; i.e. ensure
> >> that the traversal into the container and beneath includes the current
> >> location's view definitions.
> >
> >It works except one special case when container itself implements 
> >IViewService.
> 
> Yeah, I thought about that, but I don't think I care about supporting that 
> case.  If you have that scenario you should use <location 
> class="containerclass"> instead of tacking the item on as a container to 
> the location.  Containers are supposed to be pure containers.

Yes, it wouldn't be a good practice to mix such things.

> >> A fix (with tests) is now in CVS.
> >
> >Then the same fix should be applied to sitemaps.addHelper too.
> >Again, helper can implement IViewService directly.
> 
> If the helper wants to add names, it can do so directly, it doesn't need to 
> offer them as views.  I don't see much use for it being a view service.

I am not sure if you understand me wholly. When you use helper for some
view in non-root location, this non-root location is not in context
stack. There is cloned context for helper in the stack instead of
context for non-root location. So sitemaps.addHelper should be fixed
too:

    def addHelper(handler,helper):
        def helped_handler(ctx, ob, namespace, name, qname, default=NOT_GIVEN):
            ob = helper(ob)
            return handler(
                ctx.clone(current=ob, viewHandler=ctx.viewHandler),
                ob,namespace,name,qname,default
            )
        return helped_handler

Example sitemap:

    <location>
        <location name='sub'>
            <view name='index_html' resource='...' helper='Help'/>
        </location>
    </location>

If you traverse '/sub/@@index_html', context stack looks like this:

    ctx.current == <Help>
    ctx.current == <Location place_url=/>

I agree that there is no use case for using helper that implements
IViewService.

> Of course, if you have actual use cases for these things, please explain 
> them to me and maybe I'll be convinced otherwise.  At the moment they both 
> seem quite YAGNI.

Agreement.

RadekK



More information about the PEAK mailing list