[Checkins] SVN: zope.app.dav/trunk/ Avoid creating a DAV namespace adapter per property in PROPPATCH.

Tres Seaver tseaver at palladion.com
Thu Mar 11 17:33:15 EST 2010


Log message for revision 109914:
  Avoid creating a DAV namespace adapter per property in PROPPATCH.
  
  o Create only one per namespace in a given request.  See LP #98454.
   
   
   3.5.2 (2010-01-08)
  

Changed:
  U   zope.app.dav/trunk/CHANGES.txt
  U   zope.app.dav/trunk/src/zope/app/dav/proppatch.py
  U   zope.app.dav/trunk/src/zope/app/dav/tests/test_proppatch.py

-=-
Modified: zope.app.dav/trunk/CHANGES.txt
===================================================================
--- zope.app.dav/trunk/CHANGES.txt	2010-03-11 18:25:40 UTC (rev 109913)
+++ zope.app.dav/trunk/CHANGES.txt	2010-03-11 22:33:15 UTC (rev 109914)
@@ -5,7 +5,8 @@
 3.5.3 (unreleased)
 ------------------
 
-- Nothing changed yet.
+- Avoid creating a DAV namespace adapter per property in PROPPATCH
+  (create only one per namespace in a given request).  See LP #98454.
 
 
 3.5.2 (2010-01-08)

Modified: zope.app.dav/trunk/src/zope/app/dav/proppatch.py
===================================================================
--- zope.app.dav/trunk/src/zope/app/dav/proppatch.py	2010-03-11 18:25:40 UTC (rev 109913)
+++ zope.app.dav/trunk/src/zope/app/dav/proppatch.py	2010-03-11 22:33:15 UTC (rev 109914)
@@ -10,30 +10,34 @@
 # FOR A PARTICULAR PURPOSE.
 ##############################################################################
 """WebDAV method PROPPATCH
-
-$Id$
 """
-__docformat__ = 'restructuredtext'
 
 from xml.dom import minidom
 
 import transaction
-from zope.component import getUtilitiesFor, queryUtility
-from zope.schema import getFieldNamesInOrder, getFields
-from zope.app.container.interfaces import IReadContainer
+from zope.component import getUtilitiesFor
+from zope.component import queryUtility
+from zope.schema import getFieldNamesInOrder
+from zope.schema import getFields
 from zope.publisher.http import status_reasons
-from zope.app.form.utility import setUpWidget, no_value
 from zope.traversing.browser.absoluteurl import absoluteURL
 
-from interfaces import IDAVNamespace, IDAVWidget
-from opaquenamespaces import IDAVOpaqueNamespaces
+from zope.app.container.interfaces import IReadContainer
+from zope.app.form.utility import no_value
+from zope.app.form.utility import setUpWidget
 
+from zope.app.dav.interfaces import IDAVNamespace
+from zope.app.dav.interfaces import IDAVWidget
+from zope.app.dav.opaquenamespaces import IDAVOpaqueNamespaces
+
 class PROPPATCH(object):
-    """PROPPATCH handler for all objects"""
+    """PROPPATCH handler for all objects
+    """
 
     def __init__(self, context, request):
         self.context = context
         self.request = request
+        self._dav_ns_adapters = {}
         ct = request.getHeader('content-type', 'text/xml')
         if ';' in ct:
             parts = ct.split(';', 1)
@@ -55,6 +59,15 @@
                 _avail_props[ns] = list(oprops.keys())
         self.avail_props = _avail_props
 
+    def _getDAVAdapter(self, ns):
+        if ns not in self._dav_ns_adapters:
+            iface = queryUtility(IDAVNamespace, ns)
+            if iface:
+                adapter = self._dav_ns_adapters[ns] = iface(self.context)
+            else:
+                adapter = self._dav_ns_adapters[ns] = None
+        return self._dav_ns_adapters[ns]
+
     def PROPPATCH(self):
         if self.content_type not in ['text/xml', 'application/xml']:
             self.request.response.setStatus(400)
@@ -165,7 +178,8 @@
         if field.readonly:
             return 409 # RFC 2518 specifies 409 for readonly props
 
-        value = field.get(iface(self.context))
+        dav_adapter = self._getDAVAdapter(ns)
+        value = field.get(dav_adapter)
         if value is field.missing_value:
             value = no_value
         setUpWidget(self, prop.localName, field, IDAVWidget,
@@ -177,7 +191,7 @@
         if not widget.hasValidInput():
             return 409 # Didn't match the widget validation
 
-        if widget.applyChanges(iface(self.context)):
+        if widget.applyChanges(dav_adapter):
             return 200
 
         return 422 # Field didn't accept the value
@@ -200,13 +214,14 @@
         if field.readonly:
             return 409 # RFC 2518 specifies 409 for readonly props
 
+        dav_adapter = self._getDAVAdapter(ns)
         if field.required:
             if field.default is None:
                 return 409 # Clearing a required property is a conflict
             # Reset the field to the default if a value is required
-            field.set(iface(self.context), field.default)
+            field.set(dav_adapter, field.default)
             return 200
 
         # Reset the field to it's defined missing_value
-        field.set(iface(self.context), field.missing_value)
+        field.set(dav_adapter, field.missing_value)
         return 200

Modified: zope.app.dav/trunk/src/zope/app/dav/tests/test_proppatch.py
===================================================================
--- zope.app.dav/trunk/src/zope/app/dav/tests/test_proppatch.py	2010-03-11 18:25:40 UTC (rev 109913)
+++ zope.app.dav/trunk/src/zope/app/dav/tests/test_proppatch.py	2010-03-11 22:33:15 UTC (rev 109914)
@@ -12,11 +12,7 @@
 #
 ##############################################################################
 """Test the dav PROPPATCH interactions.
-
-$Id$
 """
-__docformat__ = 'restructuredtext'
-
 import unittest
 from StringIO import StringIO
 
@@ -42,7 +38,6 @@
 from zope.app.testing import ztapi
 from zope.app.component.testing import PlacefulSetup
 
-import zope.app.dav.tests
 from zope.app.dav.tests.unitfixtures import File, Folder, FooZPT
 from zope.app.dav import proppatch
 from zope.app.dav.interfaces import IDAVSchema, IDAVNamespace, IDAVWidget



More information about the checkins mailing list