1.1 --- a/imip_manager.py Sun Oct 26 23:39:11 2014 +0100
1.2 +++ b/imip_manager.py Mon Oct 27 16:37:31 2014 +0100
1.3 @@ -4,10 +4,14 @@
1.4
1.5 sys.path.append("/var/lib/imip-agent")
1.6
1.7 -from imiptools.content import format_datetime, get_datetime, get_item, \
1.8 - get_utc_datetime, get_values, parse_object, \
1.9 - to_timezone
1.10 +from imiptools import make_message, sendmail
1.11 +from imiptools.content import format_datetime, get_address, get_datetime, \
1.12 + get_item, get_items, get_periods, get_uri, \
1.13 + get_utc_datetime, get_value, get_values, \
1.14 + parse_object, to_part, to_timezone, \
1.15 + update_freebusy
1.16 from imiptools.period import have_conflict
1.17 +from vCalendar import to_node
1.18 import markup
1.19 import imip_store
1.20
1.21 @@ -65,14 +69,20 @@
1.22 "A simple manager application."
1.23
1.24 def __init__(self):
1.25 - self.store = imip_store.FileStore()
1.26 self.env = CGIEnvironment()
1.27 user = self.env.get_user()
1.28 - self.user = user and "mailto:%s" % user or None
1.29 + self.user = user and get_uri(user) or None
1.30 self.out = self.env.get_output()
1.31 self.page = markup.page()
1.32 self.encoding = "utf-8"
1.33
1.34 + self.store = imip_store.FileStore()
1.35 +
1.36 + try:
1.37 + self.publisher = imip_store.FilePublisher()
1.38 + except OSError:
1.39 + self.publisher = None
1.40 +
1.41 def new_page(self, title):
1.42 self.page.init(title=title, charset=self.encoding)
1.43
1.44 @@ -103,7 +113,7 @@
1.45
1.46 for request in requests:
1.47 self.page.li()
1.48 - self.page.a(request, href="%s/%s" % (self.env.get_url(), request))
1.49 + self.page.a(request, href="%s/%s" % (self.env.get_url().rstrip("/"), request))
1.50 self.page.li.close()
1.51
1.52 self.page.ul.close()
1.53 @@ -128,8 +138,44 @@
1.54 args = self.env.get_args()
1.55 show_form = False
1.56
1.57 + freebusy = self.store.get_freebusy(self.user)
1.58 +
1.59 + # When accepting, do so only on behalf of this user.
1.60 +
1.61 if args.has_key("accept"):
1.62 - pass
1.63 + organisers = map(get_address, get_values(request, "ORGANIZER"))
1.64 +
1.65 + for attendee, attendee_attr in get_items(request, "ATTENDEE"):
1.66 + if attendee == self.user:
1.67 + attendee_attr["PARTSTAT"] = "ACCEPTED"
1.68 + request["ATTENDEE"] = [(attendee, attendee_attr)]
1.69 +
1.70 + # Create a full calendar object and send it.
1.71 + # NOTE: Should support more than just events.
1.72 + # NOTE: Should parameterise the subject and body text.
1.73 +
1.74 + event = to_node({"VEVENT" : [(request, {})]})
1.75 + part = to_part("REPLY", [event])
1.76 + message = make_message([part], organisers, get_address(attendee), "Response to request", "Response to a calendar request")
1.77 + sendmail(get_address(attendee), organisers, message.as_string())
1.78 +
1.79 + # Remove the request from the list.
1.80 +
1.81 + requests = self.store.get_requests(self.user)
1.82 + if uid in requests:
1.83 + requests.remove(uid)
1.84 + self.store.set_requests(self.user, requests)
1.85 +
1.86 + # Update the free/busy information.
1.87 +
1.88 + periods = get_periods(request)
1.89 + update_freebusy(freebusy, attendee, periods, get_value(request, "TRANSP"), uid, self.store)
1.90 +
1.91 + if self.publisher:
1.92 + self.publisher.set_freebusy(attendee, freebusy)
1.93 +
1.94 + break
1.95 +
1.96 elif args.has_key("decline"):
1.97 pass
1.98 elif args.has_key("ignore"):
1.99 @@ -156,7 +202,6 @@
1.100
1.101 # Indicate whether there are conflicting events.
1.102
1.103 - freebusy = self.store.get_freebusy(self.user)
1.104 if freebusy:
1.105
1.106 # Obtain any time zone details from the suggested event.
1.107 @@ -166,10 +211,11 @@
1.108
1.109 # Show any conflicts.
1.110
1.111 - for start, end, uid in have_conflict(freebusy, [(dtstart, dtend)], True):
1.112 - start = format_datetime(to_timezone(get_datetime(start), tzid))
1.113 - end = format_datetime(to_timezone(get_datetime(end), tzid))
1.114 - self.page.p("Event conflicts with another from %s to %s." % (start, end))
1.115 + for start, end, found_uid in have_conflict(freebusy, [(dtstart, dtend)], True):
1.116 + if uid != found_uid:
1.117 + start = format_datetime(to_timezone(get_datetime(start), tzid))
1.118 + end = format_datetime(to_timezone(get_datetime(end), tzid))
1.119 + self.page.p("Event conflicts with another from %s to %s." % (start, end))
1.120
1.121 # Show a form if no action has just been taken.
1.122