# HG changeset patch # User Paul Boddie # Date 1418944811 -3600 # Node ID caf2415fb036212667c5312357ca024751030445 # Parent ddac0d9b53e054b15c7c6a03dcb2e92d9d3e5847 Added support for queuing cancellation requests for approval (or review) in the manager. diff -r ddac0d9b53e0 -r caf2415fb036 imip_store.py --- a/imip_store.py Thu Dec 18 23:59:30 2014 +0100 +++ b/imip_store.py Fri Dec 19 00:20:11 2014 +0100 @@ -167,11 +167,11 @@ f.close() fix_permissions(filename) - def get_requests(self, user): + def _get_requests(self, user, queue): - "Get requests for the given 'user'." + "Get requests for the given 'user' from the given 'queue'." - filename = self.get_object_in_store(user, "requests") + filename = self.get_object_in_store(user, queue) if not filename or not exists(filename): return None @@ -181,11 +181,26 @@ finally: f.close() - def set_requests(self, user, requests): + def get_requests(self, user): + + "Get requests for the given 'user'." + + return self._get_requests(user, "requests") + + def get_cancellations(self, user): + + "Get cancellations for the given 'user'." - "For the given 'user', set the list of queued 'requests'." + return self._get_requests(user, "cancellations") + + def _set_requests(self, user, requests, queue): - filename = self.get_object_in_store(user, "requests") + """ + For the given 'user', set the list of queued 'requests' in the given + 'queue'. + """ + + filename = self.get_object_in_store(user, queue) if not filename: return False @@ -199,11 +214,23 @@ return True - def set_request(self, user, request): + def set_requests(self, user, requests): + + "For the given 'user', set the list of queued 'requests'." + + return self._set_requests(user, requests, "requests") + + def set_cancellations(self, user, cancellations): - "For the given 'user', set the queued 'request'." + "For the given 'user', set the list of queued 'cancellations'." + + return self._set_requests(user, cancellations, "cancellations") - filename = self.get_object_in_store(user, "requests") + def _set_request(self, user, request, queue): + + "For the given 'user', set the queued 'request' in the given 'queue'." + + filename = self.get_object_in_store(user, queue) if not filename: return False @@ -216,6 +243,18 @@ return True + def set_request(self, user, request): + + "For the given 'user', set the queued 'request'." + + return self._set_request(user, request, "requests") + + def set_cancellation(self, user, cancellation): + + "For the given 'user', set the queued 'cancellation'." + + return self._set_request(user, cancellation, "cancellations") + def queue_request(self, user, uid): "Queue a request for 'user' having the given 'uid'." @@ -241,6 +280,17 @@ else: return True + def cancel_event(self, user, uid): + + "Queue an event for cancellation for 'user' having the given 'uid'." + + cancellations = self.get_cancellations(user) or [] + + if uid not in cancellations: + return self.set_cancellation(user, uid) + + return False + class FilePublisher(FileBase): "A publisher of objects." diff -r ddac0d9b53e0 -r caf2415fb036 imiptools/handlers/person.py --- a/imiptools/handlers/person.py Thu Dec 18 23:59:30 2014 +0100 +++ b/imiptools/handlers/person.py Fri Dec 19 00:20:11 2014 +0100 @@ -22,7 +22,7 @@ "Handling mechanisms specific to people." - def _record_and_deliver(self, objtype, from_organiser=True, queue=False): + def _record_and_deliver(self, objtype, from_organiser=True, queue=False, cancel=False): oa = self.require_organiser_and_attendees(from_organiser) if not oa: @@ -54,6 +54,8 @@ if queue: self.store.queue_request(attendee, self.uid) + elif cancel: + self.store.cancel_event(attendee, self.uid) # As organiser, update attendance. @@ -129,11 +131,10 @@ def cancel(self): - # NOTE: Queue a suggested modification to any active event. + "Queue a cancellation of any active event." - # The message is now wrapped and passed on to the recipient. - - return "CANCEL", MIMEText("A cancellation has been received.") + self._record_and_deliver("VEVENT", from_organiser=True, queue=False, cancel=True) + return self.wrap("CANCEL", "A cancellation has been received.", from_organiser=True, link=True) def counter(self):