1.1 --- a/imip_store.py Thu Dec 18 23:59:30 2014 +0100
1.2 +++ b/imip_store.py Fri Dec 19 00:20:11 2014 +0100
1.3 @@ -167,11 +167,11 @@
1.4 f.close()
1.5 fix_permissions(filename)
1.6
1.7 - def get_requests(self, user):
1.8 + def _get_requests(self, user, queue):
1.9
1.10 - "Get requests for the given 'user'."
1.11 + "Get requests for the given 'user' from the given 'queue'."
1.12
1.13 - filename = self.get_object_in_store(user, "requests")
1.14 + filename = self.get_object_in_store(user, queue)
1.15 if not filename or not exists(filename):
1.16 return None
1.17
1.18 @@ -181,11 +181,26 @@
1.19 finally:
1.20 f.close()
1.21
1.22 - def set_requests(self, user, requests):
1.23 + def get_requests(self, user):
1.24 +
1.25 + "Get requests for the given 'user'."
1.26 +
1.27 + return self._get_requests(user, "requests")
1.28 +
1.29 + def get_cancellations(self, user):
1.30 +
1.31 + "Get cancellations for the given 'user'."
1.32
1.33 - "For the given 'user', set the list of queued 'requests'."
1.34 + return self._get_requests(user, "cancellations")
1.35 +
1.36 + def _set_requests(self, user, requests, queue):
1.37
1.38 - filename = self.get_object_in_store(user, "requests")
1.39 + """
1.40 + For the given 'user', set the list of queued 'requests' in the given
1.41 + 'queue'.
1.42 + """
1.43 +
1.44 + filename = self.get_object_in_store(user, queue)
1.45 if not filename:
1.46 return False
1.47
1.48 @@ -199,11 +214,23 @@
1.49
1.50 return True
1.51
1.52 - def set_request(self, user, request):
1.53 + def set_requests(self, user, requests):
1.54 +
1.55 + "For the given 'user', set the list of queued 'requests'."
1.56 +
1.57 + return self._set_requests(user, requests, "requests")
1.58 +
1.59 + def set_cancellations(self, user, cancellations):
1.60
1.61 - "For the given 'user', set the queued 'request'."
1.62 + "For the given 'user', set the list of queued 'cancellations'."
1.63 +
1.64 + return self._set_requests(user, cancellations, "cancellations")
1.65
1.66 - filename = self.get_object_in_store(user, "requests")
1.67 + def _set_request(self, user, request, queue):
1.68 +
1.69 + "For the given 'user', set the queued 'request' in the given 'queue'."
1.70 +
1.71 + filename = self.get_object_in_store(user, queue)
1.72 if not filename:
1.73 return False
1.74
1.75 @@ -216,6 +243,18 @@
1.76
1.77 return True
1.78
1.79 + def set_request(self, user, request):
1.80 +
1.81 + "For the given 'user', set the queued 'request'."
1.82 +
1.83 + return self._set_request(user, request, "requests")
1.84 +
1.85 + def set_cancellation(self, user, cancellation):
1.86 +
1.87 + "For the given 'user', set the queued 'cancellation'."
1.88 +
1.89 + return self._set_request(user, cancellation, "cancellations")
1.90 +
1.91 def queue_request(self, user, uid):
1.92
1.93 "Queue a request for 'user' having the given 'uid'."
1.94 @@ -241,6 +280,17 @@
1.95 else:
1.96 return True
1.97
1.98 + def cancel_event(self, user, uid):
1.99 +
1.100 + "Queue an event for cancellation for 'user' having the given 'uid'."
1.101 +
1.102 + cancellations = self.get_cancellations(user) or []
1.103 +
1.104 + if uid not in cancellations:
1.105 + return self.set_cancellation(user, uid)
1.106 +
1.107 + return False
1.108 +
1.109 class FilePublisher(FileBase):
1.110
1.111 "A publisher of objects."
2.1 --- a/imiptools/handlers/person.py Thu Dec 18 23:59:30 2014 +0100
2.2 +++ b/imiptools/handlers/person.py Fri Dec 19 00:20:11 2014 +0100
2.3 @@ -22,7 +22,7 @@
2.4
2.5 "Handling mechanisms specific to people."
2.6
2.7 - def _record_and_deliver(self, objtype, from_organiser=True, queue=False):
2.8 + def _record_and_deliver(self, objtype, from_organiser=True, queue=False, cancel=False):
2.9
2.10 oa = self.require_organiser_and_attendees(from_organiser)
2.11 if not oa:
2.12 @@ -54,6 +54,8 @@
2.13
2.14 if queue:
2.15 self.store.queue_request(attendee, self.uid)
2.16 + elif cancel:
2.17 + self.store.cancel_event(attendee, self.uid)
2.18
2.19 # As organiser, update attendance.
2.20
2.21 @@ -129,11 +131,10 @@
2.22
2.23 def cancel(self):
2.24
2.25 - # NOTE: Queue a suggested modification to any active event.
2.26 + "Queue a cancellation of any active event."
2.27
2.28 - # The message is now wrapped and passed on to the recipient.
2.29 -
2.30 - return "CANCEL", MIMEText("A cancellation has been received.")
2.31 + self._record_and_deliver("VEVENT", from_organiser=True, queue=False, cancel=True)
2.32 + return self.wrap("CANCEL", "A cancellation has been received.", from_organiser=True, link=True)
2.33
2.34 def counter(self):
2.35