[CalendarServer-changes] [3876] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Mar 17 08:37:49 PDT 2009


Revision: 3876
          http://trac.macosforge.org/projects/calendarserver/changeset/3876
Author:   cdaboo at apple.com
Date:     2009-03-17 08:37:48 -0700 (Tue, 17 Mar 2009)
Log Message:
-----------
New RSVP handling - server takes over more control of RSVP, re-writing it as needed on a PUT. This solves a number
of issues including the ability to re-invite users.

Modified Paths:
--------------
    CalendarServer/trunk/run
    CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py
    CalendarServer/trunk/twistedcaldav/scheduling/implicit.py

Modified: CalendarServer/trunk/run
===================================================================
--- CalendarServer/trunk/run	2009-03-17 15:29:29 UTC (rev 3875)
+++ CalendarServer/trunk/run	2009-03-17 15:37:48 UTC (rev 3876)
@@ -707,7 +707,7 @@
 
 caldavtester="${top}/CalDAVTester";
 
-svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 3862;
+svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 3875;
 
 #
 # PyFlakes

Modified: CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py	2009-03-17 15:29:29 UTC (rev 3875)
+++ CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py	2009-03-17 15:37:48 UTC (rev 3876)
@@ -204,11 +204,17 @@
             old_attendees[value] = attendee
 
         for new_attendee in new_comp.properties("ATTENDEE"):
+            
+            # Whenever RSVP is explicitly set by the Organizer we assume the Organizer
+            # is deliberately overwriting PARTSTAT
+            if new_attendee.params().get("RSVP", ["FALSE",])[0] == "TRUE":
+                continue
+
+            # Transfer parameters from any old Attendees found
             value = normalizeCUAddr(new_attendee.value())
             old_attendee = old_attendees.get(value)
             if old_attendee:
                 self._transferParameter(old_attendee, new_attendee, "PARTSTAT")
-                self._transferParameter(old_attendee, new_attendee, "RSVP")
                 self._transferParameter(old_attendee, new_attendee, "SCHEDULE-STATUS")
     
     def _transferParameter(self, old_property, new_property, parameter):

Modified: CalendarServer/trunk/twistedcaldav/scheduling/implicit.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2009-03-17 15:29:29 UTC (rev 3875)
+++ CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2009-03-17 15:37:48 UTC (rev 3876)
@@ -237,6 +237,8 @@
         self.internal_request = True
         self.except_attendees = attendees
         self.changed_rids = None
+        self.rsvps = None
+
         
         # Get some useful information from the calendar
         yield self.extractCalendarData()
@@ -247,6 +249,11 @@
         self.originatorPrincipal = self.organizerPrincipal
         self.originator = self.organizer
         
+        # Need to re-insert RSVP=TRUE for any NEEDS-ACTION
+        for attendee in self.calendar.getAllAttendeeProperties():
+            if attendee.params().get("PARTSTAT", ["NEEDS-ACTION"])[0] == "NEEDS-ACTION":
+                attendee.params()["RSVP"] = ["TRUE",]
+        
         self.request.doing_attendee_refresh = True
         try:
             result = (yield self.processRequests())
@@ -428,6 +435,11 @@
         if not self.internal_request:
             yield self.doAccessControl(self.organizerPrincipal, True)
 
+        self.oldcalendar = None
+        self.changed_rids = None
+        self.cancelledAttendees = ()
+        self.rsvps = None
+
         # Check for a delete
         if self.action == "remove":
 
@@ -444,33 +456,57 @@
             self.oldcalendar = self.resource.iCalendar()
             
             # Significant change
-            no_change, self.changed_rids = self.isOrganizerChangeInsignificant()
+            no_change, self.changed_rids, rsvps = self.isOrganizerChangeInsignificant()
             if no_change:
-                # Nothing to do
-                log.debug("Implicit - organizer '%s' is modifying UID: '%s' but change is not significant" % (self.organizer, self.uid))
-                returnValue(None)
-            
-            log.debug("Implicit - organizer '%s' is modifying UID: '%s'" % (self.organizer, self.uid))
+                if rsvps:
+                    log.debug("Implicit - organizer '%s' is re-inviting UID: '%s', attendees: %s" % (self.organizer, self.uid, ", ".join(rsvps)))
+                    self.rsvps = rsvps
+                else:
+                    # Nothing to do
+                    log.debug("Implicit - organizer '%s' is modifying UID: '%s' but change is not significant" % (self.organizer, self.uid))
+                    returnValue(None)
+            else:
+                log.debug("Implicit - organizer '%s' is modifying UID: '%s'" % (self.organizer, self.uid))
+    
+                # Check for removed attendees
+                self.findRemovedAttendees()
 
-            # Check for removed attendees
-            self.findRemovedAttendees()
-
         elif self.action == "create":
             log.debug("Implicit - organizer '%s' is creating UID: '%s'" % (self.organizer, self.uid))
-            self.oldcalendar = None
-            self.changed_rids = None
-            self.cancelledAttendees = ()   
             
+        # Always set RSVP=TRUE for any NEEDS-ACTION
+        for attendee in self.calendar.getAllAttendeeProperties():
+            if attendee.params().get("PARTSTAT", ["NEEDS-ACTION"])[0] == "NEEDS-ACTION":
+                attendee.params()["RSVP"] = ["TRUE",]
+
         yield self.scheduleWithAttendees()
+        
+        # Always clear RSVP=TRUE from all attendees after scheduling
+        for attendee in self.calendar.getAllAttendeeProperties():
+            try:
+                del attendee.params()["RSVP"]
+            except KeyError:
+                pass
 
     def isOrganizerChangeInsignificant(self):
         
         rids = None
+        rsvps = None
         differ = iCalDiff(self.oldcalendar, self.calendar, self.do_smart_merge)
         no_change = differ.organizerDiff()
         if not no_change:
             _ignore_props, rids = differ.whatIsDifferent()
-        return no_change, rids
+        else:
+            # Special case of RSVP added to attendees and no other change
+            rsvps = set()
+            for attendee in self.calendar.getAllAttendeeProperties():
+                try:
+                    if attendee.params()["RSVP"][0] == "TRUE":
+                        rsvps.add(attendee.value())
+                except KeyError:
+                    pass
+
+        return no_change, rids, rsvps
     
     def findRemovedAttendees(self):
         """
@@ -611,6 +647,10 @@
             if attendee in self.except_attendees:
                 continue
 
+            # If RSVP only change, only send message to those Attendees
+            if self.rsvps and attendee in self.rsvps:
+                continue
+
             itipmsg = iTipGenerator.generateAttendeeRequest(self.calendar, (attendee,), self.changed_rids)
 
             # Send scheduling message
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090317/c7c4dd12/attachment-0001.html>


More information about the calendarserver-changes mailing list