1.1 --- a/imip_manager.py Mon Oct 27 16:37:31 2014 +0100
1.2 +++ b/imip_manager.py Mon Oct 27 17:59:35 2014 +0100
1.3 @@ -83,6 +83,28 @@
1.4 except OSError:
1.5 self.publisher = None
1.6
1.7 + # Communication methods.
1.8 +
1.9 + def send_message(self, objtype, obj, sender, recipients):
1.10 +
1.11 + # Create a full calendar object and send it.
1.12 + # NOTE: Should parameterise the subject and body text.
1.13 +
1.14 + node = to_node({objtype : [(obj, {})]})
1.15 + part = to_part("REPLY", [node])
1.16 + message = make_message([part], recipients, sender, "Response to request", "Response to a calendar request")
1.17 + sendmail(sender, recipients, message.as_string())
1.18 +
1.19 + # Data management methods.
1.20 +
1.21 + def remove_request(self, uid):
1.22 + requests = self.store.get_requests(self.user)
1.23 + if uid in requests:
1.24 + requests.remove(uid)
1.25 + self.store.set_requests(self.user, requests)
1.26 +
1.27 + # Presentation methods.
1.28 +
1.29 def new_page(self, title):
1.30 self.page.init(title=title, charset=self.encoding)
1.31
1.32 @@ -133,53 +155,52 @@
1.33 if not request:
1.34 return False
1.35
1.36 + objtype = request.keys()[0]
1.37 + request = request[objtype][0]
1.38 +
1.39 # Handle a submitted form.
1.40
1.41 args = self.env.get_args()
1.42 show_form = False
1.43
1.44 + organisers = map(get_address, get_values(request, "ORGANIZER"))
1.45 freebusy = self.store.get_freebusy(self.user)
1.46
1.47 - # When accepting, do so only on behalf of this user.
1.48 + accept = args.has_key("accept")
1.49 + decline = args.has_key("decline")
1.50
1.51 - if args.has_key("accept"):
1.52 - organisers = map(get_address, get_values(request, "ORGANIZER"))
1.53 + if accept or decline:
1.54 +
1.55 + # When accepting or declining, do so only on behalf of this user,
1.56 + # preserving any other attributes set as an attendee.
1.57
1.58 for attendee, attendee_attr in get_items(request, "ATTENDEE"):
1.59 if attendee == self.user:
1.60 - attendee_attr["PARTSTAT"] = "ACCEPTED"
1.61 + attendee_attr["PARTSTAT"] = accept and "ACCEPTED" or "DECLINED"
1.62 request["ATTENDEE"] = [(attendee, attendee_attr)]
1.63 -
1.64 - # Create a full calendar object and send it.
1.65 - # NOTE: Should support more than just events.
1.66 - # NOTE: Should parameterise the subject and body text.
1.67 -
1.68 - event = to_node({"VEVENT" : [(request, {})]})
1.69 - part = to_part("REPLY", [event])
1.70 - message = make_message([part], organisers, get_address(attendee), "Response to request", "Response to a calendar request")
1.71 - sendmail(get_address(attendee), organisers, message.as_string())
1.72 + self.send_message(objtype, request, get_address(attendee), organisers)
1.73
1.74 # Remove the request from the list.
1.75
1.76 - requests = self.store.get_requests(self.user)
1.77 - if uid in requests:
1.78 - requests.remove(uid)
1.79 - self.store.set_requests(self.user, requests)
1.80 + self.remove_request(uid)
1.81
1.82 # Update the free/busy information.
1.83
1.84 - periods = get_periods(request)
1.85 - update_freebusy(freebusy, attendee, periods, get_value(request, "TRANSP"), uid, self.store)
1.86 + if accept:
1.87 + periods = get_periods(request)
1.88 + update_freebusy(freebusy, attendee, periods, get_value(request, "TRANSP"), uid, self.store)
1.89
1.90 - if self.publisher:
1.91 - self.publisher.set_freebusy(attendee, freebusy)
1.92 + if self.publisher:
1.93 + self.publisher.set_freebusy(attendee, freebusy)
1.94
1.95 break
1.96
1.97 - elif args.has_key("decline"):
1.98 - pass
1.99 elif args.has_key("ignore"):
1.100 - pass
1.101 +
1.102 + # Remove the request from the list.
1.103 +
1.104 + self.remove_request(uid)
1.105 +
1.106 else:
1.107 show_form = True
1.108
2.1 --- a/imiptools/content.py Mon Oct 27 16:37:31 2014 +0100
2.2 +++ b/imiptools/content.py Mon Oct 27 17:59:35 2014 +0100
2.3 @@ -275,7 +275,9 @@
2.4
2.5 """
2.6 Parse the iTIP content from 'f' having the given 'encoding'. If 'objtype' is
2.7 - given, only objects of that type will be returned.
2.8 + given, only objects of that type will be returned. Otherwise, the root of
2.9 + the content will be returned as a dictionary with a single key indicating
2.10 + the object type.
2.11
2.12 Return None if the content was not readable or suitable.
2.13 """
2.14 @@ -286,7 +288,7 @@
2.15 if objtype and doctype == objtype:
2.16 return to_dict(obj)[objtype][0]
2.17 elif not objtype:
2.18 - return to_dict(obj)[doctype][0]
2.19 + return to_dict(obj)
2.20 finally:
2.21 f.close()
2.22 except (ParseError, ValueError):