[Zope-Checkins] SVN: Zope/trunk/ Port ZPublisher fix from 2.9 branch r70237:70238

Alec Mitchell apm13 at columbia.edu
Tue Sep 19 14:39:31 EDT 2006


Log message for revision 70241:
  Port ZPublisher fix from 2.9 branch r70237:70238
  

Changed:
  U   Zope/trunk/doc/CHANGES.txt
  U   Zope/trunk/lib/python/ZPublisher/Publish.py
  U   Zope/trunk/lib/python/ZPublisher/tests/testPublish.py

-=-
Modified: Zope/trunk/doc/CHANGES.txt
===================================================================
--- Zope/trunk/doc/CHANGES.txt	2006-09-19 18:33:44 UTC (rev 70240)
+++ Zope/trunk/doc/CHANGES.txt	2006-09-19 18:39:30 UTC (rev 70241)
@@ -34,6 +34,9 @@
 
     Bugs Fixed
 
+      - Call setDefaultSkin on new requests created as the result of
+        ConflictError retries.
+
       - Collector #2155: Fix wrong parameter being passed to
         logger's error() method, with tests.
 

Modified: Zope/trunk/lib/python/ZPublisher/Publish.py
===================================================================
--- Zope/trunk/lib/python/ZPublisher/Publish.py	2006-09-19 18:33:44 UTC (rev 70240)
+++ Zope/trunk/lib/python/ZPublisher/Publish.py	2006-09-19 18:39:30 UTC (rev 70241)
@@ -158,6 +158,8 @@
             # Only reachable if Retry is raised and request supports retry.
             newrequest=request.retry()
             request.close()  # Free resources held by the request.
+            # Set the default layer/skin on the newly generated request
+            setDefaultSkin(newrequest)
             try:
                 return publish(newrequest, module_name, after_list, debug)
             finally:

Modified: Zope/trunk/lib/python/ZPublisher/tests/testPublish.py
===================================================================
--- Zope/trunk/lib/python/ZPublisher/tests/testPublish.py	2006-09-19 18:33:44 UTC (rev 70240)
+++ Zope/trunk/lib/python/ZPublisher/tests/testPublish.py	2006-09-19 18:39:30 UTC (rev 70241)
@@ -1,3 +1,5 @@
+from zope.app.publication.browser import setDefaultSkin
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 from ZPublisher import Retry
 from ZODB.POSException import ConflictError
 
@@ -118,6 +120,14 @@
         r.retry_count = self.retry_count
         return r
 
+class RequestWithSkinCheck(Request):
+    def traverse(self, path, validated_hook):
+        if IDefaultBrowserLayer.providedBy(self):
+            return Object()
+        else:
+            tracer.exceptions['__call__'] = [ValueError]
+            return Object()
+
 module_name = __name__
 after_list = [None]
 
@@ -263,6 +273,56 @@
     raising ConflictError from zpublisher_exception_hook
     abort
 
+    The request generator applies the default skin layer to the request.
+    We have a specially crafted request that tests this.  If the
+    request does not have the required interface it raises an
+    ValueError.  Let's see that this works as expected
+
+    >>> tracer.reset()
+    >>> request = RequestWithSkinCheck()
+    >>> setDefaultSkin(request)
+    >>> response = publish(request, module_name, after_list)
+    >>> tracer.showTracedPath()
+    begin
+    __call__
+    commit
+
+    Retries generate new request objects, the publisher needs to
+    ensure that the skin layer is applied to those as well. If the
+    skin layer is not applied to subsequent requests, an ValueError
+    would be raised here.
+
+    >>> tracer.reset()
+    >>> tracer.exceptions['commit'] = [ConflictError, ConflictError,
+    ...                                  ConflictError, ConflictError]
+    >>> request = RequestWithSkinCheck()
+    >>> setDefaultSkin(request)
+    >>> response = publish(request, module_name, after_list)
+    Traceback (most recent call last):
+    ...
+    ConflictError: database conflict error
+    >>> tracer.showTracedPath()
+    begin
+    __call__
+    commit
+    raising ConflictError from commit
+    abort
+    begin
+    __call__
+    commit
+    raising ConflictError from commit
+    abort
+    begin
+    __call__
+    commit
+    raising ConflictError from commit
+    abort
+    begin
+    __call__
+    commit
+    raising ConflictError from commit
+    abort
+
     """
     pass
 



More information about the Zope-Checkins mailing list