1.1 --- a/imipweb/event.py Fri May 15 22:09:02 2015 +0200
1.2 +++ b/imipweb/event.py Sat May 16 01:03:51 2015 +0200
1.3 @@ -24,9 +24,9 @@
1.4 from imiptools.data import get_uri, uri_dict, uri_values
1.5 from imiptools.dates import format_datetime, to_date, get_datetime, \
1.6 get_datetime_item, get_period_item, \
1.7 - to_timezone
1.8 + to_timezone, to_utc_datetime
1.9 from imiptools.mail import Messenger
1.10 -from imiptools.period import have_conflict
1.11 +from imiptools.period import convert_periods, have_conflict
1.12 from imipweb.data import EventPeriod, \
1.13 event_period_from_period, form_period_from_period, \
1.14 FormDate, FormPeriod, PeriodError
1.15 @@ -64,6 +64,17 @@
1.16 def is_organiser(self, obj):
1.17 return get_uri(obj.get_value("ORGANIZER")) == self.user
1.18
1.19 + def get_recurrence_key(self, period):
1.20 + return format_datetime(to_utc_datetime(period.get_start(), self.get_tzid()))
1.21 +
1.22 + def is_replaced(self, period, recurrenceids):
1.23 + start_utc = self.get_recurrence_key(period)
1.24 + return recurrenceids and start_utc in recurrenceids and "replaced" or ""
1.25 +
1.26 + def is_affected(self, period, recurrenceid):
1.27 + start_utc = self.get_recurrence_key(period)
1.28 + return recurrenceid and start_utc == recurrenceid and "affected" or ""
1.29 +
1.30 # Request logic methods.
1.31
1.32 def handle_request(self, uid, recurrenceid, obj):
1.33 @@ -526,8 +537,7 @@
1.34
1.35 recurrenceid = format_datetime(obj.get_utc_datetime("RECURRENCE-ID"))
1.36 recurrenceids = self._get_recurrences(uid)
1.37 - start_utc = format_datetime(to_timezone(p.get_start(), "UTC"))
1.38 - replaced = not recurrenceid and recurrenceids and start_utc in recurrenceids
1.39 + replaced = self.is_replaced(p, recurrenceids)
1.40
1.41 # Provide a summary of the object.
1.42
1.43 @@ -570,7 +580,7 @@
1.44
1.45 elif name == "DTSTART":
1.46 page.td(class_="objectvalue %s replaced" % field, rowspan=2)
1.47 - page.a("First occurrence replaced by a separate event", href=self.link_to(uid, start_utc))
1.48 + page.a("First occurrence replaced by a separate event", href=self.link_to(uid, self.get_recurrence_key(p)))
1.49 page.td.close()
1.50
1.51 page.tr.close()
1.52 @@ -778,6 +788,9 @@
1.53
1.54 sequence = obj.get_value("SEQUENCE")
1.55
1.56 + p = event_period_from_period(period)
1.57 + replaced = self.is_replaced(p, recurrenceids)
1.58 +
1.59 # Isolate the controls from neighbouring tables.
1.60
1.61 page.div()
1.62 @@ -801,18 +814,21 @@
1.63
1.64 # Permit the removal of recurrences.
1.65
1.66 - page.tr()
1.67 - page.th("")
1.68 - page.td()
1.69 + if not replaced:
1.70 + page.tr()
1.71 + page.th("")
1.72 + page.td()
1.73
1.74 - remove_type = sequence is None or not period.origin and "submit" or "checkbox"
1.75 - self._control("recur-remove", remove_type, str(index), str(index) in args.get("recur-remove", []), id="recur-remove-%d" % index, class_="remove")
1.76 + remove_type = sequence is None or not period.origin and "submit" or "checkbox"
1.77 + self._control("recur-remove", remove_type, str(index),
1.78 + str(index) in args.get("recur-remove", []),
1.79 + id="recur-remove-%d" % index, class_="remove")
1.80
1.81 - page.label("Remove", for_="recur-remove-%d" % index, class_="remove")
1.82 - page.label("Removed", for_="recur-remove-%d" % index, class_="removed")
1.83 + page.label("Remove", for_="recur-remove-%d" % index, class_="remove")
1.84 + page.label("Removed", for_="recur-remove-%d" % index, class_="removed")
1.85
1.86 - page.td.close()
1.87 - page.tr.close()
1.88 + page.td.close()
1.89 + page.tr.close()
1.90
1.91 page.tbody.close()
1.92 page.table.close()
1.93 @@ -828,6 +844,7 @@
1.94
1.95 page = self.page
1.96 recurrenceid = format_datetime(obj.get_utc_datetime("RECURRENCE-ID"))
1.97 + recurrenceids = self._get_recurrences(uid)
1.98
1.99 # Obtain the user's timezone.
1.100
1.101 @@ -855,6 +872,10 @@
1.102 # Show any conflicts with periods of actual attendance.
1.103
1.104 for p in have_conflict(freebusy, periods, True):
1.105 + period = event_period_from_period(p)
1.106 + convert_periods([period], tzid)
1.107 + if self.is_replaced(period, recurrenceids):
1.108 + continue
1.109 if (p.uid != uid or (recurrenceid and p.recurrenceid) and p.recurrenceid != recurrenceid) and p.transp != "ORG":
1.110 conflicts.append(p)
1.111
1.112 @@ -990,9 +1011,8 @@
1.113 # Show a label as attendee.
1.114
1.115 else:
1.116 - t = formdate.as_datetime_item()
1.117 - if t:
1.118 - dt, attr = t
1.119 + dt = formdate.as_datetime()
1.120 + if dt:
1.121 page.td(self.format_datetime(dt, "full"))
1.122 else:
1.123 page.td("(Unrecognised date)")
1.124 @@ -1015,9 +1035,7 @@
1.125 ssn = self._simple_suffixed_name
1.126
1.127 p = event_period_from_period(period)
1.128 -
1.129 - start_utc = format_datetime(to_timezone(p.get_start(), "UTC"))
1.130 - replaced = recurrenceids and start_utc in recurrenceids and "replaced" or ""
1.131 + replaced = self.is_replaced(p, recurrenceids)
1.132
1.133 # Show controls for editing as organiser.
1.134
1.135 @@ -1072,18 +1090,16 @@
1.136 page = self.page
1.137
1.138 p = event_period_from_period(period)
1.139 + replaced = self.is_replaced(p, recurrenceids)
1.140
1.141 - start_utc = format_datetime(to_timezone(p.get_start(), "UTC"))
1.142 - replaced = recurrenceids and start_utc in recurrenceids and "replaced" or ""
1.143 css = " ".join([
1.144 replaced,
1.145 - recurrenceid and start_utc == recurrenceid and "affected" or ""
1.146 + self.is_affected(p, recurrenceid)
1.147 ])
1.148
1.149 formdate = show_start and p.get_form_start() or p.get_form_end()
1.150 - t = formdate.as_datetime_item()
1.151 - if t:
1.152 - dt, attr = t
1.153 + dt = formdate.as_datetime()
1.154 + if dt:
1.155 page.td(self.format_datetime(dt, "long"), class_=css)
1.156 else:
1.157 page.td("(Unrecognised date)")
1.158 @@ -1172,10 +1188,8 @@
1.159
1.160 # Show dates for up to one week around the current date.
1.161
1.162 - t = default.as_datetime_item()
1.163 - if t:
1.164 - dt, attr = t
1.165 - else:
1.166 + dt = default.as_datetime()
1.167 + if not dt:
1.168 dt = date.today()
1.169
1.170 base = to_date(dt)