[CalendarServer-changes] [3339] CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py
source_changes at macosforge.org
source_changes at macosforge.org
Thu Nov 6 17:15:32 PST 2008
Revision: 3339
http://trac.macosforge.org/projects/calendarserver/changeset/3339
Author: wsanchez at apple.com
Date: 2008-11-06 17:15:32 -0800 (Thu, 06 Nov 2008)
Log Message:
-----------
Disable duplicate email addresses.
Modified Paths:
--------------
CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py
Modified: CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py 2008-11-07 00:14:36 UTC (rev 3338)
+++ CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py 2008-11-07 01:15:32 UTC (rev 3339)
@@ -171,19 +171,19 @@
):
yield GUID
- def _calendarUserAddresses(self, recordType, recordName, record):
+ def _calendarUserAddresses(self, recordType, recordName, recordData):
"""
Extract specific attributes from the directory record for use as calendar user address.
@param recordName: a C{str} containing the record name being operated on.
- @param record: a C{dict} containing the attributes retrieved from the directory.
+ @param recordData: a C{dict} containing the attributes retrieved from the directory.
@return: a C{set} of C{str} for each expanded calendar user address.
"""
# Now get the addresses
result = set()
# Add each email address as a mailto URI
- emails = record.get(dsattributes.kDSNAttrEMailAddress)
+ emails = recordData.get(dsattributes.kDSNAttrEMailAddress)
if emails is not None:
if isinstance(emails, str):
emails = [emails]
@@ -412,9 +412,11 @@
if shortName is None and guid is None:
records = {}
guids = {}
+ emails = {}
- disabledNames = set()
- disabledGUIDs = set()
+ disabledNames = set()
+ disabledGUIDs = set()
+ disabledEmails = set()
if recordType == DirectoryService.recordType_groups:
groupsForGUID = {}
@@ -426,9 +428,11 @@
records = storage["records"]
guids = storage["guids"]
+ emails = storage["emails"]
- disabledNames = storage["disabled names"]
- disabledGUIDs = storage["disabled guids"]
+ disabledNames = storage["disabled names"]
+ disabledGUIDs = storage["disabled guids"]
+ disabledEmails = storage["disabled emails"]
if recordType == DirectoryService.recordType_groups:
groupsForGUID = storage["groupsForGUID"]
@@ -485,12 +489,12 @@
calendarUserAddresses = ()
# Get email address from directory record
- emailAddresses = set()
+ recordEmailAddresses = set()
if isinstance(recordEmailAddress, str):
- emailAddresses.add(recordEmailAddress.lower())
+ recordEmailAddresses.add(recordEmailAddress.lower())
elif isinstance(recordEmailAddress, list):
- for addr in emailAddresses:
- emailAddresses.add(addr.lower())
+ for addr in recordEmailAddresses:
+ recordEmailAddresses.add(addr.lower())
# Special case for groups, which have members.
if recordType == DirectoryService.recordType_groups:
@@ -529,7 +533,7 @@
fullName = recordFullName,
firstName = recordFirstName,
lastName = recordLastName,
- emailAddresses = emailAddresses,
+ emailAddresses = recordEmailAddresses,
calendarUserAddresses = calendarUserAddresses,
autoSchedule = autoSchedule,
enabledForCalendaring = enabledForCalendaring,
@@ -541,16 +545,13 @@
def disableRecord(record):
self.log_warn("Record disabled due to conflict (record name and GUID must match): %s" % (record,))
- shortName = record.shortName
- guid = record.guid
+ disabledNames.add(record.shortName)
+ disabledGUIDs.add(record.guid)
- disabledNames.add(shortName)
- disabledGUIDs.add(guid)
-
if shortName in records:
- del records[shortName]
+ del records[record.shortName]
if guid in guids:
- del guids[guid]
+ del guids[record.guid]
# Check for disabled items
if record.shortName in disabledNames or record.guid in disabledGUIDs:
@@ -585,16 +586,40 @@
self._indexGroup(record, record._proxyGUIDs, proxiesForGUID)
self._indexGroup(record, record._readOnlyProxyGUIDs, readOnlyProxiesForGUID)
+ def disableEmail(emailAddress, record):
+ self.log_warn("Email address %s disabled due to conflict for record: %s"
+ % (emailAddress, record))
+
+ record.emailAddresses.remove(emailAddress)
+ disabledEmails.add(emailAddress)
+
+ if emailAddress in emails:
+ del emails[emailAddress]
+
+ for email in frozenset(recordEmailAddresses):
+ if email in disabledEmails:
+ disableEmail(email, record)
+ else:
+ # Check for duplicates
+ existing_record = emails.get(email)
+ if existing_record is not None:
+ disableEmail(email, record)
+ disableEmail(email, existing_record)
+ else:
+ emails[email] = record
+
if shortName is None and guid is None:
#
# Replace the entire cache
#
storage = {
- "status" : "new",
- "records" : records,
- "guids" : guids,
- "disabled names": disabledNames,
- "disabled guids": disabledGUIDs,
+ "status" : "new",
+ "records" : records,
+ "guids" : guids,
+ "emails" : emails,
+ "disabled names" : disabledNames,
+ "disabled guids" : disabledGUIDs,
+ "disabled emails": disabledEmails,
}
# Add group indexing if needed
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20081106/6c0f74da/attachment-0001.html>
More information about the calendarserver-changes
mailing list