[CalendarServer-changes] [10684] CalendarServer/trunk/twext/who

source_changes at macosforge.org source_changes at macosforge.org
Mon Feb 11 13:45:31 PST 2013


Revision: 10684
          http://trac.calendarserver.org//changeset/10684
Author:   wsanchez at apple.com
Date:     2013-02-11 13:45:31 -0800 (Mon, 11 Feb 2013)
Log Message:
-----------
Implement adding new records via updateRecords().

Modified Paths:
--------------
    CalendarServer/trunk/twext/who/test/test_xml.py
    CalendarServer/trunk/twext/who/xml.py

Modified: CalendarServer/trunk/twext/who/test/test_xml.py
===================================================================
--- CalendarServer/trunk/twext/who/test/test_xml.py	2013-02-11 21:28:33 UTC (rev 10683)
+++ CalendarServer/trunk/twext/who/test/test_xml.py	2013-02-11 21:45:31 UTC (rev 10684)
@@ -312,9 +312,7 @@
         record = (yield service.recordWithUID("__plugh__"))
         self.assertEquals(set(record.shortNames), set(("plugh",)))
 
-    test_addRecord.todo = "Not implemented."
 
-
     def test_addRecordNoCreate(self):
         service = self._testService()
 

Modified: CalendarServer/trunk/twext/who/xml.py
===================================================================
--- CalendarServer/trunk/twext/who/xml.py	2013-02-11 21:28:33 UTC (rev 10683)
+++ CalendarServer/trunk/twext/who/xml.py	2013-02-11 21:45:31 UTC (rev 10684)
@@ -390,8 +390,6 @@
 
 
     def updateRecords(self, records, create=False):
-        self.flush()
-
         #
         # Index the records to update by UID
         #
@@ -416,12 +414,43 @@
         del elementName
 
         #
-        # Walk through the record nodes in the XML tree
+        # Drop cached data and load the XML DOM.
         #
+        self.flush()
+
         etree = self.loadRecords(loadNow=True)
 
         directoryNode = etree.getroot()
 
+        def fillRecordNode(recordNode, record):
+            for (name, value) in record.fields.items():
+                if name == self.fieldName.recordType:
+                    if value in recordTypes:
+                        recordNode.set(self.attribute.recordType.value, recordTypes[value])
+                    else:
+                        raise AssertionError("Unknown record type: %r" % (value,))
+
+                else:
+                    if name in fieldNames:
+                        tag = fieldNames[name]
+
+                        if self.fieldName.isMultiValue(name):
+                            values = value
+                        else:
+                            values = (value,)
+
+                        for value in values:
+                            subNode = XMLElement(tag)
+                            subNode.text = value
+                            recordNode.append(subNode)
+
+                    else:
+                        raise AssertionError("Unknown field name: %r" % (name,))
+
+        #
+        # Walk through the record nodes in the XML tree and apply
+        # updates.
+        #
         for recordNode in directoryNode.getchildren():
             uidNode = recordNode.find(self.element.uid.value)
             if uidNode is None:
@@ -431,38 +460,17 @@
 
             if record:
                 recordNode.clear()
-
-                for (name, value) in record.fields.items():
-                    if name == self.fieldName.recordType:
-                        if value in recordTypes:
-                            recordNode.set(self.attribute.recordType.value, recordTypes[value])
-                        else:
-                            raise AssertionError("Unknown record type: %r" % (value,))
-
-                    else:
-                        if name in fieldNames:
-                            tag = fieldNames[name]
-
-                            if self.fieldName.isMultiValue(name):
-                                values = value
-                            else:
-                                values = (value,)
-
-                            for value in values:
-                                subNode = XMLElement(tag)
-                                subNode.text = value
-                                recordNode.append(subNode)
-
-                        else:
-                            raise AssertionError("Unknown field name: %r" % (name,))
-
+                fillRecordNode(recordNode, record)
                 del recordsByUID[record.uid]
 
         if recordsByUID:
             if not create:
                 return fail(NoSuchRecordError(recordsByUID.keys()))
 
-            raise NotImplementedError("Add new records.")
+            for uid, record in recordsByUID.items():
+                recordNode = XMLElement(self.element.record.value)
+                fillRecordNode(recordNode, record)
+                directoryNode.append(recordNode)
 
         self.filePath.setContent(etreeToString(directoryNode))
         self.flush()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130211/c7e142ba/attachment.html>


More information about the calendarserver-changes mailing list