# HG changeset patch # User Paul Boddie # Date 1427235725 -3600 # Node ID bbfff506454bd1b32a2346dbbdd974aca49d45d5 # Parent 0bd2a134baa6d2290b4e35844cb0e4309d90d3e0 Simplified object and period presentation by introducing a special form field that is present after the initial presentation of an object, removing the need to interpret submitted details and to override stored details every time the form is submitted (in order to determine whether dates or datetimes are specified or whether distinct end dates are employed). Changed the use of checkboxes for end/time controls to indicate the period involved, since no other positional information is available to distinguish between the submitted values, and the "enable"/"disable" distinction that required the special "enable" value is now long gone. diff -r 0bd2a134baa6 -r bbfff506454b imip_manager.py --- a/imip_manager.py Tue Mar 24 20:41:10 2015 +0100 +++ b/imip_manager.py Tue Mar 24 23:22:05 2015 +0100 @@ -742,8 +742,8 @@ # Get the main period details. - dtend_enabled = args.get("dtend-control", [None])[0] == "enable" - dttimes_enabled = args.get("dttimes-control", [None])[0] == "enable" + dtend_enabled = args.get("dtend-control", [None])[0] + dttimes_enabled = args.get("dttimes-control", [None])[0] start_values = self.get_date_control_values("dtstart") end_values = self.get_date_control_values("dtend") @@ -756,14 +756,16 @@ # Get the recurring period details. - all_dtend_enabled = map(lambda x: x == "enable", args.get("dtend-control-recur", [])) - all_dttimes_enabled = map(lambda x: x == "enable", args.get("dttimes-control-recur", [])) + all_dtend_enabled = args.get("dtend-control-recur", []) + all_dttimes_enabled = args.get("dttimes-control-recur", []) all_start_values = self.get_date_control_values("dtstart-recur", multiple=True) all_end_values = self.get_date_control_values("dtend-recur", multiple=True) - for start_values, end_values, dtend_enabled, dttimes_enabled in \ - map(None, all_start_values, all_end_values, all_dtend_enabled, all_dttimes_enabled): - + for index, (start_values, end_values, dtend_enabled, dttimes_enabled) in \ + enumerate(map(None, all_start_values, all_end_values, all_dtend_enabled, all_dttimes_enabled)): + + dtend_enabled = str(index) in all_dtend_enabled + dttimes_enabled = str(index) in all_dttimes_enabled period, errors = self.handle_period_controls(start_values, end_values, dtend_enabled, dttimes_enabled) if errors: @@ -974,41 +976,6 @@ dtend, dtend_attr = dtstart, dtstart_attr return (dtstart, dtstart_attr), (dtend, dtend_attr) - def get_active_event_period(self, obj): - - """ - Return (dtstart, dtstart attributes), (dtend, dtend attributes) for - 'obj', overridden by request parameters, if present. - """ - - page = self.page - args = self.env.get_args() - - # Configure the start and end datetimes. - - dtend_enabled = args.get("dtend-control", [None])[0] == "enable" - dttimes_enabled = args.get("dttimes-control", [None])[0] == "enable" - - # Start with the object's original details, overriding them with request - # information. - - (dtstart, dtstart_attr), (dtend, dtend_attr) = self.get_event_period(obj) - - d = self.get_date_control_values("dtstart") - t = self.handle_date_control_values(d, dttimes_enabled) - if t: - dtstart, dtstart_attr = t - - if dtend_enabled: - d = self.get_date_control_values("dtend") - t = self.handle_date_control_values(d, dttimes_enabled) - if t: - dtend, dtend_attr = t - else: - dtend, dtend_attr = None, {} - - return (dtstart, dtstart_attr), (dtend, dtend_attr) - # Page fragment methods. def show_request_controls(self, obj): @@ -1090,6 +1057,8 @@ page = self.page page.form(method="POST") + page.input(name="editing", type="hidden", value="true") + args = self.env.get_args() # Obtain the user's timezone. @@ -1101,13 +1070,12 @@ is_organiser = get_uri(obj.get_value("ORGANIZER")) == self.user if is_organiser: - (dtstart, dtstart_attr), (dtend, dtend_attr) = self.get_active_event_period(obj) new_attendees, new_attendee = self.handle_new_attendees(obj) else: - (dtstart, dtstart_attr), (dtend, dtend_attr) = self.get_event_period(obj) new_attendees = [] new_attendee = "" + (dtstart, dtstart_attr), (dtend, dtend_attr) = self.get_event_period(obj) self.show_object_datetime_controls(dtstart, dtend) # Provide a summary of the object. @@ -1276,21 +1244,30 @@ page.style.close() - dtend_control = args.get(ssn("dtend-control", "recur", index), [None])[index or 0:] - dttimes_control = args.get(ssn("dttimes-control", "recur", index), [None])[index or 0:] - - dtend_enabled = dtend_control and dtend_control[0] == "enable" or isinstance(end, datetime) or start != end - timedelta(1) - dttimes_enabled = dttimes_control and dttimes_control[0] == "enable" or isinstance(start, datetime) or isinstance(end, datetime) + dtend_control = args.get(ssn("dtend-control", "recur", index), []) + dttimes_control = args.get(ssn("dttimes-control", "recur", index), []) + + dtend_enabled = index is not None and str(index) in dtend_control or index is None and dtend_control + dttimes_enabled = index is not None and str(index) in dttimes_control or index is None and dttimes_control + + initial_load = not args.has_key("editing") + + dtend_enabled = dtend_enabled or initial_load and (isinstance(end, datetime) or start != end - timedelta(1)) + dttimes_enabled = dttimes_enabled or initial_load and (isinstance(start, datetime) or isinstance(end, datetime)) if dtend_enabled: - page.input(name=ssn("dtend-control", "recur", index), type="checkbox", value="enable", id=sn("dtend-enable", index), checked="checked") + page.input(name=ssn("dtend-control", "recur", index), type="checkbox", + value=(index is not None and str(index) or "enable"), id=sn("dtend-enable", index), checked="checked") else: - page.input(name=ssn("dtend-control", "recur", index), type="checkbox", value="enable", id=sn("dtend-enable", index)) + page.input(name=ssn("dtend-control", "recur", index), type="checkbox", + value=(index is not None and str(index) or "enable"), id=sn("dtend-enable", index)) if dttimes_enabled: - page.input(name=ssn("dttimes-control", "recur", index), type="checkbox", value="enable", id=sn("dttimes-enable", index), checked="checked") + page.input(name=ssn("dttimes-control", "recur", index), type="checkbox", + value=(index is not None and str(index) or "enable"), id=sn("dttimes-enable", index), checked="checked") else: - page.input(name=ssn("dttimes-control", "recur", index), type="checkbox", value="enable", id=sn("dttimes-enable", index)) + page.input(name=ssn("dttimes-control", "recur", index), type="checkbox", + value=(index is not None and str(index) or "enable"), id=sn("dttimes-enable", index)) def show_datetime_controls(self, obj, dt, attr, show_start): @@ -1442,6 +1419,7 @@ # Show each recurrence in a separate table if editable. if is_organiser and explicit_periods: + for index, (start, end, origin) in enumerate(periods[1:]): # Isolate the controls from neighbouring tables.