# HG changeset patch # User Paul Boddie # Date 1414429175 -3600 # Node ID 2d5d4b71ab4ee44a12f30ad78a2dc08fc4b38275 # Parent c280c6d58da28471a524a1bff24c15f17347d317 Added support for declining and ignoring requests. Made parse_object return the entire object if objtype is not specified. diff -r c280c6d58da2 -r 2d5d4b71ab4e imip_manager.py --- a/imip_manager.py Mon Oct 27 16:37:31 2014 +0100 +++ b/imip_manager.py Mon Oct 27 17:59:35 2014 +0100 @@ -83,6 +83,28 @@ except OSError: self.publisher = None + # Communication methods. + + def send_message(self, objtype, obj, sender, recipients): + + # Create a full calendar object and send it. + # NOTE: Should parameterise the subject and body text. + + node = to_node({objtype : [(obj, {})]}) + part = to_part("REPLY", [node]) + message = make_message([part], recipients, sender, "Response to request", "Response to a calendar request") + sendmail(sender, recipients, message.as_string()) + + # Data management methods. + + def remove_request(self, uid): + requests = self.store.get_requests(self.user) + if uid in requests: + requests.remove(uid) + self.store.set_requests(self.user, requests) + + # Presentation methods. + def new_page(self, title): self.page.init(title=title, charset=self.encoding) @@ -133,53 +155,52 @@ if not request: return False + objtype = request.keys()[0] + request = request[objtype][0] + # Handle a submitted form. args = self.env.get_args() show_form = False + organisers = map(get_address, get_values(request, "ORGANIZER")) freebusy = self.store.get_freebusy(self.user) - # When accepting, do so only on behalf of this user. + accept = args.has_key("accept") + decline = args.has_key("decline") - if args.has_key("accept"): - organisers = map(get_address, get_values(request, "ORGANIZER")) + if accept or decline: + + # When accepting or declining, do so only on behalf of this user, + # preserving any other attributes set as an attendee. for attendee, attendee_attr in get_items(request, "ATTENDEE"): if attendee == self.user: - attendee_attr["PARTSTAT"] = "ACCEPTED" + attendee_attr["PARTSTAT"] = accept and "ACCEPTED" or "DECLINED" request["ATTENDEE"] = [(attendee, attendee_attr)] - - # Create a full calendar object and send it. - # NOTE: Should support more than just events. - # NOTE: Should parameterise the subject and body text. - - event = to_node({"VEVENT" : [(request, {})]}) - part = to_part("REPLY", [event]) - message = make_message([part], organisers, get_address(attendee), "Response to request", "Response to a calendar request") - sendmail(get_address(attendee), organisers, message.as_string()) + self.send_message(objtype, request, get_address(attendee), organisers) # Remove the request from the list. - requests = self.store.get_requests(self.user) - if uid in requests: - requests.remove(uid) - self.store.set_requests(self.user, requests) + self.remove_request(uid) # Update the free/busy information. - periods = get_periods(request) - update_freebusy(freebusy, attendee, periods, get_value(request, "TRANSP"), uid, self.store) + if accept: + periods = get_periods(request) + update_freebusy(freebusy, attendee, periods, get_value(request, "TRANSP"), uid, self.store) - if self.publisher: - self.publisher.set_freebusy(attendee, freebusy) + if self.publisher: + self.publisher.set_freebusy(attendee, freebusy) break - elif args.has_key("decline"): - pass elif args.has_key("ignore"): - pass + + # Remove the request from the list. + + self.remove_request(uid) + else: show_form = True diff -r c280c6d58da2 -r 2d5d4b71ab4e imiptools/content.py --- a/imiptools/content.py Mon Oct 27 16:37:31 2014 +0100 +++ b/imiptools/content.py Mon Oct 27 17:59:35 2014 +0100 @@ -275,7 +275,9 @@ """ Parse the iTIP content from 'f' having the given 'encoding'. If 'objtype' is - given, only objects of that type will be returned. + given, only objects of that type will be returned. Otherwise, the root of + the content will be returned as a dictionary with a single key indicating + the object type. Return None if the content was not readable or suitable. """ @@ -286,7 +288,7 @@ if objtype and doctype == objtype: return to_dict(obj)[objtype][0] elif not objtype: - return to_dict(obj)[doctype][0] + return to_dict(obj) finally: f.close() except (ParseError, ValueError):