[CalendarServer-changes] [6674] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Dec 6 21:34:02 PST 2010


Revision: 6674
          http://trac.macosforge.org/projects/calendarserver/changeset/6674
Author:   sagen at apple.com
Date:     2010-12-06 21:33:59 -0800 (Mon, 06 Dec 2010)
Log Message:
-----------
Unicode handling improvement for opendirectory and xmlfile.  Gateway commandline utility now supports non-ascii locations and resources.

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/platform/darwin/od/opendirectory.py
    CalendarServer/trunk/calendarserver/platform/darwin/od/setup_directory.py
    CalendarServer/trunk/calendarserver/platform/darwin/od/test/test_opendirectory.py
    CalendarServer/trunk/calendarserver/tools/gateway.py
    CalendarServer/trunk/calendarserver/tools/principals.py
    CalendarServer/trunk/calendarserver/tools/test/test_gateway.py
    CalendarServer/trunk/twistedcaldav/directory/xmlfile.py

Modified: CalendarServer/trunk/calendarserver/platform/darwin/od/opendirectory.py
===================================================================
--- CalendarServer/trunk/calendarserver/platform/darwin/od/opendirectory.py	2010-12-06 14:57:52 UTC (rev 6673)
+++ CalendarServer/trunk/calendarserver/platform/darwin/od/opendirectory.py	2010-12-07 05:33:59 UTC (rev 6674)
@@ -69,8 +69,8 @@
 def recordToResult(record):
     """
     Takes an ODRecord and turns it into a (recordName, attributesDictionary)
-    tuple.  Only unicode values are returned. (Not sure what to do with
-    non-unicode values)
+    tuple.  Unicode values are converted to utf-8 encoded strings. (Not sure
+    what to do with non-unicode values)
     """
     details, error = record.recordDetailsForAttributes_error_(None, None)
     if error:
@@ -83,9 +83,9 @@
                 result[key] = None
             else:
                 if isinstance(value[0], objc.pyobjc_unicode):
-                    result[key] = unicode(value[0]) # convert from pyobjc
+                    result[key] = unicode(value[0]).encode("utf-8") # convert from pyobjc
         else:
-            result[key] = [unicode(v) for v in value if isinstance(v, objc.pyobjc_unicode)]
+            result[key] = [unicode(v).encode("utf-8") for v in value if isinstance(v, objc.pyobjc_unicode)]
 
     return (details.get(dsattributes.kDSNAttrRecordName, [None])[0], result)
 

Modified: CalendarServer/trunk/calendarserver/platform/darwin/od/setup_directory.py
===================================================================
--- CalendarServer/trunk/calendarserver/platform/darwin/od/setup_directory.py	2010-12-06 14:57:52 UTC (rev 6673)
+++ CalendarServer/trunk/calendarserver/platform/darwin/od/setup_directory.py	2010-12-07 05:33:59 UTC (rev 6674)
@@ -75,6 +75,18 @@
             dsattributes.kDS1AttrPrimaryGroupID : ["20"],
         },
     ),
+    (
+        "odtestunicode",
+        {
+            dsattributes.kDS1AttrFirstName : ["Unicode"],
+            dsattributes.kDS1AttrLastName  : ["Test " + unichr(208)],
+            dsattributes.kDS1AttrDistinguishedName : ["Unicode Test " + unichr(208)],
+            dsattributes.kDSNAttrEMailAddress : ["unicodetest at example.com"],
+            dsattributes.kDS1AttrGeneratedUID : ["CA795296-D77A-4E09-A72F-869920A3D284"],
+            dsattributes.kDS1AttrUniqueID : ["33304"],
+            dsattributes.kDS1AttrPrimaryGroupID : ["20"],
+        },
+    ),
 ]
 
 masterGroups = [

Modified: CalendarServer/trunk/calendarserver/platform/darwin/od/test/test_opendirectory.py
===================================================================
--- CalendarServer/trunk/calendarserver/platform/darwin/od/test/test_opendirectory.py	2010-12-06 14:57:52 UTC (rev 6673)
+++ CalendarServer/trunk/calendarserver/platform/darwin/od/test/test_opendirectory.py	2010-12-07 05:33:59 UTC (rev 6674)
@@ -786,14 +786,33 @@
                 user, challenge, response, method)
             self.assertTrue(result)
 
-        def test_unicode_results(self):
+        def test_result_types(self):
             directory = opendirectory.odInit("/Search")
             record = opendirectory.getUserRecord(directory, "odtestbill")
             name, data = opendirectory.recordToResult(record)
             for value in data.values():
                 if isinstance(value, list):
                     for item in value:
-                        self.assertTrue(type(item) is unicode)
+                        self.assertTrue(type(item) is str)
                 else:
-                    self.assertTrue(type(value) is unicode)
+                    self.assertTrue(type(value) is str)
 
+        def test_nonascii_record(self):
+
+            directory = opendirectory.odInit("/Search")
+
+            results = list(opendirectory.queryRecordsWithAttribute_list(
+                directory,
+                dsattributes.kDS1AttrGeneratedUID,
+                "CA795296-D77A-4E09-A72F-869920A3D284",
+                dsattributes.eDSExact,
+                False,
+                dsattributes.kDSStdRecordTypeUsers,
+                USER_ATTRIBUTES,
+                count=0
+            ))
+            result = results[0][1]
+            self.assertEquals(
+                result[dsattributes.kDS1AttrDistinguishedName],
+                "Unicode Test \xc3\x90"
+            )

Modified: CalendarServer/trunk/calendarserver/tools/gateway.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/gateway.py	2010-12-06 14:57:52 UTC (rev 6673)
+++ CalendarServer/trunk/calendarserver/tools/gateway.py	2010-12-07 05:33:59 UTC (rev 6674)
@@ -472,6 +472,8 @@
                 value = record.extras[info['attr']]
             else:
                 value = getattr(record, info['attr'])
+            if isinstance(value, str):
+                value = value.decode("utf-8")
             recordDict[key] = value
         except KeyError:
             pass

Modified: CalendarServer/trunk/calendarserver/tools/principals.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/principals.py	2010-12-06 14:57:52 UTC (rev 6673)
+++ CalendarServer/trunk/calendarserver/tools/principals.py	2010-12-07 05:33:59 UTC (rev 6674)
@@ -789,6 +789,13 @@
     else:
         autoSchedule = recordType in ("locations", "resources")
 
+    for key, value in kwargs.items():
+        if isinstance(value, unicode):
+            kwargs[key] = value.encode("utf-8")
+        elif isinstance(value, list):
+            newValue = [v.encode("utf-8") for v in value]
+            kwargs[key] = newValue
+
     if create:
         record = directory.createRecord(recordType, **kwargs)
         kwargs['guid'] = record.guid

Modified: CalendarServer/trunk/calendarserver/tools/test/test_gateway.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/test_gateway.py	2010-12-06 14:57:52 UTC (rev 6673)
+++ CalendarServer/trunk/calendarserver/tools/test/test_gateway.py	2010-12-07 05:33:59 UTC (rev 6674)
@@ -76,6 +76,10 @@
         Run the given command by feeding it as standard input to
         calendarserver_command_gateway in a subprocess.
         """
+
+        if isinstance(command, unicode):
+            command = command.encode("utf-8")
+
         sourceRoot = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
         python = os.path.join(sourceRoot, "python")
         gateway = os.path.join(sourceRoot, "bin", "calendarserver_command_gateway")
@@ -115,7 +119,7 @@
         self.assertEquals(results["result"]["RecordName"], ["createdlocation01"])
         self.assertEquals(results["result"]["State"], "CA")
         self.assertEquals(results["result"]["Street"], "1 Infinite Loop")
-        self.assertEquals(results["result"]["RealName"], "Created Location 01")
+        self.assertEquals(results["result"]["RealName"], "Created Location 01 %s" % unichr(208))
         self.assertEquals(results["result"]["Comment"], "Test Comment")
         self.assertEquals(results["result"]["AutoSchedule"], True)
         self.assertEquals(set(results["result"]["ReadProxies"]), set(['user03', 'user04']))
@@ -151,6 +155,7 @@
         augment.AugmentService.refresh()
 
         record = directory.recordWithUID("836B1B66-2E9A-4F46-8B1C-3DD6772C20B2")
+        self.assertEquals(record.fullName.decode("utf-8"), "Created Location 01 %s" % unichr(208))
 
         self.assertNotEquals(record, None)
         self.assertEquals(record.autoSchedule, True)
@@ -309,7 +314,7 @@
         <key>GeneratedUID</key>
         <string>836B1B66-2E9A-4F46-8B1C-3DD6772C20B2</string>
         <key>RealName</key>
-        <string>Created Location 01</string>
+        <string>Created Location 01 %s</string>
         <key>RecordName</key>
         <array>
                 <string>createdlocation01</string>
@@ -348,7 +353,7 @@
         </array>
 </dict>
 </plist>
-"""
+""" % unichr(208)
 
 
 command_createResource = """<?xml version="1.0" encoding="UTF-8"?>

Modified: CalendarServer/trunk/twistedcaldav/directory/xmlfile.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/xmlfile.py	2010-12-06 14:57:52 UTC (rev 6673)
+++ CalendarServer/trunk/twistedcaldav/directory/xmlfile.py	2010-12-07 05:33:59 UTC (rev 6674)
@@ -358,9 +358,12 @@
         for value in principal.shortNames:
             addSubElement(element, "uid", text=value)
         addSubElement(element, "guid", text=principal.guid)
-        addSubElement(element, "name", text=principal.fullName)
-        addSubElement(element, "first-name", text=principal.firstName)
-        addSubElement(element, "last-name", text=principal.lastName)
+        if principal.fullName is not None:
+            addSubElement(element, "name", text=principal.fullName.decode("utf-8"))
+        if principal.firstName is not None:
+            addSubElement(element, "first-name", text=principal.firstName.decode("utf-8"))
+        if principal.lastName is not None:
+            addSubElement(element, "last-name", text=principal.lastName.decode("utf-8"))
         for value in principal.emailAddresses:
             addSubElement(element, "email-address", text=value)
         if principal.extras:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20101206/8fdbd552/attachment-0001.html>


More information about the calendarserver-changes mailing list