Log message for revision 67671: Further on the path.... but not yet done.
Changed: U Zope/branches/easter-sprint_traversal-refactor/lib/python/OFS/Traversable.py U Zope/branches/easter-sprint_traversal-refactor/lib/python/ZPublisher/BaseRequest.py -=- Modified: Zope/branches/easter-sprint_traversal-refactor/lib/python/OFS/Traversable.py =================================================================== --- Zope/branches/easter-sprint_traversal-refactor/lib/python/OFS/Traversable.py 2006-04-27 20:39:35 UTC (rev 67670) +++ Zope/branches/easter-sprint_traversal-refactor/lib/python/OFS/Traversable.py 2006-04-27 20:40:05 UTC (rev 67671) @@ -25,9 +25,14 @@ from Acquisition import Acquired, aq_inner, aq_parent, aq_base from zExceptions import NotFound from ZODB.POSException import ConflictError -from zope.interface import implements +from zope.interface import implements, Interface from interfaces import ITraversable +from zope.app.traversing.interfaces import ITraversable as IZope3Traversable +from zope.component import queryMultiAdapter +from zope.app.traversing.interfaces import TraversalError +from zope.app.traversing.namespace import nsParse +from zope.app.traversing.namespace import namespaceLookup _marker = object() @@ -59,6 +64,7 @@ return self.virtual_url_path() spp = self.getPhysicalPath() + try: toUrl = self.REQUEST.physicalPathToURL except AttributeError: @@ -133,7 +139,6 @@ If true, then all of the objects along the path are validated with the security machinery. Usually invoked using restrictedTraverse(). """ - if not path: return self @@ -188,7 +193,19 @@ continue bobo_traverse = _getattr(obj, '__bobo_traverse__', _none) - if bobo_traverse is not _none: + if name and name[:1] in '@+': + # Process URI segment parameters. + ns, nm = nsParse(name) + if ns: + try: + next = namespaceLookup(ns, nm, obj, + self.REQUEST).__of__(obj) + if restricted and not securityManager.validate( + obj, obj, _none, next): + raise Unauthorized, name + except TraversalError: + raise AttributeError(name) + elif bobo_traverse is not _none: next = bobo_traverse(REQUEST, name) if restricted: if aq_base(next) is not next: @@ -216,11 +233,19 @@ next = _getattr(obj, name, marker) if next is marker: try: - next=obj[name] - except AttributeError: - # Raise NotFound for easier debugging - # instead of AttributeError: __getitem__ - raise NotFound, name + try: + next=obj[name] + except AttributeError: + # Raise NotFound for easier debugging + # instead of AttributeError: __getitem__ + raise NotFound, name + except (NotFound, KeyError): + # Try to look for a view + next = queryMultiAdapter((obj, self.REQUEST), + Interface, name).__of__(obj) + if next is None: + # Didn't find one, reraise the error: + raise if restricted and not securityManager.validate( obj, obj, _none, next): raise Unauthorized, name Modified: Zope/branches/easter-sprint_traversal-refactor/lib/python/ZPublisher/BaseRequest.py =================================================================== --- Zope/branches/easter-sprint_traversal-refactor/lib/python/ZPublisher/BaseRequest.py 2006-04-27 20:39:35 UTC (rev 67670) +++ Zope/branches/easter-sprint_traversal-refactor/lib/python/ZPublisher/BaseRequest.py 2006-04-27 20:40:05 UTC (rev 67671) @@ -16,9 +16,9 @@ """ from urllib import quote import xmlrpc -from zExceptions import Forbidden, Unauthorized +from zExceptions import Forbidden, Unauthorized, NotFound -from zope.interface import implements, providedBy +from zope.interface import implements, providedBy, Interface from zope.component import queryMultiAdapter from zope.component import getSiteManager from zope.component.interfaces import ComponentLookupError @@ -26,7 +26,6 @@ from zope.app.publication.interfaces import EndRequestEvent from zope.app.publisher.browser import queryDefaultViewName from zope.publisher.interfaces import IPublishTraverse -from zope.publisher.interfaces import NotFound from zope.component.interfaces import IDefaultViewName from zope.publisher.interfaces.browser import IBrowserPublisher from zope.publisher.interfaces.browser import IBrowserRequest @@ -262,8 +261,6 @@ def traverseName(self, ob, name): - nm = name # the name to look up the object with - if name and name[:1] in '@+': # Process URI segment parameters. ns, nm = nsParse(name) @@ -271,15 +268,15 @@ try: ob2 = namespaceLookup(ns, nm, ob, self) except TraversalError: - raise NotFound(ob, name) + raise KeyError(ob, name) return ob2.__of__(ob) - if nm == '.': + if name == '.': return ob if IPublishTraverse.providedBy(ob): - ob2 = ob.publishTraverse(self, nm) + ob2 = ob.publishTraverse(self, name) else: adapter = queryMultiAdapter((ob, self), IPublishTraverse) if adapter is None: @@ -287,7 +284,21 @@ ## so we will just use a default adapter. adapter = DefaultPublishTraverse(ob, self) - ob2 = adapter.publishTraverse(self, nm) + try: + ob2 = adapter.publishTraverse(self, name) + except (AttributeError, KeyError, NotFound): + # Find a view even if it doesn't start with @@, but only + # If nothing else could be found + ob2 = queryMultiAdapter((ob, self), Interface, name) + if ob2 is not None: + ob2 = ob2.__of__(ob) + # OFS.Application.__bobo_traverse__ calls + # REQUEST.RESPONSE.notFoundError which sets the HTTP + # status code to 404 + self.RESPONSE.setStatus(200) + else: + # There was no view, reraise the earlier error: + raise return ob2 _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins