# HG changeset patch # User Paul Boddie # Date 1431519487 -7200 # Node ID 123e849c3982b83220c54df4da82a5d8bce70281 # Parent 451859a2ef503c2044a920ea2b050a05c7df337b Added period origin details to form-originating period information so that RRULE periods can be presented without being directly editable, and also preventing RRULE periods from being generated as RDATE properties when saving an event. diff -r 451859a2ef50 -r 123e849c3982 imipweb/data.py --- a/imipweb/data.py Wed May 13 13:02:35 2015 +0200 +++ b/imipweb/data.py Wed May 13 14:18:07 2015 +0200 @@ -160,7 +160,7 @@ index is not None and ("dtend", index) or "dtend" ]) - return EventPeriod(dtstart, dtend, dtstart_attr, dtend_attr, self.start, self.end) + return EventPeriod(dtstart, dtend, dtstart_attr, dtend_attr, self.start, self.end, self.origin) # Period data methods. diff -r 451859a2ef50 -r 123e849c3982 imipweb/event.py --- a/imipweb/event.py Wed May 13 13:02:35 2015 +0200 +++ b/imipweb/event.py Wed May 13 14:18:07 2015 +0200 @@ -210,8 +210,9 @@ for period in periods: p = event_period_from_period(period) - tzid = p.start_attr and p.start_attr.get("TZID") or p.end_attr and p.end_attr.get("TZID") - new_rdates.append(get_period_item(p.start, p.end, tzid)) + if p.origin != "RRULE": + tzid = p.start_attr and p.start_attr.get("TZID") or p.end_attr and p.end_attr.get("TZID") + new_rdates.append(get_period_item(p.start, p.end, tzid)) obj["RDATE"] = new_rdates @@ -324,6 +325,12 @@ return FormPeriod(start, end, dtend_enabled, dttimes_enabled) def get_current_recurrences(self, obj): + + """ + Return recurrences for 'obj' using the original object where no editing + is in progress, using form data otherwise. + """ + args = self.env.get_args() initial_load = not args.has_key("editing") @@ -333,6 +340,9 @@ return self.get_recurrences() def get_existing_recurrences(self, obj): + + "Return recurrences computed using the given 'obj'." + recurrences = [] for period in obj.get_periods(self.get_tzid(), self.get_window_end()): if period.origin != "DTSTART": @@ -349,15 +359,16 @@ all_dttimes_enabled = args.get("dttimes-control-recur", []) all_starts = self.get_date_control_values("dtstart-recur", multiple=True) all_ends = self.get_date_control_values("dtend-recur", multiple=True, tzid_name="dtstart-recur") + all_origins = args.get("recur-origin", []) periods = [] - for index, (start, end, dtend_enabled, dttimes_enabled) in \ - enumerate(map(None, all_starts, all_ends, all_dtend_enabled, all_dttimes_enabled)): + for index, (start, end, dtend_enabled, dttimes_enabled, origin) in \ + enumerate(map(None, all_starts, all_ends, all_dtend_enabled, all_dttimes_enabled, all_origins)): dtend_enabled = str(index) in all_dtend_enabled dttimes_enabled = str(index) in all_dttimes_enabled - period = FormPeriod(start, end, dtend_enabled, dttimes_enabled) + period = FormPeriod(start, end, dtend_enabled, dttimes_enabled, origin) periods.append(period) return periods @@ -726,7 +737,7 @@ self.show_object_datetime_controls(p, index) page.table(cellspacing=5, cellpadding=5, class_="recurrence") - page.caption("Occurrence") + page.caption(p.origin == "RRULE" and "Occurrence from rule" or "Occurrence") page.tbody() page.tr() @@ -972,22 +983,31 @@ if self.is_organiser(obj) and not replaced: page.td(class_="objectvalue dt%s" % (show_start and "start" or "end")) + read_only = period.origin == "RRULE" + if show_start: page.div(class_="dt enabled") - self._show_date_controls(ssn("dtstart", "recur", index), p.get_form_start(), index=index) - page.br() - page.label("Specify times", for_=sn("dttimes-enable", index), class_="time disabled enable") - page.label("Specify dates only", for_=sn("dttimes-enable", index), class_="time enabled disable") + self._show_date_controls(ssn("dtstart", "recur", index), p.get_form_start(), index=index, read_only=read_only) + if not read_only: + page.br() + page.label("Specify times", for_=sn("dttimes-enable", index), class_="time disabled enable") + page.label("Specify dates only", for_=sn("dttimes-enable", index), class_="time enabled disable") page.div.close() + # Put the origin somewhere. + + page.input(name="recur-origin", type="hidden", value=p.origin or "") + else: page.div(class_="dt disabled") - page.label("Specify end date", for_=sn("dtend-enable", index), class_="enable") + if not read_only: + page.label("Specify end date", for_=sn("dtend-enable", index), class_="enable") page.div.close() page.div(class_="dt enabled") - self._show_date_controls(ssn("dtend", "recur", index), p.get_form_end(), index=index, show_tzid=False) - page.br() - page.label("End on same day", for_=sn("dtend-enable", index), class_="disable") + self._show_date_controls(ssn("dtend", "recur", index), p.get_form_end(), index=index, show_tzid=False, read_only=read_only) + if not read_only: + page.br() + page.label("End on same day", for_=sn("dtend-enable", index), class_="disable") page.div.close() page.td.close() @@ -1089,7 +1109,7 @@ page.option(label, value=v) page.select.close() - def _show_date_controls(self, name, default, index=None, show_tzid=True): + def _show_date_controls(self, name, default, index=None, show_tzid=True, read_only=False): """ Show date controls for a field with the given 'name' and 'default' form @@ -1102,6 +1122,9 @@ If 'show_tzid' is set to a false value, the time zone menu will not be provided. + + If 'read_only' is set to a true value, the controls will be hidden and + labels will be employed instead. """ page = self.page @@ -1115,26 +1138,51 @@ dt = date.today() base = to_date(dt) - items = [] - for i in range(-7, 8): - d = base + timedelta(i) - items.append((format_datetime(d), self.format_date(d, "full"))) + + # Show a date label with a hidden field if read-only. + + if read_only: + page.input(name="%s-date" % name, type="hidden", value=format_datetime(base)) + page.span(self.format_date(base, "long")) - self._show_menu("%s-date" % name, format_datetime(base), items, index=index) + # Show dates for up to one week around the current date. + + else: + items = [] + for i in range(-7, 8): + d = base + timedelta(i) + items.append((format_datetime(d), self.format_date(d, "full"))) + self._show_menu("%s-date" % name, format_datetime(base), items, index=index) # Show time details. page.span(class_="time enabled") - page.input(name="%s-hour" % name, type="text", value=default.get_hour(), maxlength=2, size=2) - page.add(":") - page.input(name="%s-minute" % name, type="text", value=default.get_minute(), maxlength=2, size=2) - page.add(":") - page.input(name="%s-second" % name, type="text", value=default.get_second(), maxlength=2, size=2) + + if read_only: + page.span("%s:%s:%s" % (default.get_hour(), default.get_minute(), default.get_second())) + page.input(name="%s-hour" % name, type="hidden", value=default.get_hour()) + page.input(name="%s-minute" % name, type="hidden", value=default.get_minute()) + page.input(name="%s-second" % name, type="hidden", value=default.get_second()) + else: + page.input(name="%s-hour" % name, type="text", value=default.get_hour(), maxlength=2, size=2) + page.add(":") + page.input(name="%s-minute" % name, type="text", value=default.get_minute(), maxlength=2, size=2) + page.add(":") + page.input(name="%s-second" % name, type="text", value=default.get_second(), maxlength=2, size=2) + + # Show time zone details. if show_tzid: page.add(" ") tzid = default.get_tzid() or self.get_tzid() - self._show_timezone_menu("%s-tzid" % name, tzid, index) + + # Show a label if read-only or a menu otherwise. + + if read_only: + page.input(name="%s-tzid" % name, type="hidden", value=tzid) + page.span(tzid) + else: + self._show_timezone_menu("%s-tzid" % name, tzid, index) page.span.close()