# HG changeset patch # User Paul Boddie # Date 1445868226 -3600 # Node ID f11806f9de3aff723cf4d84bf2abe6726f49d274 # Parent 2caa4627f3aadef50a445a9ad6a684721ba83e4f Changed the person handler to use a similar object-checking method to the resource handler. diff -r 2caa4627f3aa -r f11806f9de3a imiptools/handlers/person.py --- a/imiptools/handlers/person.py Mon Oct 26 14:05:25 2015 +0100 +++ b/imiptools/handlers/person.py Mon Oct 26 15:03:46 2015 +0100 @@ -28,21 +28,28 @@ "Event handling mechanisms specific to people." - def _add(self, queue=True): + def _process(self, handle, from_organiser=True, **kw): + + """ + Obtain valid organiser and attendee details in order to invoke the given + 'handle' callable, with 'from_organiser' being indicated to obtain the + details. Any additional keyword arguments will be passed to 'handle'. + """ + + oa = self.require_organiser_and_attendees(from_organiser) + if not oa: + return False + + (organiser, organiser_attr), attendees = oa + return handle(organiser, attendees, **kw) + + def _add(self, organiser, attendees, queue=True): """ Add an event occurrence for the current object or produce a response that requests the event details to be sent again. """ - # Obtain valid organiser and attendee details. - - oa = self.require_organiser_and_attendees() - if not oa: - return False - - (organiser, organiser_attr), attendees = oa - # Request details where configured, doing so for unknown objects anyway. if self.will_refresh(): @@ -72,21 +79,13 @@ return True - def _counter(self): + def _counter(self, organiser, attendees): """ Record details from a counter-proposal, updating the stored object with attendance information. """ - # Obtain valid organiser and attendee details. - - oa = self.require_organiser_and_attendees(from_organiser=False) - if not oa: - return False - - (organiser, organiser_attr), attendees = oa - # Update the attendance for the sender. attendee = self.get_sending_attendee() @@ -120,20 +119,13 @@ self.remove_freebusy_from_attendees(uri_dict(self.obj.get_value_map("ATTENDEE"))) return True - return self._record(from_organiser=True, queue=False, cancel=True) + return self._process(self._schedule_for_attendee, queue=False, cancel=True) - def _declinecounter(self): + def _declinecounter(self, organiser, attendees): "Revoke any counter-proposal recorded as a free/busy offer." - # Obtain valid organiser and attendee details. - - oa = self.require_organiser_and_attendees() - if not oa: - return False - self.remove_event_from_freebusy_offers() - return True def _publish(self): @@ -150,9 +142,9 @@ self.update_event_in_freebusy() return True - return self._record(from_organiser=True, queue=False) + return self._process(self._schedule_for_attendee, queue=False) - def _record(self, from_organiser=True, queue=False, cancel=False): + def _schedule_for_attendee(self, organiser, attendees, queue=False, cancel=False): """ Record details from the current object given a message originating @@ -161,88 +153,71 @@ 'cancel' is set to a true value. """ - # Obtain valid organiser and attendee details. + # Process for the current user, an attendee. - oa = self.require_organiser_and_attendees(from_organiser) - if not oa: + if not self.have_new_object(): return False - (organiser, organiser_attr), attendees = oa - - # Handle notifications and invitations. + # Remove additional recurrences if handling a complete event. + # Also remove any previous cancellations involving this event. - if from_organiser: - - # Process for the current user, an attendee. - - if not self.have_new_object(): - return False + if not self.recurrenceid: + self.store.remove_recurrences(self.user, self.uid) + self.store.remove_cancellations(self.user, self.uid) + else: + self.store.remove_cancellation(self.user, self.uid, self.recurrenceid) - # Remove additional recurrences if handling a complete event. - # Also remove any previous cancellations involving this event. + # Queue any request, if appropriate. - if not self.recurrenceid: - self.store.remove_recurrences(self.user, self.uid) - self.store.remove_cancellations(self.user, self.uid) - else: - self.store.remove_cancellation(self.user, self.uid, self.recurrenceid) + if queue: + self.store.queue_request(self.user, self.uid, self.recurrenceid) - # Queue any request, if appropriate. + # Set the complete event or an additional occurrence. - 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()) - self.store.set_event(self.user, self.uid, self.recurrenceid, self.obj.to_node()) - - # Cancel complete events or particular occurrences in recurring - # events. + # Cancel complete events or particular occurrences in recurring + # events. - if cancel: - self.store.cancel_event(self.user, self.uid, self.recurrenceid) + if cancel: + self.store.cancel_event(self.user, self.uid, self.recurrenceid) - # Remove any associated request. - - self.store.dequeue_request(self.user, self.uid, self.recurrenceid) - self.store.remove_counters(self.user, self.uid, self.recurrenceid) + # Remove any associated request. - # No return message will occur to update the free/busy - # information, so this is done here using outgoing message - # functionality. - - self.remove_event_from_freebusy() + self.store.dequeue_request(self.user, self.uid, self.recurrenceid) + self.store.remove_counters(self.user, self.uid, self.recurrenceid) - # Update the recipient's record of the organiser's schedule. - - self.remove_freebusy_from_organiser(organiser) + # No return message will occur to update the free/busy + # information, so this is done here using outgoing message + # functionality. - else: - self.update_freebusy_from_organiser(organiser) + self.remove_event_from_freebusy() - # As organiser, update attendance from valid attendees. + # Update the recipient's record of the organiser's schedule. + + self.remove_freebusy_from_organiser(organiser) else: - if self.merge_attendance(attendees): - self.update_freebusy_from_attendees(attendees) + self.update_freebusy_from_organiser(organiser) return True - def _refresh(self): + def _schedule_for_organiser(self, organiser, attendees): + + "As organiser, update attendance from valid attendees." + + if self.merge_attendance(attendees): + self.update_freebusy_from_attendees(attendees) + + return True + + def _refresh(self, organiser, attendees): """ Respond to a refresh message by providing complete event details to attendees. """ - # Obtain valid organiser and attendee details. - - oa = self.require_organiser_and_attendees(False) - if not oa: - return False - - (organiser, organiser_attr), attendees = oa - # Filter by stored attendees. obj = self.get_stored_object_version() @@ -268,7 +243,7 @@ "Queue a suggested additional recurrence for any active event." - if self.allow_add() and self._add(queue=True): + if self.allow_add() and self._process(self._add, queue=True): return self.wrap("An addition to an event has been received.") def cancel(self): @@ -282,14 +257,14 @@ "Record a counter-proposal to a proposed event." - if self._counter(): + if self._process(self._counter, from_organiser=False): return self.wrap("A counter proposal to an event invitation has been received.", link=True) def declinecounter(self): "Record a rejection of a counter-proposal." - if self._declinecounter(): + if self._process(self._declinecounter): return self.wrap("Your counter proposal to an event invitation has been declined.", link=True) def publish(self): @@ -304,7 +279,7 @@ "Requests to refresh events are handled either here or by the client." if self.is_refreshing(): - return self._refresh() + return self._process(self._refresh, from_organiser=False) else: return self.wrap("A request for updated event details has been received.") @@ -312,14 +287,14 @@ "Record replies and notify the recipient." - if self._record(from_organiser=False, queue=False): + if self._process(self._schedule_for_organiser, from_organiser=False): return self.wrap("A reply to an event invitation has been received.") def request(self): "Hold requests and notify the recipient." - if self._record(from_organiser=True, queue=True): + if self._process(self._schedule_for_attendee, queue=True): return self.wrap("An event invitation has been received.") class PersonFreebusy(CommonFreebusy, Handler):