[Zope-Checkins] SVN: Zope/branches/2.10/ Fix for #2187.

Lennart Regebro regebro at gmail.com
Sun Sep 24 13:59:06 EDT 2006


Log message for revision 70357:
  Fix for #2187.
  

Changed:
  U   Zope/branches/2.10/doc/CHANGES.txt
  U   Zope/branches/2.10/lib/python/ZPublisher/BaseRequest.py

-=-
Modified: Zope/branches/2.10/doc/CHANGES.txt
===================================================================
--- Zope/branches/2.10/doc/CHANGES.txt	2006-09-23 17:33:44 UTC (rev 70356)
+++ Zope/branches/2.10/doc/CHANGES.txt	2006-09-24 17:59:04 UTC (rev 70357)
@@ -10,6 +10,8 @@
 
       - Call setDefaultSkin on new requests created as the result of
         ConflictError retries.
+
+      - Collector #2187: PUT_factory broken
       
   Zope 2.10.0 beta 2 (2006/09/17)
 

Modified: Zope/branches/2.10/lib/python/ZPublisher/BaseRequest.py
===================================================================
--- Zope/branches/2.10/lib/python/ZPublisher/BaseRequest.py	2006-09-23 17:33:44 UTC (rev 70356)
+++ Zope/branches/2.10/lib/python/ZPublisher/BaseRequest.py	2006-09-24 17:59:04 UTC (rev 70357)
@@ -72,37 +72,41 @@
         if name[:1]=='_':
             raise Forbidden("Object name begins with an underscore at: %s" % URL)
 
-        try:
-            if hasattr(object,'__bobo_traverse__'):
+        
+        if hasattr(object,'__bobo_traverse__'):
+            try:
                 subobject=object.__bobo_traverse__(request, name)
                 if type(subobject) is type(()) and len(subobject) > 1:
                     # Add additional parents into the path
-                    # XXX This needs handling. Check the publish refactor branch...
-                    parents[-1:] = list(subobject[:-1])
-                    object, subobject = subobject[-2:]
+                    # XXX There are no tests for this:
+                    request['PARENTS'][-1:] = list(subobject[:-1])
+                    object, subobject = subobject[-2:]            
+            except (AttributeError, KeyError, NotFound), e:
+                # Try to find a view
+                subobject = queryMultiAdapter((object, request), Interface, name)                
+                if subobject is not None:
+                    # OFS.Application.__bobo_traverse__ calls
+                    # REQUEST.RESPONSE.notFoundError which sets the HTTP
+                    # status code to 404
+                    request.response.setStatus(200)
+                    # We don't need to do the docstring security check
+                    # for views, so lets skip it and return the object here.
+                    return subobject.__of__(object)
+                # No view found. Reraise the error raised by __bobo_traverse__
+                raise e
+        else:
+            # No __bobo_traverse__
+            # Try with an unacquired attribute:
+            if hasattr(aq_base(object), name):
+                subobject = getattr(object, name)
             else:
-                # Try getting unacquired attributes:
-                if hasattr(aq_base(object), name):
-                    subobject = getattr(object, name)
-                else:
-                    subobject=object[name]                    
-             
-        except (AttributeError, KeyError, NotFound), e:
-            # Nothing was found with __bobo_traverse__ or directly on
-            # the object. We try to fall back to a view:
-            subobject = queryMultiAdapter((object, request), Interface, name)                
-            if subobject is not None:
-                # OFS.Application.__bobo_traverse__ calls
-                # REQUEST.RESPONSE.notFoundError which sets the HTTP
-                # status code to 404
-                request.response.setStatus(200)
-                # We don't need to do the docstring security check
-                # for views, so lets skip it and return the object here.
-                return subobject.__of__(object)
+                # We try to fall back to a view:
+                subobject = queryMultiAdapter((object, request), Interface, name)                
+                if subobject is not None:
+                    return subobject.__of__(object)
             
-            # And lastly, of there is no view, try acquired attributes, but
-            # only if there is no __bobo_traverse__:
-            if not hasattr(object,'__bobo_traverse__'):
+                # And lastly, of there is no view, try acquired attributes, but
+                # only if there is no __bobo_traverse__:
                 try:
                     subobject=getattr(object, name)
                     # Again, clear any error status created by __bobo_traverse__
@@ -111,8 +115,11 @@
                     return subobject
                 except AttributeError:
                     pass
-            raise e
 
+                # Lastly we try with key access:
+                subobject = object[name]
+                
+
         # Ensure that the object has a docstring, or that the parent
         # object has a pseudo-docstring for the object. Objects that
         # have an empty or missing docstring are not published.



More information about the Zope-Checkins mailing list