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

source_changes at macosforge.org source_changes at macosforge.org
Wed Mar 12 11:24:14 PDT 2014


Revision: 11896
          http://trac.calendarserver.org//changeset/11896
Author:   wsanchez at apple.com
Date:     2013-11-06 14:52:10 -0800 (Wed, 06 Nov 2013)
Log Message:
-----------
Use unicode for field values, except for GUID, which is a UUID.

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

Modified: CalendarServer/trunk/twext/who/directory.py
===================================================================
--- CalendarServer/trunk/twext/who/directory.py	2013-11-06 22:20:51 UTC (rev 11895)
+++ CalendarServer/trunk/twext/who/directory.py	2013-11-06 22:52:10 UTC (rev 11896)
@@ -24,8 +24,6 @@
     "DirectoryRecord",
 ]
 
-from uuid import UUID
-
 from zope.interface import implementer
 
 from twisted.internet.defer import inlineCallbacks, returnValue
@@ -87,7 +85,6 @@
     fieldName  = FieldName
 
     normalizedFields = {
-        FieldName.guid: lambda g: UUID(g).hex,
         FieldName.emailAddresses: lambda e: bytes(e).lower(),
     }
 

Modified: CalendarServer/trunk/twext/who/expression.py
===================================================================
--- CalendarServer/trunk/twext/who/expression.py	2013-11-06 22:20:51 UTC (rev 11895)
+++ CalendarServer/trunk/twext/who/expression.py	2013-11-06 22:52:10 UTC (rev 11896)
@@ -66,10 +66,13 @@
     """
     Query for a matching value in a given field.
 
-    @ivar fieldName: a L{NamedConstant} specifying the field
-    @ivar fieldValue: a text value to match
-    @ivar matchType: a L{NamedConstant} specifying the match algorythm
-    @ivar flags: L{NamedConstant} specifying additional options
+    @ivar fieldName: A L{NamedConstant} specifying the field.
+
+    @ivar fieldValue: A value to match.
+
+    @ivar matchType: A L{NamedConstant} specifying the match algorithm.
+
+    @ivar flags: A L{NamedConstant} specifying additional options.
     """
 
     def __init__(
@@ -82,6 +85,7 @@
         self.matchType  = matchType
         self.flags      = flags
 
+
     def __repr__(self):
         def describe(constant):
             return getattr(constant, "description", str(constant))

Modified: CalendarServer/trunk/twext/who/idirectory.py
===================================================================
--- CalendarServer/trunk/twext/who/idirectory.py	2013-11-06 22:20:51 UTC (rev 11895)
+++ CalendarServer/trunk/twext/who/idirectory.py	2013-11-06 22:52:10 UTC (rev 11896)
@@ -36,6 +36,8 @@
     "IDirectoryRecord",
 ]
 
+from uuid import UUID
+
 from zope.interface import Attribute, Interface
 
 from twisted.python.constants import Names, NamedConstant
@@ -158,6 +160,8 @@
     emailAddresses.description = "email addresses"
     password.description       = "password"
 
+    guid.valueType = UUID
+
     shortNames.multiValue     = True
     fullNames.multiValue      = True
     emailAddresses.multiValue = True
@@ -168,13 +172,30 @@
         """
         Check for whether a field is multi-value (as opposed to single-value).
 
+        @param name: The name of the field.
+        @type name: L{NamedConstant}
+
         @return: C{True} if the field is multi-value, C{False} otherwise.
         @rtype: L{BOOL}
         """
         return getattr(name, "multiValue", False)
 
 
+    @staticmethod
+    def valueType(name):
+        """
+        Check for the expected type of values for a field.
 
+        @param name: The name of the field.
+        @type name: L{NamedConstant}
+
+        @return: The expected type.
+        @rtype: L{type}
+        """
+        return getattr(name, "valueType", unicode)
+
+
+
 class Operand(Names):
     """
     Contants for common operands.
@@ -295,7 +316,7 @@
         Find the record that has the given GUID.
 
         @param guid: a GUID
-        @type guid: L{bytes}
+        @type guid: L{UUID}
 
         @return: The matching record or C{None} if there is no match.
         @rtype: deferred L{IDirectoryRecord}s or C{None}

Modified: CalendarServer/trunk/twext/who/test/test_xml.py
===================================================================
--- CalendarServer/trunk/twext/who/test/test_xml.py	2013-11-06 22:20:51 UTC (rev 11895)
+++ CalendarServer/trunk/twext/who/test/test_xml.py	2013-11-06 22:52:10 UTC (rev 11896)
@@ -19,6 +19,7 @@
 """
 
 from time import sleep
+from uuid import UUID
 
 from twisted.trial import unittest
 from twisted.python.filepath import FilePath
@@ -63,11 +64,11 @@
     def test_recordWithUID(self):
         service = self.service()
 
-        record = (yield service.recordWithUID("__null__"))
+        record = (yield service.recordWithUID(u"__null__"))
         self.assertEquals(record, None)
 
-        record = (yield service.recordWithUID("__wsanchez__"))
-        self.assertEquals(record.uid, "__wsanchez__")
+        record = (yield service.recordWithUID(u"__wsanchez__"))
+        self.assertEquals(record.uid, u"__wsanchez__")
 
 
     @inlineCallbacks
@@ -75,7 +76,7 @@
         service = self.service()
         record = (
             yield service.recordWithGUID(
-                "6C495FCD-7E78-4D5C-AA66-BC890AD04C9D"
+                UUID("6C495FCD-7E78-4D5C-AA66-BC890AD04C9D")
             )
         )
         self.assertEquals(record, None)
@@ -93,15 +94,15 @@
         self.assertRecords(
             records,
             (
-                "__wsanchez__",
-                "__glyph__",
-                "__sagen__",
-                "__cdaboo__",
-                "__dre__",
-                "__exarkun__",
-                "__dreid__",
-                "__alyssa__",
-                "__joe__",
+                u"__wsanchez__",
+                u"__glyph__",
+                u"__sagen__",
+                u"__cdaboo__",
+                u"__dre__",
+                u"__exarkun__",
+                u"__dreid__",
+                u"__alyssa__",
+                u"__joe__",
             ),
         )
 
@@ -111,9 +112,9 @@
         self.assertRecords(
             records,
             (
-                "__calendar-dev__",
-                "__twisted__",
-                "__developers__",
+                u"__calendar-dev__",
+                u"__twisted__",
+                u"__developers__",
             ),
         )
 
@@ -125,7 +126,7 @@
         record = (
             yield service.recordWithShortName(
                 service.recordType.user,
-                "null",
+                u"null",
             )
         )
         self.assertEquals(record, None)
@@ -133,18 +134,18 @@
         record = (
             yield service.recordWithShortName(
                 service.recordType.user,
-                "wsanchez",
+                u"wsanchez",
             )
         )
-        self.assertEquals(record.uid, "__wsanchez__")
+        self.assertEquals(record.uid, u"__wsanchez__")
 
         record = (
             yield service.recordWithShortName(
                 service.recordType.user,
-                "wilfredo_sanchez",
+                u"wilfredo_sanchez",
             )
         )
-        self.assertEquals(record.uid, "__wsanchez__")
+        self.assertEquals(record.uid, u"__wsanchez__")
 
 
     @inlineCallbacks
@@ -153,24 +154,24 @@
 
         records = (
             yield service.recordsWithEmailAddress(
-                "wsanchez at bitbucket.calendarserver.org"
+                u"wsanchez at bitbucket.calendarserver.org"
             )
         )
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
         records = (
             yield service.recordsWithEmailAddress(
-                "wsanchez at devnull.twistedmatrix.com"
+                u"wsanchez at devnull.twistedmatrix.com"
             )
         )
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
         records = (
             yield service.recordsWithEmailAddress(
-                "shared at example.com"
+                u"shared at example.com"
             )
         )
-        self.assertRecords(records, ("__sagen__", "__dre__"))
+        self.assertRecords(records, (u"__sagen__", u"__dre__"))
 
 
 
@@ -178,7 +179,7 @@
     def test_realmNameImmutable(self):
         def setRealmName():
             service = self.service()
-            service.realmName = "foo"
+            service.realmName = u"foo"
 
         self.assertRaises(AssertionError, setRealmName)
 
@@ -217,7 +218,7 @@
 
     def test_badRootElement(self):
         service = self.service(xmlData=(
-"""<?xml version="1.0" encoding="utf-8"?>
+b"""<?xml version="1.0" encoding="utf-8"?>
 
 <frobnitz />
 """
@@ -234,7 +235,7 @@
 
     def test_noRealmName(self):
         service = self.service(xmlData=(
-"""<?xml version="1.0" encoding="utf-8"?>
+b"""<?xml version="1.0" encoding="utf-8"?>
 
 <directory />
 """
@@ -256,7 +257,7 @@
 
     def test_unknownFieldElementsDirty(self):
         service = self.service(xmlData=(
-"""<?xml version="1.0" encoding="utf-8"?>
+b"""<?xml version="1.0" encoding="utf-8"?>
 
 <directory realm="Unknown Record Types">
   <record type="user">
@@ -269,7 +270,7 @@
         ))
         self.assertEquals(
             set(service.unknownFieldElements),
-            set(("political-affiliation",))
+            set((u"political-affiliation",))
         )
 
 
@@ -280,7 +281,7 @@
 
     def test_unknownRecordTypesDirty(self):
         service = self.service(xmlData=(
-"""<?xml version="1.0" encoding="utf-8"?>
+b"""<?xml version="1.0" encoding="utf-8"?>
 
 <directory realm="Unknown Record Types">
   <record type="camera">
@@ -291,7 +292,7 @@
 </directory>
 """
         ))
-        self.assertEquals(set(service.unknownRecordTypes), set(("camera",)))
+        self.assertEquals(set(service.unknownRecordTypes), set((u"camera",)))
 
 
 
@@ -301,12 +302,12 @@
         service = self.service()
         records = yield service.recordsFromQuery(
             (
-                service.query("emailAddresses", "shared at example.com"),
-                service.query("shortNames", "sagen"),
+                service.query(u"emailAddresses", u"shared at example.com"),
+                service.query(u"shortNames", u"sagen"),
             ),
             operand=Operand.AND
         )
-        self.assertRecords(records, ("__sagen__",))
+        self.assertRecords(records, (u"__sagen__",))
 
 
     @inlineCallbacks
@@ -317,8 +318,8 @@
         service = self.service()
         records = yield service.recordsFromQuery(
             (
-                service.query("emailAddresses", "nobody at example.com"),
-                service.query("shortNames", "sagen"),
+                service.query(u"emailAddresses", u"nobody at example.com"),
+                service.query(u"shortNames", u"sagen"),
             ),
             operand=Operand.AND
         )
@@ -330,12 +331,12 @@
         service = self.service()
         records = yield service.recordsFromQuery(
             (
-                service.query("emailAddresses", "shared at example.com"),
-                service.query("shortNames", "wsanchez"),
+                service.query(u"emailAddresses", u"shared at example.com"),
+                service.query(u"shortNames", u"wsanchez"),
             ),
             operand=Operand.OR
         )
-        self.assertRecords(records, ("__sagen__", "__dre__", "__wsanchez__"))
+        self.assertRecords(records, (u"__sagen__", u"__dre__", u"__wsanchez__"))
 
 
     @inlineCallbacks
@@ -343,12 +344,12 @@
         service = self.service()
         records = yield service.recordsFromQuery(
             (
-                service.query("emailAddresses", "shared at example.com"),
-                service.query("shortNames", "sagen", flags=MatchFlags.NOT),
+                service.query(u"emailAddresses", u"shared at example.com"),
+                service.query(u"shortNames", u"sagen", flags=MatchFlags.NOT),
             ),
             operand=Operand.AND
         )
-        self.assertRecords(records, ("__dre__",))
+        self.assertRecords(records, (u"__dre__",))
 
 
     @inlineCallbacks
@@ -356,15 +357,15 @@
         service = self.service()
         records = yield service.recordsFromQuery(
             (
-                service.query("emailAddresses", "shared at example.com"),
+                service.query(u"emailAddresses", u"shared at example.com"),
                 service.query(
-                    "fullNames", "Andre LaBranche",
+                    u"fullNames", u"Andre LaBranche",
                     flags=MatchFlags.NOT
                 ),
             ),
             operand=Operand.AND
         )
-        self.assertRecords(records, ("__sagen__",))
+        self.assertRecords(records, (u"__sagen__",))
 
 
     @inlineCallbacks
@@ -372,11 +373,11 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "shortNames", "SagEn",
+                u"shortNames", u"SagEn",
                 flags=MatchFlags.caseInsensitive
             ),
         ))
-        self.assertRecords(records, ("__sagen__",))
+        self.assertRecords(records, (u"__sagen__",))
 
 
     @inlineCallbacks
@@ -384,20 +385,20 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "fullNames", "moRGen SAGen",
+                u"fullNames", u"moRGen SAGen",
                 flags=MatchFlags.caseInsensitive
             ),
         ))
-        self.assertRecords(records, ("__sagen__",))
+        self.assertRecords(records, (u"__sagen__",))
 
 
     @inlineCallbacks
     def test_queryStartsWith(self):
         service = self.service()
         records = yield service.recordsFromQuery((
-            service.query("shortNames", "wil", matchType=MatchType.startsWith),
+            service.query(u"shortNames", u"wil", matchType=MatchType.startsWith),
         ))
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
 
     @inlineCallbacks
@@ -405,11 +406,11 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "fullNames", "Wilfredo",
+                u"fullNames", u"Wilfredo",
                 matchType=MatchType.startsWith
             ),
         ))
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
 
     @inlineCallbacks
@@ -417,7 +418,7 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "shortNames", "w",
+                u"shortNames", u"w",
                 matchType=MatchType.startsWith,
                 flags=MatchFlags.NOT,
             ),
@@ -425,17 +426,17 @@
         self.assertRecords(
             records,
             (
-                '__alyssa__',
-                '__calendar-dev__',
-                '__cdaboo__',
-                '__developers__',
-                '__dre__',
-                '__dreid__',
-                '__exarkun__',
-                '__glyph__',
-                '__joe__',
-                '__sagen__',
-                '__twisted__',
+                u"__alyssa__",
+                u"__calendar-dev__",
+                u"__cdaboo__",
+                u"__developers__",
+                u"__dre__",
+                u"__dreid__",
+                u"__exarkun__",
+                u"__glyph__",
+                u"__joe__",
+                u"__sagen__",
+                u"__twisted__",
             ),
         )
 
@@ -451,7 +452,7 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "shortNames", "wil",
+                u"shortNames", u"wil",
                 matchType=MatchType.startsWith,
                 flags=MatchFlags.NOT,
             ),
@@ -459,18 +460,18 @@
         self.assertRecords(
             records,
             (
-                '__alyssa__',
-                '__calendar-dev__',
-                '__cdaboo__',
-                '__developers__',
-                '__dre__',
-                '__dreid__',
-                '__exarkun__',
-                '__glyph__',
-                '__joe__',
-                '__sagen__',
-                '__twisted__',
-                '__wsanchez__',
+                u"__alyssa__",
+                u"__calendar-dev__",
+                u"__cdaboo__",
+                u"__developers__",
+                u"__dre__",
+                u"__dreid__",
+                u"__exarkun__",
+                u"__glyph__",
+                u"__joe__",
+                u"__sagen__",
+                u"__twisted__",
+                u"__wsanchez__",
             ),
         )
 
@@ -480,7 +481,7 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "fullNames", "Wilfredo",
+                u"fullNames", u"Wilfredo",
                 matchType=MatchType.startsWith,
                 flags=MatchFlags.NOT,
             ),
@@ -488,17 +489,17 @@
         self.assertRecords(
             records,
             (
-                '__alyssa__',
-                '__calendar-dev__',
-                '__cdaboo__',
-                '__developers__',
-                '__dre__',
-                '__dreid__',
-                '__exarkun__',
-                '__glyph__',
-                '__joe__',
-                '__sagen__',
-                '__twisted__',
+                u"__alyssa__",
+                u"__calendar-dev__",
+                u"__cdaboo__",
+                u"__developers__",
+                u"__dre__",
+                u"__dreid__",
+                u"__exarkun__",
+                u"__glyph__",
+                u"__joe__",
+                u"__sagen__",
+                u"__twisted__",
             ),
         )
 
@@ -508,12 +509,12 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "shortNames", "WIL",
+                u"shortNames", u"WIL",
                 matchType=MatchType.startsWith,
                 flags=MatchFlags.caseInsensitive,
             ),
         ))
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
 
     @inlineCallbacks
@@ -521,12 +522,12 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "fullNames", "wilfrEdo",
+                u"fullNames", u"wilfrEdo",
                 matchType=MatchType.startsWith,
                 flags=MatchFlags.caseInsensitive,
             ),
         ))
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
 
     @inlineCallbacks
@@ -534,20 +535,20 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "shortNames", "sanchez",
+                u"shortNames", u"sanchez",
                 matchType=MatchType.contains
             ),
         ))
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
 
     @inlineCallbacks
     def test_queryContainsNoIndex(self):
         service = self.service()
         records = yield service.recordsFromQuery((
-            service.query("fullNames", "fred", matchType=MatchType.contains),
+            service.query(u"fullNames", u"fred", matchType=MatchType.contains),
         ))
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
 
     @inlineCallbacks
@@ -555,7 +556,7 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "shortNames", "sanchez",
+                u"shortNames", u"sanchez",
                 matchType=MatchType.contains,
                 flags=MatchFlags.NOT,
             ),
@@ -563,17 +564,17 @@
         self.assertRecords(
             records,
             (
-                '__alyssa__',
-                '__calendar-dev__',
-                '__cdaboo__',
-                '__developers__',
-                '__dre__',
-                '__dreid__',
-                '__exarkun__',
-                '__glyph__',
-                '__joe__',
-                '__sagen__',
-                '__twisted__',
+                u"__alyssa__",
+                u"__calendar-dev__",
+                u"__cdaboo__",
+                u"__developers__",
+                u"__dre__",
+                u"__dreid__",
+                u"__exarkun__",
+                u"__glyph__",
+                u"__joe__",
+                u"__sagen__",
+                u"__twisted__",
             ),
         )
 
@@ -583,7 +584,7 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "fullNames", "fred",
+                u"fullNames", u"fred",
                 matchType=MatchType.contains,
                 flags=MatchFlags.NOT,
             ),
@@ -591,17 +592,17 @@
         self.assertRecords(
             records,
             (
-                '__alyssa__',
-                '__calendar-dev__',
-                '__cdaboo__',
-                '__developers__',
-                '__dre__',
-                '__dreid__',
-                '__exarkun__',
-                '__glyph__',
-                '__joe__',
-                '__sagen__',
-                '__twisted__',
+                u"__alyssa__",
+                u"__calendar-dev__",
+                u"__cdaboo__",
+                u"__developers__",
+                u"__dre__",
+                u"__dreid__",
+                u"__exarkun__",
+                u"__glyph__",
+                u"__joe__",
+                u"__sagen__",
+                u"__twisted__",
             ),
         )
 
@@ -611,12 +612,12 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "shortNames", "Sanchez",
+                u"shortNames", u"Sanchez",
                 matchType=MatchType.contains,
                 flags=MatchFlags.caseInsensitive,
             ),
         ))
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
 
     @inlineCallbacks
@@ -624,12 +625,12 @@
         service = self.service()
         records = yield service.recordsFromQuery((
             service.query(
-                "fullNames", "frEdo",
+                u"fullNames", u"frEdo",
                 matchType=MatchType.contains,
                 flags=MatchFlags.caseInsensitive,
             ),
         ))
-        self.assertRecords(records, ("__wsanchez__",))
+        self.assertRecords(records, (u"__wsanchez__",))
 
 
 
@@ -638,27 +639,27 @@
     def test_updateRecord(self):
         service = self.service()
 
-        record = (yield service.recordWithUID("__wsanchez__"))
+        record = (yield service.recordWithUID(u"__wsanchez__"))
 
         fields = record.fields.copy()
-        fields[service.fieldName.fullNames] = ["Wilfredo Sanchez Vega"]
+        fields[service.fieldName.fullNames] = [u"Wilfredo Sanchez Vega"]
 
         updatedRecord = DirectoryRecord(service, fields)
         yield service.updateRecords((updatedRecord,))
 
         # Verify change is present immediately
-        record = (yield service.recordWithUID("__wsanchez__"))
+        record = (yield service.recordWithUID(u"__wsanchez__"))
         self.assertEquals(
             set(record.fullNames),
-            set(("Wilfredo Sanchez Vega",))
+            set((u"Wilfredo Sanchez Vega",))
         )
 
         # Verify change is persisted
         service.flush()
-        record = (yield service.recordWithUID("__wsanchez__"))
+        record = (yield service.recordWithUID(u"__wsanchez__"))
         self.assertEquals(
             set(record.fullNames),
-            set(("Wilfredo Sanchez Vega",))
+            set((u"Wilfredo Sanchez Vega",))
         )
 
 
@@ -669,22 +670,22 @@
         newRecord = DirectoryRecord(
             service,
             fields={
-                service.fieldName.uid:        "__plugh__",
+                service.fieldName.uid:        u"__plugh__",
                 service.fieldName.recordType: service.recordType.user,
-                service.fieldName.shortNames: ("plugh",),
+                service.fieldName.shortNames: (u"plugh",),
             }
         )
 
         yield service.updateRecords((newRecord,), create=True)
 
         # Verify change is present immediately
-        record = (yield service.recordWithUID("__plugh__"))
-        self.assertEquals(set(record.shortNames), set(("plugh",)))
+        record = (yield service.recordWithUID(u"__plugh__"))
+        self.assertEquals(set(record.shortNames), set((u"plugh",)))
 
         # Verify change is persisted
         service.flush()
-        record = (yield service.recordWithUID("__plugh__"))
-        self.assertEquals(set(record.shortNames), set(("plugh",)))
+        record = (yield service.recordWithUID(u"__plugh__"))
+        self.assertEquals(set(record.shortNames), set((u"plugh",)))
 
 
     def test_addRecordNoCreate(self):
@@ -693,9 +694,9 @@
         newRecord = DirectoryRecord(
             service,
             fields={
-                service.fieldName.uid:        "__plugh__",
+                service.fieldName.uid:        u"__plugh__",
                 service.fieldName.recordType: service.recordType.user,
-                service.fieldName.shortNames: ("plugh",),
+                service.fieldName.shortNames: (u"plugh",),
             }
         )
 
@@ -709,20 +710,20 @@
     def test_removeRecord(self):
         service = self.service()
 
-        yield service.removeRecords(("__wsanchez__",))
+        yield service.removeRecords((u"__wsanchez__",))
 
         # Verify change is present immediately
-        self.assertEquals((yield service.recordWithUID("__wsanchez__")), None)
+        self.assertEquals((yield service.recordWithUID(u"__wsanchez__")), None)
 
         # Verify change is persisted
         service.flush()
-        self.assertEquals((yield service.recordWithUID("__wsanchez__")), None)
+        self.assertEquals((yield service.recordWithUID(u"__wsanchez__")), None)
 
 
     def test_removeRecordNoExist(self):
         service = self.service()
 
-        return service.removeRecords(("__plugh__",))
+        return service.removeRecords((u"__plugh__",))
 
 
 
@@ -731,31 +732,31 @@
     def test_members(self):
         service = self.service()
 
-        record = (yield service.recordWithUID("__wsanchez__"))
+        record = (yield service.recordWithUID(u"__wsanchez__"))
         members = (yield record.members())
         self.assertEquals(set(members), set())
 
-        record = (yield service.recordWithUID("__twisted__"))
+        record = (yield service.recordWithUID(u"__twisted__"))
         members = (yield record.members())
         self.assertEquals(
             set((member.uid for member in members)),
             set((
-                "__wsanchez__",
-                "__glyph__",
-                "__exarkun__",
-                "__dreid__",
-                "__dre__",
+                u"__wsanchez__",
+                u"__glyph__",
+                u"__exarkun__",
+                u"__dreid__",
+                u"__dre__",
             ))
         )
 
-        record = (yield service.recordWithUID("__developers__"))
+        record = (yield service.recordWithUID(u"__developers__"))
         members = (yield record.members())
         self.assertEquals(
             set((member.uid for member in members)),
             set((
-                "__calendar-dev__",
-                "__twisted__",
-                "__alyssa__",
+                u"__calendar-dev__",
+                u"__twisted__",
+                u"__alyssa__",
             ))
         )
 
@@ -763,13 +764,13 @@
     def test_groups(self):
         service = self.service()
 
-        record = (yield service.recordWithUID("__wsanchez__"))
+        record = (yield service.recordWithUID(u"__wsanchez__"))
         groups = (yield record.groups())
         self.assertEquals(
             set(group.uid for group in groups),
             set((
-                "__calendar-dev__",
-                "__twisted__",
+                u"__calendar-dev__",
+                u"__twisted__",
             ))
         )
 
@@ -806,7 +807,7 @@
 
 
 
-testXMLConfig = """<?xml version="1.0" encoding="utf-8"?>
+testXMLConfig = b"""<?xml version="1.0" encoding="utf-8"?>
 
 <directory realm="xyzzy">
 

Modified: CalendarServer/trunk/twext/who/xml.py
===================================================================
--- CalendarServer/trunk/twext/who/xml.py	2013-11-06 22:20:51 UTC (rev 11895)
+++ CalendarServer/trunk/twext/who/xml.py	2013-11-06 22:52:10 UTC (rev 11896)
@@ -28,6 +28,7 @@
 ]
 
 from time import time
+from uuid import UUID
 
 from xml.etree.ElementTree import parse as parseXML
 from xml.etree.ElementTree import ParseError as XMLParseError
@@ -62,38 +63,38 @@
 ##
 
 class Element(Values):
-    directory = ValueConstant("directory")
-    record    = ValueConstant("record")
+    directory = ValueConstant(u"directory")
+    record    = ValueConstant(u"record")
 
     #
     # Field names
     #
-    uid = ValueConstant("uid")
+    uid = ValueConstant(u"uid")
     uid.fieldName = BaseFieldName.uid
 
-    guid = ValueConstant("guid")
+    guid = ValueConstant(u"guid")
     guid.fieldName = BaseFieldName.guid
 
-    shortName = ValueConstant("short-name")
+    shortName = ValueConstant(u"short-name")
     shortName.fieldName = BaseFieldName.shortNames
 
-    fullName = ValueConstant("full-name")
+    fullName = ValueConstant(u"full-name")
     fullName.fieldName = BaseFieldName.fullNames
 
-    emailAddress = ValueConstant("email")
+    emailAddress = ValueConstant(u"email")
     emailAddress.fieldName = BaseFieldName.emailAddresses
 
-    password = ValueConstant("password")
+    password = ValueConstant(u"password")
     password.fieldName = BaseFieldName.password
 
-    memberUID = ValueConstant("member-uid")
+    memberUID = ValueConstant(u"member-uid")
     memberUID.fieldName = IndexFieldName.memberUIDs
 
 
 
 class Attribute(Values):
-    realm      = ValueConstant("realm")
-    recordType = ValueConstant("type")
+    realm      = ValueConstant(u"realm")
+    recordType = ValueConstant(u"type")
 
 
 
@@ -101,16 +102,16 @@
     #
     # Booleans
     #
-    true  = ValueConstant("true")
-    false = ValueConstant("false")
+    true  = ValueConstant(u"true")
+    false = ValueConstant(u"false")
 
     #
     # Record types
     #
-    user = ValueConstant("user")
+    user = ValueConstant(u"user")
     user.recordType = RecordType.user
 
-    group = ValueConstant("group")
+    group = ValueConstant(u"group")
     group.recordType = RecordType.group
 
 
@@ -235,8 +236,8 @@
             )
 
         realmName = directoryNode.get(
-            self.attribute.realm.value, ""
-        ).encode("utf-8")
+            self.attribute.realm.value, u""
+        )
 
         if not realmName:
             raise ParseError("No realm name.")
@@ -289,8 +290,8 @@
 
     def parseRecordNode(self, recordNode, unknownFieldElements=None):
         recordTypeAttribute = recordNode.get(
-            self.attribute.recordType.value, ""
-        ).encode("utf-8")
+            self.attribute.recordType.value, u""
+        )
         if recordTypeAttribute:
             try:
                 recordType = (
@@ -317,8 +318,16 @@
                 if unknownFieldElements is not None:
                     unknownFieldElements.add(fieldNode.tag)
 
-            value = fieldNode.text.encode("utf-8")
+            vType = BaseFieldName.valueType(fieldName)
 
+            if vType in (unicode, UUID):
+                value = unicode(fieldNode.text)
+            else:
+                raise AssertionError(
+                    "Unknown value type {0} for field {1}",
+                    vType, fieldName
+                )
+
             if BaseFieldName.isMultiValue(fieldName):
                 values = fields.setdefault(fieldName, [])
                 values.append(value)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140312/297a1a5d/attachment.html>


More information about the calendarserver-changes mailing list