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

source_changes at macosforge.org source_changes at macosforge.org
Mon Feb 11 14:43:01 PST 2013


Revision: 10687
          http://trac.calendarserver.org//changeset/10687
Author:   wsanchez at apple.com
Date:     2013-02-11 14:43:01 -0800 (Mon, 11 Feb 2013)
Log Message:
-----------
Implement removeRecords()

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 22:34:49 UTC (rev 10686)
+++ CalendarServer/trunk/twext/who/test/test_xml.py	2013-02-11 22:43:01 UTC (rev 10687)
@@ -341,18 +341,14 @@
         service.flush()
         self.assertEquals((yield service.recordWithUID("__wsanchez__")), None)
 
-    test_removeRecord.todo = "Not implemented."
 
-
     def test_removeRecordNoExist(self):
         service = self._testService()
 
         return service.removeRecords(("__plugh__",))
 
-    test_removeRecordNoExist.todo = "Not implemented."
 
 
-
 class DirectoryRecordTest(BaseTest, test_directory.DirectoryRecordTest):
     @inlineCallbacks
     def test_members(self):

Modified: CalendarServer/trunk/twext/who/xml.py
===================================================================
--- CalendarServer/trunk/twext/who/xml.py	2013-02-11 22:34:49 UTC (rev 10686)
+++ CalendarServer/trunk/twext/who/xml.py	2013-02-11 22:43:01 UTC (rev 10687)
@@ -337,6 +337,14 @@
         return DirectoryRecord(self, fields)
 
 
+    def _uidForRecordNode(self, recordNode):
+        uidNode = recordNode.find(self.element.uid.value)
+        if uidNode is None:
+            raise NotImplementedError("No UID node")
+
+        return uidNode.text
+
+
     def flush(self):
         self._realmName            = None
         self._unknownRecordTypes   = None
@@ -390,15 +398,10 @@
 
 
     def updateRecords(self, records, create=False):
-        #
         # Index the records to update by UID
-        #
         recordsByUID = dict(((record.uid, record) for record in records))
 
-        #
-        # Index the record type -> attribute and field name -> element
-        # mappings.
-        #
+        # Index the record type -> attribute mappings.
         recordTypes = {}
         for valueName in self.value.iterconstants():
             recordType = getattr(valueName, "recordType", None)
@@ -406,6 +409,7 @@
                 recordTypes[recordType] = valueName.value
         del valueName
 
+        # Index the field name -> element mappings.
         fieldNames = {}
         for elementName in self.element.iterconstants():
             fieldName = getattr(elementName, "fieldName", None)
@@ -413,12 +417,7 @@
                 fieldNames[fieldName] = elementName.value
         del elementName
 
-        #
-        # Drop cached data and load the XML DOM.
-        #
-        self.flush()
-        etree = self.loadRecords(loadNow=True)
-        directoryNode = etree.getroot()
+        directoryNode = self._directoryNodeForEditing()
 
         def fillRecordNode(recordNode, record):
             for (name, value) in record.fields.items():
@@ -445,21 +444,17 @@
                     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:
-                raise NotImplementedError("No UID node")
+            uid = self._uidForRecordNode(recordNode)
 
-            record = recordsByUID.get(uidNode.text, None)
+            record = recordsByUID.get(uid, None)
 
             if record:
                 recordNode.clear()
                 fillRecordNode(recordNode, record)
-                del recordsByUID[record.uid]
+                del recordsByUID[uid]
 
         if recordsByUID:
             if not create:
@@ -470,6 +465,35 @@
                 fillRecordNode(recordNode, record)
                 directoryNode.append(recordNode)
 
+        self._writeDirectoryNode(directoryNode)
+
+
+    def removeRecords(self, uids):
+        directoryNode = self._directoryNodeForEditing()
+
+        #
+        # Walk through the record nodes in the XML tree and start
+        # zapping.
+        #
+        for recordNode in directoryNode.getchildren():
+            uid = self._uidForRecordNode(recordNode)
+
+            if uid in uids:
+                directoryNode.remove(recordNode)
+
+        self._writeDirectoryNode(directoryNode)
+
+
+    def _directoryNodeForEditing(self):
+        """
+        Drop cached data and load the XML DOM.
+        """
+        self.flush()
+        etree = self.loadRecords(loadNow=True)
+        return etree.getroot()
+
+
+    def _writeDirectoryNode(self, directoryNode):
         self.filePath.setContent(etreeToString(directoryNode))
         self.flush()
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130211/d8288ed4/attachment-0001.html>


More information about the calendarserver-changes mailing list