[CalendarServer-changes] [10671] CalendarServer/trunk/twext/who/xml.py
source_changes at macosforge.org
source_changes at macosforge.org
Fri Feb 8 18:00:20 PST 2013
Revision: 10671
http://trac.calendarserver.org//changeset/10671
Author: wsanchez at apple.com
Date: 2013-02-08 18:00:20 -0800 (Fri, 08 Feb 2013)
Log Message:
-----------
add parseRecordNode()
Modified Paths:
--------------
CalendarServer/trunk/twext/who/xml.py
Modified: CalendarServer/trunk/twext/who/xml.py
===================================================================
--- CalendarServer/trunk/twext/who/xml.py 2013-02-09 00:53:23 UTC (rev 10670)
+++ CalendarServer/trunk/twext/who/xml.py 2013-02-09 02:00:20 UTC (rev 10671)
@@ -44,6 +44,30 @@
##
+# Exceptions
+##
+
+class ParseError(RuntimeError):
+ """
+ Parse error.
+ """
+ def __init__(self, token):
+ RuntimeError.__init__(self, token)
+ self.token = token
+
+class UnknownRecordTypeParseError(ParseError):
+ """
+ Unknown record type.
+ """
+
+class UnknownFieldNameParseError(ParseError):
+ """
+ Unknown field name.
+ """
+
+
+
+##
# Data type extentions
##
@@ -228,11 +252,8 @@
if directoryNode.tag != self.element.directory.value:
raise DirectoryServiceError("Incorrect root element: %s" % (directoryNode.tag,))
- def getAttribute(node, name):
- return node.get(name, "").encode("utf-8")
+ realmName = directoryNode.get(self.attribute.realm.value, "").encode("utf-8")
- realmName = getAttribute(directoryNode, self.attribute.realm.value)
-
if not realmName:
raise DirectoryServiceError("No realm name.")
@@ -243,43 +264,13 @@
records = set()
for recordNode in directoryNode.getchildren():
- recordTypeAttribute = getAttribute(recordNode, self.attribute.recordType.value)
- if recordTypeAttribute:
- try:
- recordType = self.value.lookupByValue(recordTypeAttribute).recordType
- except (ValueError, AttributeError):
- unknownRecordTypes.add(recordTypeAttribute)
- continue
- else:
- recordType = self.recordType.user
+ try:
+ records.add(self.parseRecordNode(recordNode))
+ except UnknownRecordTypeParseError, e:
+ unknownRecordTypes.add(e.token)
+ except UnknownFieldNameParseError, e:
+ unknownFieldNames.add(e.token)
- fields = {}
- fields[self.fieldName.recordType] = recordType
-
- for fieldNode in recordNode.getchildren():
- try:
- fieldElement = self.element.lookupByValue(fieldNode.tag)
- except ValueError:
- unknownFieldElements.add(fieldNode.tag)
- continue
-
- try:
- fieldName = fieldElement.fieldName
- except AttributeError:
- unknownFieldNames.add(fieldNode.tag)
- continue
-
- value = fieldNode.text.encode("utf-8")
-
- if self.fieldName.isMultiValue(fieldName):
- values = fields.setdefault(fieldName, [])
- values.append(value)
- else:
- fields[fieldName] = value
-
-
- records.add(DirectoryRecord(self, fields))
-
#
# Store results
#
@@ -314,6 +305,41 @@
return etree
+ def parseRecordNode(self, recordNode):
+ recordTypeAttribute = recordNode.get(self.attribute.recordType.value, "").encode("utf-8")
+ if recordTypeAttribute:
+ try:
+ recordType = self.value.lookupByValue(recordTypeAttribute).recordType
+ except (ValueError, AttributeError):
+ raise UnknownRecordTypeParseError(recordTypeAttribute)
+ else:
+ recordType = self.recordType.user
+
+ fields = {}
+ fields[self.fieldName.recordType] = recordType
+
+ for fieldNode in recordNode.getchildren():
+ try:
+ fieldElement = self.element.lookupByValue(fieldNode.tag)
+ except ValueError:
+ raise UnknownFieldNameParseError(fieldNode.tag)
+
+ try:
+ fieldName = fieldElement.fieldName
+ except AttributeError:
+ raise UnknownFieldNameParseError(fieldNode.tag)
+
+ value = fieldNode.text.encode("utf-8")
+
+ if self.fieldName.isMultiValue(fieldName):
+ values = fields.setdefault(fieldName, [])
+ values.append(value)
+ else:
+ fields[fieldName] = value
+
+ return DirectoryRecord(self, fields)
+
+
def flush(self):
self._realmName = None
self._unknownRecordTypes = None
@@ -370,15 +396,19 @@
self.flush()
etree = self.loadRecords(loadNow=True)
+ recordsByUID = dict(((record.uid, record) for record in records))
+
directoryNode = etree.getroot()
- for record in records:
- for recordNode in directoryNode.getchildren():
- raise NotImplementedError()
+ for recordNode in directoryNode.getchildren():
+ uidNode = recordNode.find(self.element.uid.value)
+ if uidNode is None:
+ raise NotImplementedError("No UID node")
- raise NotImplementedError()
+ record = recordsByUID.get(uidNode.text, None)
- raise NotImplementedError()
+ if record:
+ raise NotImplementedError("Update record: %s" % (record,))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130208/0f77c93f/attachment-0001.html>
More information about the calendarserver-changes
mailing list