[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