2.1 --- a/imipweb/event.py Wed May 13 13:02:35 2015 +0200
2.2 +++ b/imipweb/event.py Wed May 13 14:18:07 2015 +0200
2.3 @@ -210,8 +210,9 @@
2.4
2.5 for period in periods:
2.6 p = event_period_from_period(period)
2.7 - tzid = p.start_attr and p.start_attr.get("TZID") or p.end_attr and p.end_attr.get("TZID")
2.8 - new_rdates.append(get_period_item(p.start, p.end, tzid))
2.9 + if p.origin != "RRULE":
2.10 + tzid = p.start_attr and p.start_attr.get("TZID") or p.end_attr and p.end_attr.get("TZID")
2.11 + new_rdates.append(get_period_item(p.start, p.end, tzid))
2.12
2.13 obj["RDATE"] = new_rdates
2.14
2.15 @@ -324,6 +325,12 @@
2.16 return FormPeriod(start, end, dtend_enabled, dttimes_enabled)
2.17
2.18 def get_current_recurrences(self, obj):
2.19 +
2.20 + """
2.21 + Return recurrences for 'obj' using the original object where no editing
2.22 + is in progress, using form data otherwise.
2.23 + """
2.24 +
2.25 args = self.env.get_args()
2.26 initial_load = not args.has_key("editing")
2.27
2.28 @@ -333,6 +340,9 @@
2.29 return self.get_recurrences()
2.30
2.31 def get_existing_recurrences(self, obj):
2.32 +
2.33 + "Return recurrences computed using the given 'obj'."
2.34 +
2.35 recurrences = []
2.36 for period in obj.get_periods(self.get_tzid(), self.get_window_end()):
2.37 if period.origin != "DTSTART":
2.38 @@ -349,15 +359,16 @@
2.39 all_dttimes_enabled = args.get("dttimes-control-recur", [])
2.40 all_starts = self.get_date_control_values("dtstart-recur", multiple=True)
2.41 all_ends = self.get_date_control_values("dtend-recur", multiple=True, tzid_name="dtstart-recur")
2.42 + all_origins = args.get("recur-origin", [])
2.43
2.44 periods = []
2.45
2.46 - for index, (start, end, dtend_enabled, dttimes_enabled) in \
2.47 - enumerate(map(None, all_starts, all_ends, all_dtend_enabled, all_dttimes_enabled)):
2.48 + for index, (start, end, dtend_enabled, dttimes_enabled, origin) in \
2.49 + enumerate(map(None, all_starts, all_ends, all_dtend_enabled, all_dttimes_enabled, all_origins)):
2.50
2.51 dtend_enabled = str(index) in all_dtend_enabled
2.52 dttimes_enabled = str(index) in all_dttimes_enabled
2.53 - period = FormPeriod(start, end, dtend_enabled, dttimes_enabled)
2.54 + period = FormPeriod(start, end, dtend_enabled, dttimes_enabled, origin)
2.55 periods.append(period)
2.56
2.57 return periods
2.58 @@ -726,7 +737,7 @@
2.59 self.show_object_datetime_controls(p, index)
2.60
2.61 page.table(cellspacing=5, cellpadding=5, class_="recurrence")
2.62 - page.caption("Occurrence")
2.63 + page.caption(p.origin == "RRULE" and "Occurrence from rule" or "Occurrence")
2.64 page.tbody()
2.65
2.66 page.tr()
2.67 @@ -972,22 +983,31 @@
2.68 if self.is_organiser(obj) and not replaced:
2.69 page.td(class_="objectvalue dt%s" % (show_start and "start" or "end"))
2.70
2.71 + read_only = period.origin == "RRULE"
2.72 +
2.73 if show_start:
2.74 page.div(class_="dt enabled")
2.75 - self._show_date_controls(ssn("dtstart", "recur", index), p.get_form_start(), index=index)
2.76 - page.br()
2.77 - page.label("Specify times", for_=sn("dttimes-enable", index), class_="time disabled enable")
2.78 - page.label("Specify dates only", for_=sn("dttimes-enable", index), class_="time enabled disable")
2.79 + self._show_date_controls(ssn("dtstart", "recur", index), p.get_form_start(), index=index, read_only=read_only)
2.80 + if not read_only:
2.81 + page.br()
2.82 + page.label("Specify times", for_=sn("dttimes-enable", index), class_="time disabled enable")
2.83 + page.label("Specify dates only", for_=sn("dttimes-enable", index), class_="time enabled disable")
2.84 page.div.close()
2.85
2.86 + # Put the origin somewhere.
2.87 +
2.88 + page.input(name="recur-origin", type="hidden", value=p.origin or "")
2.89 +
2.90 else:
2.91 page.div(class_="dt disabled")
2.92 - page.label("Specify end date", for_=sn("dtend-enable", index), class_="enable")
2.93 + if not read_only:
2.94 + page.label("Specify end date", for_=sn("dtend-enable", index), class_="enable")
2.95 page.div.close()
2.96 page.div(class_="dt enabled")
2.97 - self._show_date_controls(ssn("dtend", "recur", index), p.get_form_end(), index=index, show_tzid=False)
2.98 - page.br()
2.99 - page.label("End on same day", for_=sn("dtend-enable", index), class_="disable")
2.100 + self._show_date_controls(ssn("dtend", "recur", index), p.get_form_end(), index=index, show_tzid=False, read_only=read_only)
2.101 + if not read_only:
2.102 + page.br()
2.103 + page.label("End on same day", for_=sn("dtend-enable", index), class_="disable")
2.104 page.div.close()
2.105
2.106 page.td.close()
2.107 @@ -1089,7 +1109,7 @@
2.108 page.option(label, value=v)
2.109 page.select.close()
2.110
2.111 - def _show_date_controls(self, name, default, index=None, show_tzid=True):
2.112 + def _show_date_controls(self, name, default, index=None, show_tzid=True, read_only=False):
2.113
2.114 """
2.115 Show date controls for a field with the given 'name' and 'default' form
2.116 @@ -1102,6 +1122,9 @@
2.117
2.118 If 'show_tzid' is set to a false value, the time zone menu will not be
2.119 provided.
2.120 +
2.121 + If 'read_only' is set to a true value, the controls will be hidden and
2.122 + labels will be employed instead.
2.123 """
2.124
2.125 page = self.page
2.126 @@ -1115,26 +1138,51 @@
2.127 dt = date.today()
2.128
2.129 base = to_date(dt)
2.130 - items = []
2.131 - for i in range(-7, 8):
2.132 - d = base + timedelta(i)
2.133 - items.append((format_datetime(d), self.format_date(d, "full")))
2.134 +
2.135 + # Show a date label with a hidden field if read-only.
2.136 +
2.137 + if read_only:
2.138 + page.input(name="%s-date" % name, type="hidden", value=format_datetime(base))
2.139 + page.span(self.format_date(base, "long"))
2.140
2.141 - self._show_menu("%s-date" % name, format_datetime(base), items, index=index)
2.142 + # Show dates for up to one week around the current date.
2.143 +
2.144 + else:
2.145 + items = []
2.146 + for i in range(-7, 8):
2.147 + d = base + timedelta(i)
2.148 + items.append((format_datetime(d), self.format_date(d, "full")))
2.149 + self._show_menu("%s-date" % name, format_datetime(base), items, index=index)
2.150
2.151 # Show time details.
2.152
2.153 page.span(class_="time enabled")
2.154 - page.input(name="%s-hour" % name, type="text", value=default.get_hour(), maxlength=2, size=2)
2.155 - page.add(":")
2.156 - page.input(name="%s-minute" % name, type="text", value=default.get_minute(), maxlength=2, size=2)
2.157 - page.add(":")
2.158 - page.input(name="%s-second" % name, type="text", value=default.get_second(), maxlength=2, size=2)
2.159 +
2.160 + if read_only:
2.161 + page.span("%s:%s:%s" % (default.get_hour(), default.get_minute(), default.get_second()))
2.162 + page.input(name="%s-hour" % name, type="hidden", value=default.get_hour())
2.163 + page.input(name="%s-minute" % name, type="hidden", value=default.get_minute())
2.164 + page.input(name="%s-second" % name, type="hidden", value=default.get_second())
2.165 + else:
2.166 + page.input(name="%s-hour" % name, type="text", value=default.get_hour(), maxlength=2, size=2)
2.167 + page.add(":")
2.168 + page.input(name="%s-minute" % name, type="text", value=default.get_minute(), maxlength=2, size=2)
2.169 + page.add(":")
2.170 + page.input(name="%s-second" % name, type="text", value=default.get_second(), maxlength=2, size=2)
2.171 +
2.172 + # Show time zone details.
2.173
2.174 if show_tzid:
2.175 page.add(" ")
2.176 tzid = default.get_tzid() or self.get_tzid()
2.177 - self._show_timezone_menu("%s-tzid" % name, tzid, index)
2.178 +
2.179 + # Show a label if read-only or a menu otherwise.
2.180 +
2.181 + if read_only:
2.182 + page.input(name="%s-tzid" % name, type="hidden", value=tzid)
2.183 + page.span(tzid)
2.184 + else:
2.185 + self._show_timezone_menu("%s-tzid" % name, tzid, index)
2.186
2.187 page.span.close()
2.188