1.1 --- a/imipweb/resource.py Thu Oct 15 23:32:57 2015 +0200
1.2 +++ b/imipweb/resource.py Fri Oct 16 00:01:10 2015 +0200
1.3 @@ -24,7 +24,8 @@
1.4 from imiptools.data import get_address, get_uri, uri_item, uri_values
1.5 from imiptools.dates import format_datetime, get_recurrence_start_point, to_date
1.6 from imiptools.period import remove_period, remove_affected_period
1.7 -from imipweb.data import event_period_from_period, form_period_from_period, FormDate
1.8 +from imipweb.data import event_period_from_period, form_period_from_period, \
1.9 + FormDate, PeriodError
1.10 from imipweb.env import CGIEnvironment
1.11 from urllib import urlencode
1.12 import babel.dates
1.13 @@ -654,20 +655,28 @@
1.14 _id = self.element_identifier
1.15 _name = self.element_name
1.16
1.17 - p = event_period_from_period(period)
1.18 - replaced = not recurrenceid and p.is_replaced(recurrenceids)
1.19 + try:
1.20 + p = event_period_from_period(period)
1.21 + except PeriodError, exc:
1.22 + replaced = False
1.23 + errors = exc.args
1.24 + else:
1.25 + replaced = not recurrenceid and p.is_replaced(recurrenceids)
1.26 + errors = []
1.27 +
1.28 + period = form_period_from_period(period)
1.29
1.30 # Show controls for editing as organiser.
1.31 - # NOTE: Allow attendees to edit datetimes for counter-proposals.
1.32
1.33 if self.can_change_object() and not replaced:
1.34 - page.td(class_="objectvalue dt%s" % (show_start and "start" or "end"))
1.35 + error = errors and (show_start and ("dtstart", index) in errors or not show_start and ("dtend", index) in errors) and " error" or ""
1.36 + page.td(class_="objectvalue dt%s%s" % (show_start and "start" or "end", error))
1.37
1.38 read_only = period.origin == "RRULE"
1.39
1.40 if show_start:
1.41 page.div(class_="dt enabled")
1.42 - self.date_controls(_name("dtstart", "recur", index), p.get_form_start(), index=index, read_only=read_only)
1.43 + self.date_controls(_name("dtstart", "recur", index), period.get_form_start(), index=index, read_only=read_only)
1.44 if not read_only:
1.45 page.br()
1.46 page.label("Specify times", for_=_id("dttimes-enable", index), class_="time disabled enable")
1.47 @@ -676,7 +685,7 @@
1.48
1.49 # Put the origin somewhere.
1.50
1.51 - self.control("recur-origin", "hidden", p.origin or "")
1.52 + self.control("recur-origin", "hidden", period.origin or "")
1.53
1.54 else:
1.55 page.div(class_="dt disabled")
1.56 @@ -684,7 +693,7 @@
1.57 page.label("Specify end date", for_=_id("dtend-enable", index), class_="enable")
1.58 page.div.close()
1.59 page.div(class_="dt enabled")
1.60 - self.date_controls(_name("dtend", "recur", index), p.get_form_end(), index=index, show_tzid=False, read_only=read_only)
1.61 + self.date_controls(_name("dtend", "recur", index), period.get_form_end(), index=index, show_tzid=False, read_only=read_only)
1.62 if not read_only:
1.63 page.br()
1.64 page.label("End on same day", for_=_id("dtend-enable", index), class_="disable")
1.65 @@ -710,15 +719,25 @@
1.66
1.67 page = self.page
1.68
1.69 - p = event_period_from_period(period)
1.70 - replaced = not recurrenceid and p.is_replaced(recurrenceids)
1.71 + try:
1.72 + p = event_period_from_period(period)
1.73 + except PeriodError, exc:
1.74 + replaced = False
1.75 + affected = False
1.76 + errors = exc.args
1.77 + else:
1.78 + replaced = not recurrenceid and p.is_replaced(recurrenceids)
1.79 + affected = p.is_affected(recurrenceid)
1.80 + errors = []
1.81 +
1.82 + period = form_period_from_period(period)
1.83
1.84 css = " ".join([
1.85 replaced and "replaced" or "",
1.86 - p.is_affected(recurrenceid) and "affected" or ""
1.87 + affected and "affected" or ""
1.88 ])
1.89
1.90 - formdate = show_start and p.get_form_start() or p.get_form_end()
1.91 + formdate = show_start and period.get_form_start() or period.get_form_end()
1.92 dt = formdate.as_datetime()
1.93 if dt:
1.94 page.td(self.format_datetime(dt, "long"), class_=css)