[Checkins] SVN: zope.webdav/trunk/src/zope/webdav/ When an error occurs when rendering a property for viewing

Michael Kerrin michael.kerrin at openapp.biz
Sun Aug 27 09:51:00 EDT 2006


Log message for revision 69795:
  When an error occurs when rendering a property for viewing
  which has no view, then we log the error with the IErrorReportingUtility
  for fixing, and set a status of 500 (Internal Server Error) for this
  property.
  

Changed:
  U   zope.webdav/trunk/src/zope/webdav/propfind.py
  U   zope.webdav/trunk/src/zope/webdav/tests/test_propfind.py

-=-
Modified: zope.webdav/trunk/src/zope/webdav/propfind.py
===================================================================
--- zope.webdav/trunk/src/zope/webdav/propfind.py	2006-08-27 13:45:42 UTC (rev 69794)
+++ zope.webdav/trunk/src/zope/webdav/propfind.py	2006-08-27 13:50:58 UTC (rev 69795)
@@ -41,6 +41,7 @@
 from zope import interface
 from zope import component
 from zope.app.container.interfaces import IReadContainer
+from zope.app.error.interfaces import IErrorReportingUtility
 
 from zope.etree.interfaces import IEtree
 import zope.webdav.utils
@@ -195,14 +196,20 @@
                 error_view = component.queryMultiAdapter(
                     (error, req), zope.webdav.interfaces.IDAVErrorWidget)
                 if error_view is None:
+                    ## An unexpected error occured here. This errr should be
+                    ## fixed. In order to easily debug the problem we will
+                    ## log the error with the ErrorReportingUtility
+                    errUtility = component.getUtility(IErrorReportingUtility)
+                    errUtility.raising(exc_info, req)
+                    propstat = response.getPropstat(500) # Internal Server Error
+                else:
+                    propstat = response.getPropstat(error_view.status)
                     ## XXX - needs testing
-                    raise exc_info[0], exc_info[1], exc_info[2]
+                    propstat.responsedescription += \
+                                                 error_view.propstatdescription
+                    response.responsedescription += \
+                                                 error_view.responsedescription
 
-                propstat = response.getPropstat(error_view.status)
-                ## XXX - needs testing
-                propstat.responsedescription += error_view.propstatdescription
-                response.responsedescription += error_view.responsedescription
-
                 rendered_el = etree.Element(prop.tag)
 
             propstat.properties.append(rendered_el)

Modified: zope.webdav/trunk/src/zope/webdav/tests/test_propfind.py
===================================================================
--- zope.webdav/trunk/src/zope/webdav/tests/test_propfind.py	2006-08-27 13:45:42 UTC (rev 69794)
+++ zope.webdav/trunk/src/zope/webdav/tests/test_propfind.py	2006-08-27 13:50:58 UTC (rev 69795)
@@ -29,6 +29,7 @@
 import zope.schema.interfaces
 from zope.traversing.browser.interfaces import IAbsoluteURL
 from zope.app.container.interfaces import IReadContainer
+from zope.app.error.interfaces import IErrorReportingUtility
 
 import zope.webdav.properties
 import zope.webdav.publisher
@@ -189,6 +190,8 @@
     "{DAVtest:}extratextprop", IExtraPropertyStorage)
 brokenProperty = zope.webdav.properties.DAVProperty(
     "{DAVtest:}brokenprop", IBrokenPropertyStorage)
+# this is a hack to make all the render all properties work as this broken
+# property then never shows up these tests responses.
 brokenProperty.restricted = True
 
 
@@ -371,6 +374,16 @@
                            zope.webdav.interfaces.IWebDAVRequest))
 
 
+class ErrorReportingUtility(object):
+    interface.implements(IErrorReportingUtility)
+
+    def __init__(self):
+        self.errors = []
+
+    def raising(self, exc_info, request):
+        self.errors.append((exc_info, request))
+
+
 class PROPFINDTestRender(unittest.TestCase, TestMultiStatusBody):
     # Test all the methods that render a resource into a `response' XML
     # element. We are going to need to register the DAV widgets for
@@ -378,9 +391,15 @@
 
     def setUp(self):
         propfindSetUp()
+        ## This is for the test_renderBrokenProperty
+        self.errUtility = ErrorReportingUtility()
+        component.getGlobalSiteManager().registerUtility(self.errUtility)
 
     def tearDown(self):
         propfindTearDown()
+        ## This is for the test_renderBrokenProperty
+        component.getGlobalSiteManager().unregisterUtility(self.errUtility)
+        del self.errUtility
 
     def test_renderPropnames(self):
         resource = Resource("some text", 10)
@@ -540,7 +559,26 @@
   <ns0:status xmlns:ns0="DAV:">HTTP/1.1 200 OK</ns0:status>
 </ns0:propstat></ns0:response>""")
 
+    def test_renderBrokenProperty(self):
+        resource = Resource("some text", 10)
+        request = zope.webdav.publisher.WebDAVRequest(StringIO(""), {})
+        propf = PROPFIND(None, None)
 
+        etree = component.getUtility(IEtree)
+        props = etree.fromstring("""<prop xmlns="DAV:" xmlns:D="DAVtest:">
+<D:brokenprop />
+</prop>""")
+        response = propf.renderSelectedProperties(resource, request, props)
+        response = response()
+
+        self.assertMSPropertyValue(response, "{DAVtest:}brokenprop",
+                                   status = 500)
+
+        # now check that the error reporting utility caught the error.
+        error = self.errUtility.errors[0]
+        self.assertEqual(isinstance(error[0][1], NotImplementedError), True)
+
+
 class PROPFINDRecuseTest(unittest.TestCase):
 
     def setUp(self):



More information about the Checkins mailing list