[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