1.1 --- a/imip_agent.py Wed Sep 24 14:58:48 2014 +0200
1.2 +++ b/imip_agent.py Wed Sep 24 16:05:03 2014 +0200
1.3 @@ -7,7 +7,7 @@
1.4 from email.mime.text import MIMEText
1.5 from pytz import timezone, UnknownTimeZoneError
1.6 from smtplib import SMTP
1.7 -from vCalendar import parse, ParseError
1.8 +from vCalendar import parse, ParseError, to_dict, to_node
1.9 import imip_store
1.10 import re
1.11 import sys
1.12 @@ -64,28 +64,6 @@
1.13
1.14 # Content interpretation.
1.15
1.16 -def get_itip_structure(elements):
1.17 - d = {}
1.18 - for name, attr, value in elements:
1.19 - if not d.has_key(name):
1.20 - d[name] = []
1.21 - if isinstance(value, list):
1.22 - d[name].append((get_itip_structure(value), attr))
1.23 - else:
1.24 - d[name].append((value, attr))
1.25 - return d
1.26 -
1.27 -def get_structure_items(d):
1.28 - items = []
1.29 - for name, value in d.items():
1.30 - if isinstance(value, list):
1.31 - for v, a in value:
1.32 - items.append((name, a, v))
1.33 - else:
1.34 - v, a = value
1.35 - items.append((name, a, get_structure_items(v)))
1.36 - return items
1.37 -
1.38 def get_items(d, name, all=True):
1.39 if d.has_key(name):
1.40 values = d[name]
1.41 @@ -246,7 +224,7 @@
1.42 ("METHOD", {}, method),
1.43 ("VERSION", {}, "2.0")
1.44 ]
1.45 - imip_store.to_stream(out, calendar, "VCALENDAR", encoding)
1.46 + imip_store.to_stream(out, ("VCALENDAR", {}, calendar), encoding)
1.47 part = MIMEText(out.getvalue(), "calendar", encoding)
1.48 part.set_param("method", method)
1.49 return part
1.50 @@ -263,9 +241,9 @@
1.51
1.52 try:
1.53 try:
1.54 - doctype, attrs, elements = parse(f, encoding=encoding)
1.55 + doctype, attrs, elements = obj = parse(f, encoding=encoding)
1.56 if doctype == objtype:
1.57 - return get_itip_structure(elements)
1.58 + return to_dict(obj)[objtype][0]
1.59 finally:
1.60 f.close()
1.61 except (ParseError, ValueError):
1.62 @@ -478,7 +456,9 @@
1.63 if not conflict:
1.64 insert_period(freebusy, (dtstart, dtend, self.uid))
1.65 self.store.set_freebusy(attendee, freebusy)
1.66 - self.store.set_event(attendee, self.uid, get_structure_items(self.details))
1.67 + self.store.set_event(attendee, self.uid, to_node(
1.68 + {"VEVENT" : [(self.details, {})]}
1.69 + ))
1.70 attendee_attr["PARTSTAT"] = "ACCEPTED"
1.71
1.72 # If the event cannot be scheduled, it is not registered and a reply
1.73 @@ -489,7 +469,9 @@
1.74 attendee_attr["PARTSTAT"] = "DECLINED"
1.75
1.76 self.details["ATTENDEE"] = [(attendee, attendee_attr)]
1.77 - calendar.append(("VEVENT", {}, get_structure_items(self.details)))
1.78 + calendar.append(to_node(
1.79 + {"VEVENT" : [(self.details, {})]}
1.80 + ))
1.81
1.82 return calendar
1.83