1.1 --- a/imiptools/handlers/person.py Sat Oct 17 19:08:30 2015 +0200
1.2 +++ b/imiptools/handlers/person.py Sat Oct 17 19:15:22 2015 +0200
1.3 @@ -19,7 +19,7 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 -from imiptools.data import get_address, to_part, uri_dict, uri_item
1.8 +from imiptools.data import get_address
1.9 from imiptools.handlers import Handler
1.10 from imiptools.handlers.common import CommonFreebusy, CommonEvent
1.11 from imiptools.period import FreeBusyPeriod, Period, replace_overlapping
1.12 @@ -103,6 +103,24 @@
1.13
1.14 return True
1.15
1.16 + def _cancel(self):
1.17 +
1.18 + "Record an event cancellation."
1.19 +
1.20 + # Handle an event being published by the sender to themself.
1.21 +
1.22 + organiser_item = self.require_organiser()
1.23 + if organiser_item:
1.24 + organiser, organiser_attr = organiser_item
1.25 + if self.user == organiser:
1.26 + self.store.cancel_event(self.user, self.uid, self.recurrenceid)
1.27 + self.store.dequeue_request(self.user, self.uid, self.recurrenceid)
1.28 + self.store.remove_counters(self.user, self.uid, self.recurrenceid)
1.29 + self.remove_event_from_freebusy()
1.30 + return True
1.31 +
1.32 + return self._record(from_organiser=True, queue=False, cancel=True)
1.33 +
1.34 def _declinecounter(self):
1.35
1.36 "Revoke any counter-proposal recorded as a free/busy offer."
1.37 @@ -128,6 +146,7 @@
1.38 organiser, organiser_attr = organiser_item
1.39 if self.user == organiser:
1.40 self.store.set_event(self.user, self.uid, self.recurrenceid, self.obj.to_node())
1.41 + self.update_event_in_freebusy()
1.42 return True
1.43
1.44 return self._record(from_organiser=True, queue=False)
1.45 @@ -232,50 +251,11 @@
1.46 if not attendees:
1.47 return False
1.48
1.49 - # Assume that the outcome will be a request. It would not seem
1.50 - # completely bizarre to produce a publishing message instead if a
1.51 - # refresh message was unprovoked.
1.52 + # Produce REQUEST and CANCEL results.
1.53
1.54 for attendee in attendees:
1.55 - responses = []
1.56 - cancel_responses = []
1.57 -
1.58 - # Get the parent event, add SENT-BY details to the organiser.
1.59 -
1.60 - obj = self.get_stored_object_version()
1.61 -
1.62 - if self.is_participating(attendee, obj=obj):
1.63 - organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER"))
1.64 - self.update_sender(organiser_attr)
1.65 - responses.append(obj.to_node())
1.66 -
1.67 - # Get recurrences for parent events.
1.68 -
1.69 - if not self.recurrenceid:
1.70 -
1.71 - # Collect active and cancelled recurrences.
1.72 -
1.73 - for l, rl, section in [
1.74 - (responses, self.store.get_active_recurrences(self.user, self.uid), None),
1.75 - (cancel_responses, self.store.get_cancelled_recurrences(self.user, self.uid), "cancellations"),
1.76 - ]:
1.77 - for recurrenceid in rl:
1.78 -
1.79 - # Get the recurrence, add SENT-BY details to the organiser.
1.80 -
1.81 - obj = self.get_stored_object(self.uid, recurrenceid, section)
1.82 -
1.83 - if self.is_participating(attendee, obj=obj):
1.84 - organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER"))
1.85 - self.update_sender(organiser_attr)
1.86 - l.append(obj.to_node())
1.87 -
1.88 - method = "REQUEST"
1.89 - self.add_result(method, [get_address(attendee)], to_part(method, responses))
1.90 -
1.91 - if cancel_responses:
1.92 - method = "CANCEL"
1.93 - self.add_result(method, [get_address(attendee)], to_part(method, cancel_responses))
1.94 + methods, parts = self.get_message_parts(obj, "REQUEST", attendee)
1.95 + self.add_results(methods, [get_address(attendee)], parts)
1.96
1.97 return True
1.98
1.99 @@ -294,7 +274,7 @@
1.100
1.101 "Queue a cancellation of any active event."
1.102
1.103 - if self._record(from_organiser=True, queue=False, cancel=True):
1.104 + if self._cancel():
1.105 return self.wrap("An event cancellation has been received.", link=False)
1.106
1.107 def counter(self):