[CalendarServer-changes] [13250] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 10 15:30:44 PDT 2014


Revision: 13250
          http://trac.calendarserver.org//changeset/13250
Author:   gaya at apple.com
Date:     2014-04-10 15:30:44 -0700 (Thu, 10 Apr 2014)
Log Message:
-----------
Use canonical calendar user address for group attendees and vCard X-ADDRESSBOOKSERVER-MEMBER

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/ical.py
    CalendarServer/trunk/txdav/caldav/datastore/sql.py
    CalendarServer/trunk/txdav/who/test/test_group_attendees.py
    CalendarServer/trunk/txdav/who/vcard.py

Modified: CalendarServer/trunk/twistedcaldav/ical.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/ical.py	2014-04-10 20:15:48 UTC (rev 13249)
+++ CalendarServer/trunk/twistedcaldav/ical.py	2014-04-10 22:30:44 UTC (rev 13250)
@@ -3384,22 +3384,20 @@
 
 
     @inlineCallbacks
-    def expandGroupAttendee(self, groupGUID, memberGUIDs, recordFunction):
+    def expandGroupAttendee(self, groupCUA, memberCUAs, recordFunction):
 
-        memberUUIDs = set(["urn:uuid:" + str(memberGUID) for memberGUID in memberGUIDs])
-        groupUUID = "urn:uuid:" + str(groupGUID)
         changed = False
         for component in self.subcomponents():
             if component.name() in ignoredComponents:
                 continue
 
             oldAttendeeProps = tuple(component.properties("ATTENDEE"))
-            oldAttendeeUUIDs = set([attendeeProp.value() for attendeeProp in oldAttendeeProps])
+            oldAttendeeCUAs = set([attendeeProp.value() for attendeeProp in oldAttendeeProps])
 
             # add new member attendees
-            for memberUUID in sorted(memberUUIDs - oldAttendeeUUIDs):
-                directoryRecord = yield recordFunction(memberUUID)
-                newAttendeeProp = directoryRecord.attendee(params={"MEMBER": groupUUID})
+            for memberCUA in sorted(set(memberCUAs) - oldAttendeeCUAs):
+                directoryRecord = yield recordFunction(memberCUA)
+                newAttendeeProp = directoryRecord.attendee(params={"MEMBER": groupCUA})
                 component.addProperty(newAttendeeProp)
                 changed = True
 
@@ -3407,15 +3405,15 @@
             for attendeeProp in oldAttendeeProps:
                 if attendeeProp.hasParameter("MEMBER"):
                     parameterValues = tuple(attendeeProp.parameterValues("MEMBER"))
-                    if groupUUID in parameterValues:
-                        if attendeeProp.value() not in memberUUIDs:
-                            attendeeProp.removeParameterValue("MEMBER", groupUUID)
+                    if groupCUA in parameterValues:
+                        if attendeeProp.value() not in memberCUAs:
+                            attendeeProp.removeParameterValue("MEMBER", groupCUA)
                             if not attendeeProp.parameterValues("MEMBER"):
                                 component.removeProperty(attendeeProp)
                             changed = True
                     else:
-                        if attendeeProp.value() in memberUUIDs:
-                            attendeeProp.setParameter("MEMBER", parameterValues + (groupUUID,))
+                        if attendeeProp.value() in memberCUAs:
+                            attendeeProp.setParameter("MEMBER", parameterValues + (groupCUA,))
                             changed = True
 
         returnValue(changed)

Modified: CalendarServer/trunk/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/sql.py	2014-04-10 20:15:48 UTC (rev 13249)
+++ CalendarServer/trunk/txdav/caldav/datastore/sql.py	2014-04-10 22:30:44 UTC (rev 13250)
@@ -1937,30 +1937,29 @@
         """
         Expand group attendees
         """
-
         if not config.Scheduling.Options.AllowGroupAsAttendee:
             return
 
         attendeeProps = component.getAllAttendeeProperties()
-        groupGUIDs = set([
-            uuid.UUID(attendeeProp.value()[len("urn:uuid:"):]) for attendeeProp in attendeeProps
+        groupCUAs = set([
+            attendeeProp.value() for attendeeProp in attendeeProps
             if attendeeProp.parameterValue("CUTYPE") == "GROUP"
         ])
+        for groupCUA in groupCUAs:
 
-        for groupGUID in groupGUIDs:
-
-            groupRecord = yield self.directoryService().recordWithGUID(groupGUID)
+            groupRecord = yield self.directoryService().recordWithCalendarUserAddress(groupCUA)
             if groupRecord:
                 members = yield groupRecord.expandedMembers()
-                memberGUIDs = sorted([member.guid for member in members])
 
+                # calculate hash
+                memberUIDs = sorted([member.uid for member in members])
                 membershipHashContent = hashlib.md5()
-                for memberGUID in memberGUIDs:
-                    membershipHashContent.update(str(memberGUID))
+                for memberUID in memberUIDs:
+                    membershipHashContent.update(memberUID)
                 membershipHash = membershipHashContent.hexdigest()
 
                 # associate group ID with self
-                groupID, _ignore_name, membershipHash, _ignore_modDate = yield self._txn.groupByUID(str(groupGUID))
+                groupID, _ignore_name, membershipHash, _ignore_modDate = yield self._txn.groupByUID(groupRecord.uid)
                 try:
                     groupAttendee = schema.GROUP_ATTENDEE
                     yield Insert({
@@ -1972,7 +1971,11 @@
                     pass
 
                 # get members
-                yield component.expandGroupAttendee(groupGUID, memberGUIDs, self.directoryService().recordWithCalendarUserAddress)
+                yield component.expandGroupAttendee(
+                    groupRecord.canonicalCalendarUserAddress(),
+                    set([member.canonicalCalendarUserAddress() for member in members]),
+                    self.directoryService().recordWithCalendarUserAddress
+                )
 
 
     def validCalendarDataCheck(self, component, inserting):

Modified: CalendarServer/trunk/txdav/who/test/test_group_attendees.py
===================================================================
--- CalendarServer/trunk/txdav/who/test/test_group_attendees.py	2014-04-10 20:15:48 UTC (rev 13249)
+++ CalendarServer/trunk/txdav/who/test/test_group_attendees.py	2014-04-10 22:30:44 UTC (rev 13250)
@@ -317,8 +317,8 @@
 ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
 ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000002
 ATTENDEE;CN=Group 04;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000004
-ATTENDEE;CN=User 06;EMAIL=user06 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000002","urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000002","urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
+ATTENDEE;CN=User 06;EMAIL=user06 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004","urn:uuid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004","urn:uuid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
 ATTENDEE;CN=User 08;EMAIL=user08 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000008
 ATTENDEE;CN=User 09;EMAIL=user09 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000009
 ATTENDEE;CN=User 10;EMAIL=user10 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000010

Modified: CalendarServer/trunk/txdav/who/vcard.py
===================================================================
--- CalendarServer/trunk/txdav/who/vcard.py	2014-04-10 20:15:48 UTC (rev 13249)
+++ CalendarServer/trunk/txdav/who/vcard.py	2014-04-10 22:30:44 UTC (rev 13250)
@@ -322,7 +322,7 @@
     # FIXME:  members() is a deferred, so all of vCardFromRecord is deferred.
     for memberRecord in (yield record.members()):
         if memberRecord:
-            vcard.addProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", "urn:uuid:" + memberRecord.fields[FieldName.uid].encode("utf-8")))
+            vcard.addProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberRecord.canonicalCalendarUserAddress().encode("utf-8")))
 
     #===================================================================
     # vCard 4.0  http://tools.ietf.org/html/rfc6350
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140410/abcad62a/attachment-0001.html>


More information about the calendarserver-changes mailing list