1.1 --- a/imipweb/handler.py Fri May 15 20:16:29 2015 +0200
1.2 +++ b/imipweb/handler.py Fri May 15 20:17:26 2015 +0200
1.3 @@ -22,9 +22,10 @@
1.4 from imiptools.client import Client
1.5 from imiptools.data import get_address, get_uri, make_freebusy, \
1.6 to_part, uri_item, uri_items, uri_values
1.7 -from imiptools.dates import get_timestamp
1.8 +from imiptools.dates import format_datetime, get_timestamp, to_utc_datetime
1.9 from imiptools.handlers import Handler
1.10 from imiptools.period import update_freebusy
1.11 +from imipweb.data import event_period_from_period
1.12
1.13 class ManagerHandler(Handler):
1.14
1.15 @@ -41,7 +42,7 @@
1.16
1.17 # Communication methods.
1.18
1.19 - def send_message(self, method, sender, from_organiser):
1.20 + def send_message(self, method, sender, from_organiser, parts=None):
1.21
1.22 """
1.23 Create a full calendar object employing the given 'method', and send it
1.24 @@ -50,7 +51,7 @@
1.25 message.
1.26 """
1.27
1.28 - parts = [self.obj.to_part(method)]
1.29 + parts = parts or [self.obj.to_part(method)]
1.30
1.31 # As organiser, send an invitation to attendees, excluding oneself if
1.32 # also attending. The updated event will be saved by the outgoing
1.33 @@ -128,7 +129,7 @@
1.34
1.35 return False
1.36
1.37 - def process_created_request(self, method, to_cancel=None):
1.38 + def process_created_request(self, method, to_cancel=None, to_unschedule=None):
1.39
1.40 """
1.41 Process the current request, sending a created request of the given
1.42 @@ -146,20 +147,37 @@
1.43 self.update_dtstamp()
1.44 self.set_sequence(True)
1.45
1.46 - self.send_message(method, get_address(organiser), from_organiser=True)
1.47 + parts = [self.obj.to_part(method)]
1.48 +
1.49 + # Add message parts with cancelled occurrence information.
1.50 + # NOTE: This could probably be merged with the updated event message.
1.51 +
1.52 + if to_unschedule:
1.53 + obj = self.obj.copy()
1.54 + obj.remove_all(["RRULE", "RDATE", "DTSTART", "DTEND", "DURATION"])
1.55 +
1.56 + for p in to_unschedule:
1.57 + if not p.origin:
1.58 + continue
1.59 + date_tzid = self.get_tzid()
1.60 + obj["RECURRENCE-ID"] = [(format_datetime(to_utc_datetime(p.start, date_tzid)), {})]
1.61 + parts.append(obj.to_part("CANCEL"))
1.62 +
1.63 + # Send the updated event, along with a cancellation for each of the
1.64 + # unscheduled occurrences.
1.65 +
1.66 + self.send_message("CANCEL", get_address(organiser), from_organiser=True, parts=parts)
1.67
1.68 # When cancelling, replace the attendees with those for whom the event
1.69 # is now cancelled.
1.70
1.71 if to_cancel:
1.72 - remaining = self.obj["ATTENDEE"]
1.73 - self.obj["ATTENDEE"] = to_cancel
1.74 - self.send_message("CANCEL", get_address(organiser), from_organiser=True)
1.75 + obj = self.obj.copy()
1.76 + obj["ATTENDEE"] = to_cancel
1.77
1.78 - # Just in case more work is done with this event, the attendees are
1.79 - # now restored.
1.80 + # Send a cancellation to all uninvited attendees.
1.81
1.82 - self.obj["ATTENDEE"] = remaining
1.83 + self.send_message("CANCEL", get_address(organiser), from_organiser=True)
1.84
1.85 return True
1.86