# HG changeset patch # User Paul Boddie # Date 1444946470 -7200 # Node ID a3f1230f9f42e4da84df47708c47c39044706d80 # Parent b50f43cd79f889fe32ff2bb03c225a1abb50db69 Introduced support for adding new recurrences, improving handling of bad period data in recurrences. diff -r b50f43cd79f8 -r a3f1230f9f42 imipweb/event.py --- a/imipweb/event.py Thu Oct 15 23:32:57 2015 +0200 +++ b/imipweb/event.py Fri Oct 16 00:01:10 2015 +0200 @@ -234,7 +234,7 @@ if name in "ATTENDEE": rowspan = len(attendees) + 1 elif name == "DTEND": - rowspan = 1 + rowspan = 2 elif not items: continue @@ -276,6 +276,16 @@ page.tr.close() + # After the end datetime, show a control to add recurrences. + + if name == "DTEND": + page.tr() + page.td() + self.control("recur-add", "submit", "add", id="recur-add", class_="add") + page.label("Add a recurrence", for_="recur-add", class_="add") + page.td.close() + page.tr.close() + # Handle the summary specially. elif name == "SUMMARY": @@ -482,8 +492,13 @@ page = self.page args = self.env.get_args() - p = event_period_from_period(period) - replaced = not recurrenceid and p.is_replaced(recurrenceids) + try: + p = event_period_from_period(period) + except PeriodError, exc: + replaced = False + errors = list(errors or []) + [exc.args] + else: + replaced = not recurrenceid and p.is_replaced(recurrenceids) # Isolate the controls from neighbouring tables. @@ -1143,7 +1158,10 @@ recurrences = self.get_recurrences_from_page() - # NOTE: Addition of recurrences to be supported. + if args.has_key("recur-add"): + period = self.get_current_main_period().as_form_period() + period.origin = "RDATE" + recurrences.append(period) # Only actually remove recurrences if the event is unsent, or if the # recurrence is new, but only for explicit recurrences. diff -r b50f43cd79f8 -r a3f1230f9f42 imipweb/resource.py --- a/imipweb/resource.py Thu Oct 15 23:32:57 2015 +0200 +++ b/imipweb/resource.py Fri Oct 16 00:01:10 2015 +0200 @@ -24,7 +24,8 @@ from imiptools.data import get_address, get_uri, uri_item, uri_values from imiptools.dates import format_datetime, get_recurrence_start_point, to_date from imiptools.period import remove_period, remove_affected_period -from imipweb.data import event_period_from_period, form_period_from_period, FormDate +from imipweb.data import event_period_from_period, form_period_from_period, \ + FormDate, PeriodError from imipweb.env import CGIEnvironment from urllib import urlencode import babel.dates @@ -654,20 +655,28 @@ _id = self.element_identifier _name = self.element_name - p = event_period_from_period(period) - replaced = not recurrenceid and p.is_replaced(recurrenceids) + try: + p = event_period_from_period(period) + except PeriodError, exc: + replaced = False + errors = exc.args + else: + replaced = not recurrenceid and p.is_replaced(recurrenceids) + errors = [] + + period = form_period_from_period(period) # Show controls for editing as organiser. - # NOTE: Allow attendees to edit datetimes for counter-proposals. if self.can_change_object() and not replaced: - page.td(class_="objectvalue dt%s" % (show_start and "start" or "end")) + error = errors and (show_start and ("dtstart", index) in errors or not show_start and ("dtend", index) in errors) and " error" or "" + page.td(class_="objectvalue dt%s%s" % (show_start and "start" or "end", error)) read_only = period.origin == "RRULE" if show_start: page.div(class_="dt enabled") - self.date_controls(_name("dtstart", "recur", index), p.get_form_start(), index=index, read_only=read_only) + self.date_controls(_name("dtstart", "recur", index), period.get_form_start(), index=index, read_only=read_only) if not read_only: page.br() page.label("Specify times", for_=_id("dttimes-enable", index), class_="time disabled enable") @@ -676,7 +685,7 @@ # Put the origin somewhere. - self.control("recur-origin", "hidden", p.origin or "") + self.control("recur-origin", "hidden", period.origin or "") else: page.div(class_="dt disabled") @@ -684,7 +693,7 @@ page.label("Specify end date", for_=_id("dtend-enable", index), class_="enable") page.div.close() page.div(class_="dt enabled") - self.date_controls(_name("dtend", "recur", index), p.get_form_end(), index=index, show_tzid=False, read_only=read_only) + self.date_controls(_name("dtend", "recur", index), period.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_=_id("dtend-enable", index), class_="disable") @@ -710,15 +719,25 @@ page = self.page - p = event_period_from_period(period) - replaced = not recurrenceid and p.is_replaced(recurrenceids) + try: + p = event_period_from_period(period) + except PeriodError, exc: + replaced = False + affected = False + errors = exc.args + else: + replaced = not recurrenceid and p.is_replaced(recurrenceids) + affected = p.is_affected(recurrenceid) + errors = [] + + period = form_period_from_period(period) css = " ".join([ replaced and "replaced" or "", - p.is_affected(recurrenceid) and "affected" or "" + affected and "affected" or "" ]) - formdate = show_start and p.get_form_start() or p.get_form_end() + formdate = show_start and period.get_form_start() or period.get_form_end() dt = formdate.as_datetime() if dt: page.td(self.format_datetime(dt, "long"), class_=css)