[Zope-Checkins] SVN: Products.Five/branches/1.5/ Resource directories now implement own traversal. This fixes an issue where a browser view with the same name as a subdirectory would be favored (leading to often very unexpected results).

Malthe Borch mborch at gmail.com
Fri Feb 18 10:46:03 EST 2011


Log message for revision 120425:
  Resource directories now implement own traversal. This fixes an issue where a browser view with the same name as a subdirectory would be favored (leading to often very unexpected results).

Changed:
  U   Products.Five/branches/1.5/CHANGES.txt
  U   Products.Five/branches/1.5/browser/resource.py
  U   Products.Five/branches/1.5/browser/tests/resource.txt

-=-
Modified: Products.Five/branches/1.5/CHANGES.txt
===================================================================
--- Products.Five/branches/1.5/CHANGES.txt	2011-02-18 15:01:43 UTC (rev 120424)
+++ Products.Five/branches/1.5/CHANGES.txt	2011-02-18 15:46:03 UTC (rev 120425)
@@ -5,6 +5,10 @@
 HEAD
 ====
 
+* Resource directories now implement own traversal. This fixes an
+  issue where a browser view with the same name as a subdirectory
+  would be favored.
+
 Five 1.5.9 (2009-01-01)
 =======================
 

Modified: Products.Five/branches/1.5/browser/resource.py
===================================================================
--- Products.Five/branches/1.5/browser/resource.py	2011-02-18 15:01:43 UTC (rev 120424)
+++ Products.Five/branches/1.5/browser/resource.py	2011-02-18 15:46:03 UTC (rev 120425)
@@ -20,6 +20,7 @@
 
 import Acquisition
 from OFS.Traversable import Traversable as OFSTraversable
+from zope.publisher.interfaces import IPublishTraverse
 from zope.app.publisher.browser.resources import empty
 from zope.app.publisher.fileresource import File, Image
 from zope.app.publisher.pagetemplateresource import PageTemplate
@@ -175,6 +176,7 @@
 
 class DirectoryResource(BrowserView, Resource, OFSTraversable):
     #implements(IBrowserPublisher)
+    implements(IPublishTraverse)
 
     resource_factories = {
         'gif':  ImageResourceFactory,
@@ -199,6 +201,9 @@
             name = '++resource++%s' % self.__name__
         return name
 
+    def publishTraverse(self, request, name):
+        return self.get(name)
+
     def __browser_default__(self, request):
         '''See interface IBrowserPublisher'''
         return empty, ()

Modified: Products.Five/branches/1.5/browser/tests/resource.txt
===================================================================
--- Products.Five/branches/1.5/browser/tests/resource.txt	2011-02-18 15:01:43 UTC (rev 120424)
+++ Products.Five/branches/1.5/browser/tests/resource.txt	2011-02-18 15:46:03 UTC (rev 120425)
@@ -61,6 +61,20 @@
   >>> abs_url + '/' == base_url % ''
   True
 
+Verify that the resource directory implements the ``IPublishTraverse``
+interface. We want only directory-based traversal at this point
+(otherwise, if a subobject has the name of a view component, it will
+be preferred by the default traverser).
+
+  >>> directory = self.folder.unrestrictedTraverse(
+  ...     'testoid/++resource++fivetest_resources')
+  >>> from zope.publisher.interfaces import IPublishTraverse
+  >>> IPublishTraverse.providedBy(directory)
+  True
+
+  >>> directory.publishTraverse('self.folder.REQUEST', 'resource_subdir')
+  <Products.Five.browser.resource.DirectoryResource object at ...>
+
 PageTemplateResource's __call__ renders the template
 
   >>> for r in dir_resource_names:



More information about the Zope-Checkins mailing list