[Checkins] SVN: five.pt/trunk/src/five/pt/expressions.py Use correct 'call' behavior; on Zope 2, this is the 'render' function.

Malthe Borch mborch at gmail.com
Fri Jul 22 18:10:20 EDT 2011


Log message for revision 122321:
  Use correct 'call' behavior; on Zope 2, this is the 'render' function.

Changed:
  U   five.pt/trunk/src/five/pt/expressions.py

-=-
Modified: five.pt/trunk/src/five/pt/expressions.py
===================================================================
--- five.pt/trunk/src/five/pt/expressions.py	2011-07-22 22:07:41 UTC (rev 122320)
+++ five.pt/trunk/src/five/pt/expressions.py	2011-07-22 22:10:20 UTC (rev 122321)
@@ -1,4 +1,5 @@
 from ast import NodeTransformer
+from types import ClassType
 from compiler import parse as ast24_parse
 
 from Acquisition import aq_base
@@ -87,13 +88,16 @@
 class BoboAwareZopeTraverse(object):
     traverse_method = 'restrictedTraverse'
 
-    def __call__(self, base, request, call, *path_items):
+    __slots__ = ()
+
+    @classmethod
+    def traverse(cls, base, request, path_items):
         """See ``zope.app.pagetemplate.engine``."""
 
         length = len(path_items)
         if length:
             i = 0
-            method = self.traverse_method
+            method = cls.traverse_method
             while i < length:
                 name = path_items[i]
                 i += 1
@@ -106,14 +110,18 @@
                     base = traverser(name)
                 else:
                     base = traversePathElement(
-                        base, name, path_items[i:], request=request)
+                        base, name, path_items[i:], request=request
+                        )
 
+        return base
+
+    def __call__(self, base, request, call, *path_items):
+        base = self.traverse(base, request, path_items)
+
         if call is False:
             return base
 
         if getattr(base, '__call__', _marker) is not _marker or callable(base):
-            # here's where we're different from the standard path
-            # traverser
             base = render(base, request)
 
         return base
@@ -122,7 +130,21 @@
 class TrustedBoboAwareZopeTraverse(BoboAwareZopeTraverse):
     traverse_method = 'unrestrictedTraverse'
 
+    __slots__ = ()
 
+    def __call__(self, base, request, call, *path_items):
+        base = self.traverse(base, request, path_items)
+
+        if call is False:
+            return base
+
+        if (getattr(base, '__call__', _marker) is not _marker \
+            or isinstance(base, ClassType)):
+            return base()
+
+        return base
+
+
 class PathExpr(expressions.PathExpr):
     exceptions = zope2_exceptions
 



More information about the checkins mailing list