# HG changeset patch # User Paul Boddie # Date 1422638683 -3600 # Node ID 76cc1f55a328abe570e7d2f0d2e72313bef4f9f3 # Parent 591c54d309fe7240d9e11ec95e1a1c8e43c0a79f Added support for event creation. Preserve slot selections upon form submission; represent undefined end points in slots with the empty string, not "None". diff -r 591c54d309fe -r 76cc1f55a328 imip_manager.py --- a/imip_manager.py Fri Jan 30 16:15:11 2015 +0100 +++ b/imip_manager.py Fri Jan 30 18:24:43 2015 +0100 @@ -24,6 +24,7 @@ LIBRARY_PATH = "/var/lib/imip-agent" +from datetime import datetime import babel.dates import cgi, os, sys @@ -33,7 +34,7 @@ get_item, get_uri, get_utc_datetime, get_value, \ get_value_map, get_values, parse_object, to_part from imiptools.dates import format_datetime, get_datetime, get_start_of_day, \ - ends_on_same_day, to_timezone + get_end_of_day, ends_on_same_day, to_timezone from imiptools.mail import Messenger from imiptools.period import add_day_start_points, add_slots, convert_periods, \ get_freebusy_details, \ @@ -290,6 +291,68 @@ # Request logic and page fragment methods. + def handle_newevent(self): + + "Handle any new event operation." + + # Handle a submitted form. + + args = self.env.get_args() + + if not args.has_key("newevent"): + return + + # Create a new event using the available information. + + slot = args.get("slot", [None])[0] + participants = args.get("participants", []) + + if not slot: + return + + start, end = slot.split("-") + + # Obtain the user's timezone. + + prefs = self.get_preferences() + tzid = prefs.get("TZID", "UTC") + + # Invent a unique identifier. + + utcnow = format_datetime(to_timezone(datetime.utcnow(), "UTC")) + uid = "imip-agent-%s-%s" % (utcnow, get_address(self.user)) + + # Create a calendar object and store it as a request. + + record = [] + rwrite = record.append + + rwrite(("UID", {}, uid)) + rwrite(("SUMMARY", {}, "New event at %s" % utcnow)) + rwrite(("DTSTAMP", {}, utcnow)) + rwrite(("DTSTART", {"VALUE" : "DATE-TIME"}, start)) + rwrite(("DTEND", {"VALUE" : "DATE-TIME"}, end or + format_datetime(get_end_of_day(get_datetime(start, {"TZID" : tzid}))) + )) + rwrite(("ORGANIZER", {}, self.user)) + + for participant in participants: + if not participant: + continue + participant = get_uri(participant) + if participant != self.user: + rwrite(("ATTENDEE", {}, participant)) + + obj = ("VEVENT", {}, record) + + self.store.set_event(self.user, uid, obj) + self.store.queue_request(self.user, uid) + + # Redirect to the object, where instead of attendee controls, + # there will be organiser controls. + + self.redirect(self.env.new_url(uid)) + def handle_request(self, uid, request, queued): """ @@ -537,6 +600,8 @@ "Show the calendar for the current user." + handled = self.handle_newevent() + self.new_page(title="Calendar") page = self.page @@ -848,7 +913,11 @@ def _time_point(self, point, endpoint): page = self.page value, identifier = self._slot_value_and_identifier(point, endpoint) - page.input(name="start", type="radio", value=value, id=identifier, class_="newevent") + slot = self.env.get_args().get("slot", [None])[0] + if slot == value: + page.input(name="slot", type="radio", value=value, id=identifier, class_="newevent", checked="checked") + else: + page.input(name="slot", type="radio", value=value, id=identifier, class_="newevent") page.label(self.format_time(point, "long"), class_="timepoint", for_=identifier) def _empty_slot(self, point, endpoint): @@ -857,7 +926,7 @@ page.label("Make a new event in this period", class_="newevent popup", for_=identifier) def _slot_value_and_identifier(self, point, endpoint): - value = "%s-%s" % tuple(map(format_datetime, [point, endpoint])) + value = "%s-%s" % (format_datetime(point), endpoint and format_datetime(endpoint) or "") identifier = "slot-%s" % value return value, identifier