# HG changeset patch # User Paul Boddie # Date 1425317905 -3600 # Node ID a873623106170bd5ca9e8507b805f88b58149065 # Parent dbf60868f068ebafa03f3bfb4149196ea33ffbdb Permit attendee removal when saving events (it should only affect organisers). diff -r dbf60868f068 -r a87362310617 imip_manager.py --- a/imip_manager.py Mon Mar 02 18:18:47 2015 +0100 +++ b/imip_manager.py Mon Mar 02 18:38:25 2015 +0100 @@ -136,6 +136,38 @@ def get_window_end(self): return get_window_end(self.get_tzid(), self.get_window_size()) + def update_attendees(self, obj, added, removed): + + """ + Update the attendees in 'obj' with the given 'added' and 'removed' + attendee lists. A tuple is returned containing the remaining attendees, + together with the attendees whose attendance should be cancelled. + """ + + to_cancel = [] + + if added or removed: + attendees = uri_items(obj.get_items("ATTENDEE") or []) + + if removed: + remaining = [] + + for attendee, attendee_attr in attendees: + if attendee in removed: + to_cancel.append((attendee, attendee_attr)) + else: + remaining.append((attendee, attendee_attr)) + + attendees = remaining + + if added: + for attendee in added: + attendees.append((attendee, {"PARTSTAT" : "NEEDS-ACTION", "RSVP" : "TRUE"})) + + obj["ATTENDEE"] = attendees + + return remaining, to_cancel + class ManagerHandler(Common, Handler): """ @@ -260,27 +292,9 @@ if self.messenger and self.messenger.sender != get_address(organiser): organiser_attr["SENT-BY"] = get_uri(self.messenger.sender) - to_cancel = [] - - if added or removed: - attendees = uri_items(self.obj.get_items("ATTENDEE") or []) - - if removed: - remaining = [] + # Update the attendees in the event. - for attendee, attendee_attr in attendees: - if attendee in removed: - to_cancel.append((attendee, attendee_attr)) - else: - remaining.append((attendee, attendee_attr)) - - attendees = remaining - - if added: - for attendee in added: - attendees.append((attendee, {"PARTSTAT" : "NEEDS-ACTION", "RSVP" : "TRUE"})) - - self.obj["ATTENDEE"] = attendees + remaining, to_cancel = self.update_attendees(self.obj, added, removed) self.update_dtstamp() self.set_sequence(update) @@ -648,6 +662,7 @@ # Save single user events. elif save: + remaining, to_cancel = self.update_attendees(obj, added, removed) self.store.set_event(self.user, uid, None, node=obj.to_node()) self.update_freebusy(uid, None, obj=obj) self.remove_request(uid)