[Checkins] SVN: z3c.dav/trunk/src/z3c/dav/ Annotate the ObjectModifiedEvent with information about what changed during

Michael Kerrin michael.kerrin at openapp.ie
Sun Jun 24 13:59:10 EDT 2007


Log message for revision 77012:
  Annotate the ObjectModifiedEvent with information about what changed during
  a PROPPATCH request.
  

Changed:
  U   z3c.dav/trunk/src/z3c/dav/proppatch.py
  U   z3c.dav/trunk/src/z3c/dav/tests/test_proppatch.py

-=-
Modified: z3c.dav/trunk/src/z3c/dav/proppatch.py
===================================================================
--- z3c.dav/trunk/src/z3c/dav/proppatch.py	2007-06-24 17:53:12 UTC (rev 77011)
+++ z3c.dav/trunk/src/z3c/dav/proppatch.py	2007-06-24 17:59:09 UTC (rev 77012)
@@ -23,7 +23,7 @@
 import zope.event
 from zope import interface
 from zope import component
-from zope.lifecycleevent import ObjectModifiedEvent
+import zope.lifecycleevent
 
 import z3c.etree
 from zope.security.interfaces import Unauthorized
@@ -62,8 +62,9 @@
         propErrors = []
         # properties - list of all the properties that we handled correctly.
         properties = []
-        # changed - boolean indicating whether any content changed or not.
-        changed = False
+        # changedAttributes - list of IModificationDescription objects
+        #                     indicting what as changed during this request
+        changedAttributes = []
         for update in xmldata:
             if update.tag not in ("{DAV:}set", "{DAV:}remove"):
                 continue
@@ -77,9 +78,9 @@
             for prop in props:
                 try:
                     if update.tag == "{DAV:}set":
-                        changed |= self.handleSet(prop)
+                        changedAttributes.extend(self.handleSet(prop))
                     else: # update.tag == "{DAV:}remove"
-                        changed |= self.handleRemove(prop)
+                        changedAttributes.extend(self.handleRemove(prop))
                 except Unauthorized:
                     # If the use doesn't have the correct permission to modify
                     # a property then we need to re-raise the Unauthorized
@@ -102,8 +103,10 @@
 
             raise errors # this kills the current transaction.
 
-        if changed:
-            zope.event.notify(ObjectModifiedEvent(self.context))
+        if changedAttributes:
+            zope.event.notify(
+                zope.lifecycleevent.ObjectModifiedEvent(
+                    self.context, *changedAttributes))
 
         url = z3c.dav.utils.getObjectURL(self.context, self.request)
         response = z3c.dav.utils.Response(url)
@@ -117,7 +120,8 @@
 
         self.request.response.setStatus(207)
         self.request.response.setHeader("content-type", "application/xml")
-        return etree.tostring(multistatus())
+        ## Is UTF-8 encoding ok here or is there a better way of doing this.
+        return etree.tostring(multistatus(), encoding = "utf-8")
 
     def handleSet(self, prop):
         davprop, adapter = z3c.dav.properties.getProperty(
@@ -138,8 +142,9 @@
 
         if field.get(adapter) != value:
             field.set(adapter, value)
-            return True
-        return False
+            return [
+                zope.lifecycleevent.Attributes(davprop.iface, davprop.__name__)]
+        return []
 
     def handleRemove(self, prop):
         davprop = component.queryUtility(
@@ -155,6 +160,7 @@
 
         if deadproperties is not None and deadproperties.hasProperty(prop.tag):
             deadproperties.removeProperty(prop.tag)
-            return True
+            return [zope.lifecycleevent.Sequence(
+                z3c.dav.interfaces.IOpaquePropertyStorage, prop.tag)]
 
-        return False
+        return []

Modified: z3c.dav/trunk/src/z3c/dav/tests/test_proppatch.py
===================================================================
--- z3c.dav/trunk/src/z3c/dav/tests/test_proppatch.py	2007-06-24 17:53:12 UTC (rev 77011)
+++ z3c.dav/trunk/src/z3c/dav/tests/test_proppatch.py	2007-06-24 17:59:09 UTC (rev 77012)
@@ -29,7 +29,9 @@
 import zope.schema.interfaces
 from zope.traversing.browser.interfaces import IAbsoluteURL
 from zope.security.interfaces import Unauthorized
-from zope.lifecycleevent.interfaces import IObjectModifiedEvent
+from zope.lifecycleevent.interfaces import IObjectModifiedEvent, \
+     ISequence, IAttributes
+import zope.lifecycleevent
 
 import z3c.dav.coreproperties
 import z3c.dav.proppatch
@@ -119,11 +121,13 @@
 
     def handleSet(self, prop):
         self.setprops.append(prop.tag)
-        return True
+        # The unit tests have no idea where the property lives.
+        return [zope.lifecycleevent.Attributes(interface.Interface)]
 
     def handleRemove(self, prop):
         self.removeprops.append(prop.tag)
-        return True
+        # The unit tests have no idea where the property lives.
+        return [zope.lifecycleevent.Attributes(interface.Interface)]
 
 
 class PROPPATCHXmlParsing(unittest.TestCase):
@@ -493,7 +497,13 @@
         resource = Resource("Text Prop", 10)
 
         propp = z3c.dav.proppatch.PROPPATCH(resource, request)
-        self.assertEqual(propp.handleSet(propel), True)
+
+        propset = propp.handleSet(propel)
+        self.assertEqual(len(propset), 1)
+        self.assertEqual(IAttributes.providedBy(propset[0]), True)
+        self.assertEqual(propset[0].interface, IExamplePropertyStorage)
+        self.assertEqual(propset[0].attributes, ("exampletextprop",))
+
         self.assertEqual(resource.text, "Example Text Prop")
 
     def test_handleSetProperty_samevalue(self):
@@ -506,7 +516,7 @@
         resource = Resource("Text Prop", 10)
 
         propp = z3c.dav.proppatch.PROPPATCH(resource, request)
-        self.assertEqual(propp.handleSet(propel), False)
+        self.assertEqual(propp.handleSet(propel), [])
         self.assertEqual(resource.text, "Text Prop")
 
     def test_handleSet_forbidden_property(self):
@@ -575,7 +585,7 @@
         resource = Resource("Text Prop", 10)
 
         propp = z3c.dav.proppatch.PROPPATCH(resource, request)
-        self.assertEqual(propp.handleRemove(propel), False)
+        self.assertEqual(propp.handleRemove(propel), [])
 
     def test_event_onsetProperty(self):
         request = TestRequest(
@@ -718,7 +728,7 @@
         resource = Resource("Text Prop", 10)
 
         propp = z3c.dav.proppatch.PROPPATCH(resource, request)
-        self.assertEqual(propp.handleRemove(propel), False)
+        self.assertEqual(propp.handleRemove(propel), [])
 
     def test_remove_not_there(self):
         etree = z3c.etree.getEngine()
@@ -730,7 +740,7 @@
         resource = Resource("Text Prop", 10)
 
         propp = z3c.dav.proppatch.PROPPATCH(resource, request)
-        self.assertEqual(propp.handleRemove(propel), False)
+        self.assertEqual(propp.handleRemove(propel), [])
         self.assertEqual(self.events, [])
 
     def test_remove_prop(self):
@@ -751,7 +761,12 @@
 
         propp = z3c.dav.proppatch.PROPPATCH(resource, request)
 
-        self.assertEqual(propp.handleRemove(propel), True)
+        removed = propp.handleRemove(propel)
+        self.assertEqual(len(removed), 1)
+        self.assertEqual(ISequence.providedBy(removed[0]), True)
+        self.assertEqual(
+            removed[0].interface, z3c.dav.interfaces.IOpaquePropertyStorage)
+        self.assertEqual(removed[0].keys, ("{example:}exampledeadprop",))
         self.assertEqual(deadprops.hasProperty(testprop), False)
 
     def test_event_on_remove_property(self):



More information about the Checkins mailing list