[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