On Thu, May 14, 2009 at 10:55:40PM +0200, Laurence Rowe wrote:
For maximum portability across Z2 / Z3 / BFG, you could just do the same thing and implement __getitem__ on any object you want to be traversable by either the publisher or APIs like (un)restrictedTraverse, and forego the over-complicated component-laden traversal dance. ;)
Minimal example demonstrating this with a view in zope2:
from zope.component import getSiteManager from Testing.makerequest import makerequest from zope.publisher.browser import IBrowserView from Acquisition import Explicit from zope.component import getSiteManager app = makerequest(app) smgr = getSiteManager() class Foo(Explicit): ... def __init__(self, context, request): ... self.context, self.request = context, request ... def __getitem__(self, key): ... return int(key) ... smgr.registerAdapter(Foo, (None, IRequest), IBrowserView, name='foo') app.unrestrictedTraverse('@@foo/12345') 12345
Thanks for reminding me of this. I keep forgetting that this works! I only add that if you want to use __getitem__ for publishing, the items you return should inherit from Acquisition.(Im|Ex)plicit to make the security machinery happy. -- Paul Winkler http://www.slinkp.com