1.1 --- a/imiptools/handlers/person.py Wed Mar 04 18:03:35 2015 +0100
1.2 +++ b/imiptools/handlers/person.py Thu Mar 05 01:01:44 2015 +0100
1.3 @@ -20,7 +20,7 @@
1.4 """
1.5
1.6 from imiptools.content import Handler
1.7 -from imiptools.data import get_uri
1.8 +from imiptools.data import get_uri, get_window_end
1.9 from imiptools.dates import format_datetime
1.10 from imiptools.handlers.common import CommonFreebusy
1.11 from imiptools.period import replace_overlapping
1.12 @@ -49,7 +49,11 @@
1.13 if not self.have_new_object(attendee):
1.14 continue
1.15
1.16 - # Set the complete event if not an additional occurrence.
1.17 + # Remove additional occurrences if a complete event is moved.
1.18 +
1.19 + has_moved = self.handle_moved_event(attendee)
1.20 +
1.21 + # Set the complete event or an additional occurrence.
1.22
1.23 self.store.set_event(attendee, self.uid, self.recurrenceid, self.obj.to_node())
1.24
1.25 @@ -61,21 +65,37 @@
1.26
1.27 if queue:
1.28 self.store.queue_request(attendee, self.uid, self.recurrenceid)
1.29 +
1.30 + # Cancel any request.
1.31 +
1.32 elif cancel:
1.33 self.store.cancel_event(attendee, self.uid, self.recurrenceid)
1.34
1.35 - # No return message will occur to update the free/busy
1.36 - # information, so this is done here.
1.37 + # Update free/busy details.
1.38 +
1.39 + if cancel or has_moved:
1.40 +
1.41 + # Upon cancellation, no return message will occur to update
1.42 + # the free/busy information, so this is done here.
1.43
1.44 freebusy = self.store.get_freebusy(attendee)
1.45 - self.remove_from_freebusy(freebusy)
1.46 +
1.47 + # Moved events must update the free/busy details, removing
1.48 + # obsolete detached recurrences.
1.49 +
1.50 + if has_moved:
1.51 + tzid = self.get_tzid(attendee)
1.52 + periods = self.obj.get_periods_for_freebusy(tzid, get_window_end(tzid))
1.53 + self.update_freebusy(freebusy, periods, replace_all=True)
1.54 + else:
1.55 + self.remove_from_freebusy(freebusy)
1.56
1.57 self.store.set_freebusy(attendee, freebusy)
1.58
1.59 if self.publisher:
1.60 self.publisher.set_freebusy(attendee, freebusy)
1.61
1.62 - self.update_freebusy_from_organiser(attendee, organiser_item)
1.63 + self.update_freebusy_from_organiser(attendee, organiser_item, has_moved)
1.64
1.65 # As organiser, update attendance.
1.66