[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