[Checkins] SVN: Zope/branches/philikon-aq/lib/python/ We do need to do some wrapping when objects are found via namespace

Philipp von Weitershausen philikon at philikon.de
Sat Sep 1 19:52:34 EDT 2007


Log message for revision 79432:
  We do need to do some wrapping when objects are found via namespace
  traversal.
  

Changed:
  U   Zope/branches/philikon-aq/lib/python/OFS/Traversable.py
  U   Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.py
  U   Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.zcml
  U   Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy_ftest.txt
  U   Zope/branches/philikon-aq/lib/python/ZPublisher/BaseRequest.py

-=-
Modified: Zope/branches/philikon-aq/lib/python/OFS/Traversable.py
===================================================================
--- Zope/branches/philikon-aq/lib/python/OFS/Traversable.py	2007-09-01 20:59:12 UTC (rev 79431)
+++ Zope/branches/philikon-aq/lib/python/OFS/Traversable.py	2007-09-01 23:52:33 UTC (rev 79432)
@@ -23,6 +23,7 @@
 from AccessControl import Unauthorized
 from AccessControl.ZopeGuards import guarded_getattr
 from Acquisition import Acquired, aq_inner, aq_parent, aq_acquire, aq_base
+from Acquisition.interfaces import IAcquirer
 from zExceptions import NotFound
 from ZODB.POSException import ConflictError
 from OFS.interfaces import ITraversable
@@ -193,6 +194,8 @@
                             try:
                                 next = namespaceLookup(
                                     ns, nm, obj, aq_acquire(self, 'REQUEST'))
+                                if IAcquirer.providedBy(next):
+                                    next = next.__of__(obj)
                                 if restricted and not validate(
                                     obj, obj, name, next):
                                     raise Unauthorized(name)

Modified: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.py
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.py	2007-09-01 20:59:12 UTC (rev 79431)
+++ Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.py	2007-09-01 23:52:33 UTC (rev 79432)
@@ -18,7 +18,10 @@
 better) still work.
 """
 import Acquisition
+import OFS.SimpleItem
+
 from zope.interface import implements
+from zope.traversing.interfaces import ITraversable
 from zope.contentprovider.interfaces import IContentProvider
 from Products.Five import BrowserView
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
@@ -115,3 +118,19 @@
 
     def render(self):
         return 'BrowserView viewlet'
+
+
+class LegacyNamespace(object):
+    implements(ITraversable)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def traverse(self, name, ignored):
+        return LegacyNamespaceObject(name)
+
+class LegacyNamespaceObject(OFS.SimpleItem.SimpleItem):
+
+    def __init__(self, name):
+        self.id = name

Modified: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.zcml
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.zcml	2007-09-01 20:59:12 UTC (rev 79431)
+++ Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.zcml	2007-09-01 23:52:33 UTC (rev 79432)
@@ -112,4 +112,24 @@
       permission="zope.Public"
       />
 
+  <!-- Namespace traversal -->
+
+  <adapter
+      for="*"
+      factory=".aqlegacy.LegacyNamespace"
+      name="aqlegacy"
+      />
+  <adapter
+      for="* *"
+      factory=".aqlegacy.LegacyNamespace"
+      name="aqlegacy"
+      />
+
+  <browser:page
+      for=".aqlegacy.LegacyNamespaceObject"
+      name="index.html"
+      template="falcon.pt"
+      permission="zope.Public"
+      />
+
 </configure>
\ No newline at end of file

Modified: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy_ftest.txt
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy_ftest.txt	2007-09-01 20:59:12 UTC (rev 79431)
+++ Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy_ftest.txt	2007-09-01 23:52:33 UTC (rev 79432)
@@ -141,6 +141,28 @@
   Viewlet inheriting from Explicit</p>
 
 
+Testing namespace traversal
+===========================
+
+Namespace traversal can turn up objects during traversal without
+attribute access.  That means they might not be wrapped by default.
+Here we make sure that they are wrapped and that things like the
+request can be acquired.
+
+First let's try ``restrictedTraverse()``:
+
+  >>> foo = self.folder.restrictedTraverse('++aqlegacy++foo')
+  >>> import Acquisition
+  >>> Acquisition.aq_acquire(foo, 'REQUEST')
+  <HTTPRequest, URL=http://nohost>
+
+Now let's try URL traversal:
+
+  >>> browser.open('http://localhost/test_folder_1_/++aqlegacy++foo/index.html')
+  >>> print browser.contents
+  <p>The falcon has taken flight</p>
+
+
 Clean up
 --------
 

Modified: Zope/branches/philikon-aq/lib/python/ZPublisher/BaseRequest.py
===================================================================
--- Zope/branches/philikon-aq/lib/python/ZPublisher/BaseRequest.py	2007-09-01 20:59:12 UTC (rev 79431)
+++ Zope/branches/philikon-aq/lib/python/ZPublisher/BaseRequest.py	2007-09-01 23:52:33 UTC (rev 79432)
@@ -18,6 +18,7 @@
 import xmlrpc
 from zExceptions import Forbidden, Unauthorized, NotFound
 from Acquisition import aq_base
+from Acquisition.interfaces import IAcquirer
 
 from zope.interface import implements, providedBy, Interface
 from zope.component import queryMultiAdapter
@@ -312,6 +313,9 @@
                     ob2 = namespaceLookup(ns, nm, ob, self)
                 except TraversalError:
                     raise KeyError(ob, name)
+
+                if IAcquirer.providedBy(ob2):
+                    ob2 = ob2.__of__(ob)
                 return ob2
 
         if name == '.':



More information about the Checkins mailing list