[Checkins] SVN: z3c.dav/trunk/src/z3c/dav/exceptions/ Only respond with a 207 multistatus response when there are more then one

Michael Kerrin michael.kerrin at openapp.ie
Sun Jun 10 14:53:09 EDT 2007


Log message for revision 76590:
  Only respond with a 207 multistatus response when there are more then one
  errors or else the context of the only error is not the context on the
  original view.
  

Changed:
  U   z3c.dav/trunk/src/z3c/dav/exceptions/__init__.py
  U   z3c.dav/trunk/src/z3c/dav/exceptions/tests/test_multiviews.py

-=-
Modified: z3c.dav/trunk/src/z3c/dav/exceptions/__init__.py
===================================================================
--- z3c.dav/trunk/src/z3c/dav/exceptions/__init__.py	2007-06-10 18:52:48 UTC (rev 76589)
+++ z3c.dav/trunk/src/z3c/dav/exceptions/__init__.py	2007-06-10 18:53:09 UTC (rev 76590)
@@ -27,6 +27,7 @@
 from zope import component
 import zope.publisher.interfaces.http
 from zope.app.http.interfaces import IHTTPException
+import zope.app.publisher.browser
 
 import z3c.dav.interfaces
 import z3c.dav.utils
@@ -93,11 +94,24 @@
         etree = z3c.etree.getEngine()
         multistatus = z3c.dav.utils.MultiStatus()
 
+        if len(self.error.errors) == 1 and \
+               self.error.errors[0].resource == self.error.context:
+            # If have only one error and the context on which we raised the
+            # exception, then we just try and view the default view of the
+            # error.
+            error = self.error.errors[0]
+            name = zope.app.publisher.browser.queryDefaultViewName(
+                error, self.request)
+            if name is not None:
+                view = component.queryMultiAdapter(
+                    (error, self.request), name = name)
+                return view()
+
         seenContext = False
         for error in self.error.errors:
             if error.resource == self.error.context:
                 seenContext = True
-            
+
             davwidget = component.getMultiAdapter(
                 (error, self.request), z3c.dav.interfaces.IDAVErrorWidget)
 
@@ -112,8 +126,7 @@
 
         if not seenContext:
             response = z3c.dav.utils.Response(
-                z3c.dav.utils.getObjectURL(
-                    self.error.context, self.request))
+                z3c.dav.utils.getObjectURL(self.error.context, self.request))
             response.status = 424 # Failed Dependency
             multistatus.responses.append(response)
 

Modified: z3c.dav/trunk/src/z3c/dav/exceptions/tests/test_multiviews.py
===================================================================
--- z3c.dav/trunk/src/z3c/dav/exceptions/tests/test_multiviews.py	2007-06-10 18:52:48 UTC (rev 76589)
+++ z3c.dav/trunk/src/z3c/dav/exceptions/tests/test_multiviews.py	2007-06-10 18:53:09 UTC (rev 76590)
@@ -25,6 +25,7 @@
 from zope import schema
 from zope import component
 from zope.traversing.browser.interfaces import IAbsoluteURL
+from zope.component.interfaces import IDefaultViewName
 
 import z3c.dav.publisher
 from z3c.etree.testing import etreeSetup, etreeTearDown, assertXMLEqual
@@ -170,6 +171,15 @@
                             (z3c.dav.interfaces.IPropertyNotFound,
                              z3c.dav.interfaces.IWebDAVRequest))
 
+        gsm.registerAdapter(z3c.dav.exceptions.AlreadyLockedErrorView,
+                            (z3c.dav.interfaces.IAlreadyLocked,
+                             z3c.dav.interfaces.IWebDAVRequest),
+                            name = u"index.html")
+        gsm.registerAdapter(u"index.html",
+                            (z3c.dav.interfaces.IAlreadyLocked,
+                             z3c.dav.interfaces.IWebDAVRequest),
+                            IDefaultViewName)
+
     def tearDown(self):
         super(TestMSErrorView, self).tearDown()
 
@@ -186,6 +196,15 @@
                               (z3c.dav.interfaces.IPropertyNotFound,
                                z3c.dav.interfaces.IWebDAVRequest))
 
+        gsm.unregisterAdapter(z3c.dav.exceptions.AlreadyLockedErrorView,
+                              (z3c.dav.interfaces.IAlreadyLocked,
+                               z3c.dav.interfaces.IWebDAVRequest),
+                              name = u"index.html")
+        gsm.unregisterAdapter(u"index.html",
+                              (z3c.dav.interfaces.IAlreadyLocked,
+                               z3c.dav.interfaces.IWebDAVRequest),
+                              IDefaultViewName)
+
     def test_multi_resource_error_interface(self):
         resource = Resource()
         error = z3c.dav.interfaces.WebDAVErrors(resource)
@@ -268,7 +287,20 @@
   <ns0:status>HTTP/1.1 424 Failed Dependency</ns0:status>
 </ns0:response></ns0:multistatus>""")
 
+    def test_one_error_default_view(self):
+        resource = Resource()
+        error = z3c.dav.interfaces.WebDAVErrors(resource)
+        error.append(
+            z3c.dav.interfaces.AlreadyLocked(resource, "Resource is locked"))
+        request = TestRequest()
 
+        view = z3c.dav.exceptions.MultiStatusErrorView(error, request)
+        result = view()
+
+        self.assertEqual(request.response.getStatus(), 423)
+        self.assertEqual(result, "")
+
+
 def test_suite():
     suite = unittest.TestSuite((
         unittest.makeSuite(TestPropstatErrorView),



More information about the Checkins mailing list