[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