[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