[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