# HG changeset patch # User Paul Boddie # Date 1445036769 -7200 # Node ID b596e4414b77a7f8600dd8639ac81d15cb55e8bb # Parent 1992a1a970257d07b8f60ef7932f5bc308393f07 Remove previous recurrence cancellations when handling ADD messages. Handle the immediate cancellation of recurrences without such recurrences being created first. Added CANCEL parts to the response generated when handling REFRESH messages. diff -r 1992a1a97025 -r b596e4414b77 imiptools/handlers/person.py --- a/imiptools/handlers/person.py Sat Oct 17 01:03:37 2015 +0200 +++ b/imiptools/handlers/person.py Sat Oct 17 01:06:09 2015 +0200 @@ -47,6 +47,7 @@ if self.will_refresh(): self.make_refresh() + return # Record the event as a recurrence of the parent object. @@ -56,15 +57,14 @@ self.update_freebusy_from_organiser(organiser) - # Stop if requesting the full event. - - if self.will_refresh(): - return - # Set the additional occurrence. self.store.set_event(self.user, self.uid, self.recurrenceid, self.obj.to_node()) + # Remove any previous cancellations involving this event. + + self.store.remove_cancellation(self.user, self.uid, self.recurrenceid) + # Queue any request, if appropriate. if queue: @@ -172,6 +172,10 @@ if queue: self.store.queue_request(self.user, self.uid, self.recurrenceid) + # Set the complete event or an additional occurrence. + + self.store.set_event(self.user, self.uid, self.recurrenceid, self.obj.to_node()) + # Cancel complete events or particular occurrences in recurring # events. @@ -196,10 +200,6 @@ else: self.update_freebusy_from_organiser(organiser) - # Set the complete event or an additional occurrence. - - self.store.set_event(self.user, self.uid, self.recurrenceid, self.obj.to_node()) - # As organiser, update attendance from valid attendees. else: @@ -236,10 +236,9 @@ # completely bizarre to produce a publishing message instead if a # refresh message was unprovoked. - method = "REQUEST" - for attendee in attendees: responses = [] + cancel_responses = [] # Get the parent event, add SENT-BY details to the organiser. @@ -250,22 +249,34 @@ self.update_sender(organiser_attr) responses.append(obj.to_node()) - # Get recurrences. + # Get recurrences for parent events. if not self.recurrenceid: - for recurrenceid in self.store.get_active_recurrences(self.user, self.uid): + + # Collect active and cancelled recurrences. - # Get the recurrence, add SENT-BY details to the organiser. + for l, rl, section in [ + (responses, self.store.get_active_recurrences(self.user, self.uid), None), + (cancel_responses, self.store.get_cancelled_recurrences(self.user, self.uid), "cancellations"), + ]: + for recurrenceid in rl: - obj = self.get_stored_object(self.uid, recurrenceid) + # Get the recurrence, add SENT-BY details to the organiser. - if self.is_participating(attendee, obj=obj): - organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER")) - self.update_sender(organiser_attr) - responses.append(obj.to_node()) + obj = self.get_stored_object(self.uid, recurrenceid, section) + + if self.is_participating(attendee, obj=obj): + organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER")) + self.update_sender(organiser_attr) + l.append(obj.to_node()) + method = "REQUEST" self.add_result(method, [get_address(attendee)], to_part(method, responses)) + if cancel_responses: + method = "CANCEL" + self.add_result(method, [get_address(attendee)], to_part(method, cancel_responses)) + return True class Event(PersonHandler):