# HG changeset patch # User Paul Boddie # Date 1421192965 -3600 # Node ID 185b93f6376ff45e637c249ce2de924288217321 # Parent dc9a25250a462c6de0eaac883ee00e0018172578 Added some support for updating participation status on events. diff -r dc9a25250a46 -r 185b93f6376f imip_manager.py --- a/imip_manager.py Tue Jan 13 23:37:56 2015 +0100 +++ b/imip_manager.py Wed Jan 14 00:49:25 2015 +0100 @@ -31,7 +31,7 @@ from imiptools.content import Handler, get_address, \ get_item, get_uri, get_utc_datetime, get_value, \ - get_values, parse_object, to_part + get_value_map, get_values, parse_object, to_part from imiptools.dates import format_datetime, get_datetime, get_start_of_day, \ to_timezone from imiptools.mail import Messenger @@ -126,12 +126,15 @@ # Action methods. - def process_request(self, accept): + def process_request(self, accept, update=False): """ Process the current request for the given 'user', accepting any request when 'accept' is true, declining requests otherwise. Return whether any action was taken. + + If 'update' is given, the sequence number will be incremented in order + to override any previous response. """ # When accepting or declining, do so only on behalf of this user, @@ -146,6 +149,10 @@ if self.messenger and self.messenger.sender != get_address(attendee): attendee_attr["SENT-BY"] = get_uri(self.messenger.sender) self.details["ATTENDEE"] = [(attendee, attendee_attr)] + if update: + sequence = self.get_value("SEQUENCE") or "0" + self.details["SEQUENCE"] = [(str(int(sequence) + 1), {})] + self.send_message(get_address(attendee)) return True @@ -260,9 +267,12 @@ # Request logic and page fragment methods. - def handle_request(self, uid, request): + def handle_request(self, uid, request, queued): - "Handle actions involving the given 'uid' and 'request' object." + """ + Handle actions involving the given 'uid' and 'request' object, where + 'queued' indicates that the object has not yet been handled. + """ # Handle a submitted form. @@ -271,12 +281,13 @@ accept = args.has_key("accept") decline = args.has_key("decline") + update = not queued and args.has_key("update") if accept or decline: handler = ManagerHandler(request, self.user, self.messenger) - if handler.process_request(accept): + if handler.process_request(accept, update): # Remove the request from the list. @@ -296,11 +307,32 @@ return handled - def show_request_form(self): + def show_request_form(self, obj, needs_action): + + """ + Show a form for a request concerning 'obj', indicating whether action is + needed if 'needs_action' is specified as a true value. + """ + + details = self._get_details(obj) + + attendees = get_value_map(details, "ATTENDEE") + attendee_attr = attendees.get(self.user) - "Show a form for a request." + if attendee_attr: + partstat = attendee_attr.get("PARTSTAT") + if partstat == "ACCEPTED": + self.page.p("This request has been accepted.") + elif partstat == "DECLINED": + self.page.p("This request has been declined.") + else: + self.page.p("This request has been ignored.") - self.page.p("Action to take for this request:") + if needs_action: + self.page.p("An action is required for this request:") + else: + self.page.p("This request can be updated as follows:") + self.page.form(method="POST") self.page.p() self.page.input(name="accept", type="submit", value="Accept") @@ -308,6 +340,8 @@ self.page.input(name="decline", type="submit", value="Decline") self.page.add(" ") self.page.input(name="ignore", type="submit", value="Ignore") + if not needs_action: + self.page.input(name="update", type="hidden", value="true") self.page.p.close() self.page.form.close() @@ -413,7 +447,7 @@ return False is_request = uid in self._get_requests() - handled = is_request and self.handle_request(uid, obj) + handled = self.handle_request(uid, obj, is_request) if handled: return True @@ -422,8 +456,7 @@ self.show_object_on_page(uid, obj) - if is_request and not handled: - self.show_request_form() + self.show_request_form(obj, is_request and not handled) return True