[CalendarServer-changes] [7201] CalDAVTester/trunk/src

source_changes at macosforge.org source_changes at macosforge.org
Wed Mar 16 18:06:04 PDT 2011


Revision: 7201
          http://trac.macosforge.org/projects/calendarserver/changeset/7201
Author:   cdaboo at apple.com
Date:     2011-03-16 18:06:04 -0700 (Wed, 16 Mar 2011)
Log Message:
-----------
Allow for grabbing multiple elements.

Modified Paths:
--------------
    CalDAVTester/trunk/src/caldavtest.py
    CalDAVTester/trunk/src/request.py

Modified: CalDAVTester/trunk/src/caldavtest.py
===================================================================
--- CalDAVTester/trunk/src/caldavtest.py	2011-03-17 00:43:11 UTC (rev 7200)
+++ CalDAVTester/trunk/src/caldavtest.py	2011-03-17 01:06:04 UTC (rev 7201)
@@ -559,14 +559,18 @@
                         self.manager.server_info.addextrasubs({variable: propvalue.encode("utf-8")})
 
         if req.grabelement:
-            for elementpath, variable in req.grabelement:
+            for elementpath, variables in req.grabelement:
                 # grab the property here
-                elementvalue = self.extractElement(elementpath, respdata)
-                if elementvalue == None:
+                elementvalues = self.extractElements(elementpath, respdata)
+                if elementvalues == None:
                     result = False
-                    resulttxt += "\Element %s was not extracted from response\n" % (elementpath,)
+                    resulttxt += "\nElement %s was not extracted from response\n" % (elementpath,)
+                elif len(variables) != len(elementvalues):
+                    result = False
+                    resulttxt += "\n%d found but expecting %d for element %s from response\n" % (len(elementvalues), len(variables), elementpath,)
                 else:
-                    self.manager.server_info.addextrasubs({variable: elementvalue.encode("utf-8")})
+                    for variable, elementvalue in zip(variables, elementvalues):
+                        self.manager.server_info.addextrasubs({variable: elementvalue.encode("utf-8") if elementvalue else ""})
 
         return result, resulttxt, response, respdata
 
@@ -695,6 +699,32 @@
         else:
             return None
 
+    def extractElements(self, elementpath, respdata):
+
+        try:
+            tree = ElementTree()
+            tree.parse(StringIO(respdata))
+        except:
+            return None
+        
+        # Strip off the top-level item
+        if elementpath[0] == '/':
+            elementpath = elementpath[1:]
+            splits = elementpath.split('/', 1)
+            root = splits[0]
+            if tree.getroot().tag != root:
+                return None
+            elif len(splits) == 1:
+                return tree.getroot().text
+            else:
+                elementpath = splits[1]
+                
+        e = tree.findall(elementpath)
+        if e is not None:
+            return [item.text for item in e]
+        else:
+            return None
+
     def postgresInit(self):
         """
         Initialize postgres statement counter

Modified: CalDAVTester/trunk/src/request.py
===================================================================
--- CalDAVTester/trunk/src/request.py	2011-03-17 00:43:11 UTC (rev 7200)
+++ CalDAVTester/trunk/src/request.py	2011-03-17 01:06:04 UTC (rev 7201)
@@ -331,7 +331,7 @@
             elif child.tag == src.xmlDefs.ELEMENT_GRABPROPERTY:
                 self.parseGrab(child, self.grabproperty)
             elif child.tag == src.xmlDefs.ELEMENT_GRABELEMENT:
-                self.parseGrab(child, self.grabelement)
+                self.parseMultiGrab(child, self.grabelement)
 
     def parseFeatures(self, node, require=True):
         for child in node.getchildren():
@@ -376,7 +376,22 @@
         
         if (name is not None) and (variable is not None):
             appendto.append((name, variable))
-            
+
+    def parseMultiGrab(self, node, appendto):
+        
+        name = None
+        variable = None
+        for child in node.getchildren():
+            if child.tag in (src.xmlDefs.ELEMENT_NAME, src.xmlDefs.ELEMENT_PROPERTY):
+                name = self.manager.server_info.subs(child.text.encode("utf-8"))
+            elif child.tag == src.xmlDefs.ELEMENT_VARIABLE:
+                if variable is None:
+                    variable = []
+                variable.append(self.manager.server_info.subs(child.text.encode("utf-8")))
+        
+        if (name is not None) and (variable is not None):
+            appendto.append((name, variable))
+    
 class data( object ):
     """
     Represents the data/body portion of an HTTP request.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110316/164acd1e/attachment-0001.html>


More information about the calendarserver-changes mailing list