[z3-checkins] r5686 - z3/Five/branch/dc-experiments
philikon at codespeak.net
philikon at codespeak.net
Mon Jul 26 15:34:43 MEST 2004
Author: philikon
Date: Mon Jul 26 15:34:43 2004
New Revision: 5686
Added:
z3/Five/branch/dc-experiments/traversable.py
- copied, changed from r5685, z3/Five/trunk/viewable.py
Log:
Re-added traversable.py, this time with the revision history from
its predecessor, viewable.py
Copied: z3/Five/branch/dc-experiments/traversable.py (from r5685, z3/Five/trunk/viewable.py)
==============================================================================
--- z3/Five/trunk/viewable.py (original)
+++ z3/Five/branch/dc-experiments/traversable.py Mon Jul 26 15:34:43 2004
@@ -6,14 +6,17 @@
# License (ZPL) v2.1. See COPYING.txt for more information.
#
##############################################################################
-"""Machinery for making things viewable through Five views
+"""Machinery for making things traversable through adaptation
$Id$
"""
-from webdav.NullResource import NullResource
+from zope.exceptions import NotFoundError
from zope.component import getView, ComponentLookupError
from zope.interface import implements
from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.app.traversing.interfaces import ITraverser, ITraversable
+from zope.app.traversing.adapters import DefaultTraversable
+from zope.app.traversing.namespace import queryResourceInContext
from monkey import DebugFlags
class FakeRequest:
@@ -24,17 +27,18 @@
def getPresentationSkin(self):
return None
-class Viewable:
- """A mixin to make an object viewable using the Zope 3 system.
+class Traversable:
+ """A mixin to make an object traversable using an ITraverser adapter.
"""
- __five_viewable__ = True
+ __five_traversable__ = True
def __fallback_traverse__(self, REQUEST, name):
"""Method hook for fallback traversal
This method is called by __bobo_traverse___ when Zope3-style
- view lookup fails. By default, we do what Zope 2 would do,
- raise a NotFound error."""
+ ITraverser traversal fails. By default, we do what Zope 2 would do,
+ raise a NotFound error.
+ """
try:
REQUEST.RESPONSE.notFoundError("%s " % name)
except AttributeError:
@@ -44,13 +48,15 @@
"""Hook for Zope 2 traversal
This method is called by Zope 2's ZPublisher upon traversal.
- It allows us to trick it into publishing Zope 3-style views.
+ It allows us to trick it into faking the Zope 3 traversal system
+ by using an ITraverser adapter.
"""
if not IBrowserRequest.providedBy(REQUEST):
REQUEST = FakeRequest()
try:
- return getView(self, name, REQUEST).__of__(self)
- except ComponentLookupError:
+ kw = dict(path=[name], request=REQUEST)
+ return ITraverser(self).traverse(**kw).__of__(self)
+ except (ComponentLookupError, NotFoundError, AttributeError):
pass
try:
return getattr(self, name)
@@ -60,5 +66,26 @@
return self[name]
except (AttributeError, KeyError):
pass
-
return self.__fallback_traverse__(REQUEST, name)
+
+class FiveTraversable(DefaultTraversable):
+
+ def traverse(self, name, furtherPath):
+ context = self._subject
+ __traceback_info__ = (context, name, furtherPath)
+ # Find the REQUEST
+ REQUEST = getattr(context, 'REQUEST', None)
+ if not IBrowserRequest.providedBy(REQUEST):
+ REQUEST = FakeRequest()
+ # Try to lookup a view first
+ try:
+ return getView(context, name, REQUEST).__of__(context)
+ except ComponentLookupError:
+ pass
+ # If a view can't be found, try to lookup a resource
+ resource = queryResourceInContext(context, name, REQUEST)
+ if resource is not None:
+ return resource
+ # If a resource can't be found, then use default traversable
+ return super(FiveTraversable, self).traverse(name, furtherPath)
+
More information about the z3-checkins
mailing list