[CalendarServer-changes] [444]
CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/
directory/appleopendirectory.py
source_changes at macosforge.org
source_changes at macosforge.org
Mon Nov 13 18:00:20 PST 2006
Revision: 444
http://trac.macosforge.org/projects/calendarserver/changeset/444
Author: wsanchez at apple.com
Date: 2006-11-13 18:00:20 -0800 (Mon, 13 Nov 2006)
Log Message:
-----------
Implement members() on OpenDirectoryRecord
Modified Paths:
--------------
CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/appleopendirectory.py
Modified: CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/appleopendirectory.py 2006-11-14 00:14:46 UTC (rev 443)
+++ CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/appleopendirectory.py 2006-11-14 02:00:20 UTC (rev 444)
@@ -48,6 +48,9 @@
return "<%s %s>" % (self.__class__.__name__, self.node)
def __init__(self, node="/Search"):
+ """
+ @param node: an OpenDirectory node name to bind to.
+ """
directory = opendirectory.odInit(node)
if directory is None:
raise OpenDirectoryInitError("Failed to open Open Directory Node: %s" % (node,))
@@ -91,15 +94,34 @@
records = {}
for shortName, guid, lastModified, principalURI in listRecords(self.directory):
- if guid:
- records[shortName] = OpenDirectoryRecord(
- service = self,
- recordType = recordType,
- guid = guid,
- shortName = shortName,
- fullName = None,
- )
+ if not guid:
+ continue
+ # FIXME: This is a second directory lookup; we should have gotten everything in one pass...
+ if recordType == "group":
+ result = opendirectory.listGroupsWithAttributes(self.directory, [shortName])
+ if result is None or shortName not in result:
+ log.err("Group %s exists and then doesn't." % (shortName,))
+ continue
+ result = result[shortName]
+
+ memberGUIDs = result.get(dsattributes.attrGroupMembers, None)
+ if memberGUIDs is None:
+ memberGUIDs = ()
+ elif type(memberGUIDs) is str:
+ memberGUIDs = (memberGUIDs,)
+ else:
+ memberGUIDs = ()
+
+ records[shortName] = OpenDirectoryRecord(
+ service = self,
+ recordType = recordType,
+ guid = guid,
+ shortName = shortName,
+ fullName = None, # FIXME: Need to get this attribute
+ memberGUIDs = memberGUIDs,
+ )
+
if records:
self._records[recordType] = records
@@ -121,9 +143,10 @@
return self._cacheRecords(recordType).get(shortName, None)
def recordWithGUID(self, guid):
- for cache in self._cacheRecords.values():
- if guid in cache:
- return cache[guid]
+ for recordType in self.recordTypes():
+ for record in self._cacheRecords(recordType).values():
+ if record.guid == guid:
+ return record
return None
# def recordWithShortName(self, recordType, shortName):
@@ -165,13 +188,20 @@
"""
Open Directory implementation of L{IDirectoryRecord}.
"""
+ def __init__(self, service, recordType, guid, shortName, fullName, memberGUIDs):
+ super(OpenDirectoryRecord, self).__init__(service, recordType, guid, shortName, fullName)
+ self._memberGUIDs = tuple(memberGUIDs)
+
def members(self):
if self.recordType != "group":
- return ()
+ return
- # FIXME:
- # Need an API here from opendirectory which finds all members of a group
- raise NotImplementedError("OpenDirectoryRecord.members() for groups")
+ for guid in self._memberGUIDs:
+ record = self.service.recordWithGUID(guid)
+ if record is None:
+ log.err("No record for member of group %s with GUID %s" % (self.shortName, guid))
+ else:
+ yield record
def groups(self):
# FIXME:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20061113/ac3658bf/attachment.html
More information about the calendarserver-changes
mailing list