1.1 --- a/imipweb/event.py Mon Apr 06 00:39:51 2015 +0200
1.2 +++ b/imipweb/event.py Mon Apr 06 02:07:28 2015 +0200
1.3 @@ -26,11 +26,26 @@
1.4 get_datetime_item, get_period_item, \
1.5 get_start_of_day, to_timezone
1.6 from imiptools.mail import Messenger
1.7 -from imiptools.period import have_conflict
1.8 +from imiptools.period import have_conflict, Period
1.9 from imipweb.handler import ManagerHandler
1.10 from imipweb.resource import Resource
1.11 import pytz
1.12
1.13 +class EventPeriod(Period):
1.14 +
1.15 + "A simple period plus attribute details, compatible with RecurringPeriod."
1.16 +
1.17 + def __init__(self, start, end, start_attr=None, end_attr=None):
1.18 + Period.__init__(self, start, end)
1.19 + self.start_attr = start_attr
1.20 + self.end_attr = end_attr
1.21 +
1.22 + def as_tuple(self):
1.23 + return self.start, self.end, self.start_attr, self.end_attr
1.24 +
1.25 + def __repr__(self):
1.26 + return "EventPeriod(%r, %r, %r, %r)" % self.as_tuple()
1.27 +
1.28 class EventPage(Resource):
1.29
1.30 "A request handler for the event page."
1.31 @@ -95,15 +110,7 @@
1.32 self.redirect(self.env.get_path())
1.33 return None
1.34
1.35 - # Obtain the user's timezone and process datetime values.
1.36 -
1.37 update = False
1.38 - periods = None
1.39 -
1.40 - if self.is_organiser(obj):
1.41 - periods, errors = self.handle_all_period_controls()
1.42 - if errors:
1.43 - return errors
1.44
1.45 # Update the object.
1.46
1.47 @@ -115,9 +122,16 @@
1.48
1.49 # Update time periods (main and recurring).
1.50
1.51 - if periods:
1.52 - self.set_period_in_object(obj, periods[0])
1.53 - self.set_periods_in_object(obj, periods[1:])
1.54 + period, errors = self.handle_main_period()
1.55 + if errors:
1.56 + return errors
1.57 +
1.58 + periods, errors = self.handle_recurrence_periods()
1.59 + if errors:
1.60 + return errors
1.61 +
1.62 + self.set_period_in_object(obj, period)
1.63 + self.set_periods_in_object(obj, periods)
1.64
1.65 # Update summary.
1.66
1.67 @@ -179,24 +193,7 @@
1.68
1.69 return None
1.70
1.71 - def handle_all_period_controls(self):
1.72 -
1.73 - """
1.74 - Handle datetime controls for all periods, including the main period for
1.75 - an event as well as any recurring periods.
1.76 - """
1.77 -
1.78 - period, errors = self.handle_main_period_controls()
1.79 - if errors:
1.80 - return None, errors
1.81 -
1.82 - periods, errors = self.handle_recurrence_period_controls()
1.83 - if errors:
1.84 - return None, errors
1.85 -
1.86 - return ([period] + periods), None
1.87 -
1.88 - def handle_main_period_controls(self):
1.89 + def handle_main_period(self):
1.90
1.91 "Return period details for the main start/end period in an event."
1.92
1.93 @@ -214,7 +211,7 @@
1.94 else:
1.95 return period, errors
1.96
1.97 - def handle_recurrence_period_controls(self):
1.98 + def handle_recurrence_periods(self):
1.99
1.100 "Return period details for the recurrences specified for an event."
1.101
1.102 @@ -226,20 +223,19 @@
1.103 all_end_values = self.get_date_control_values("dtend-recur", multiple=True, tzid_name="dtstart-recur")
1.104
1.105 periods = []
1.106 + errors = []
1.107
1.108 for index, (start_values, end_values, dtend_enabled, dttimes_enabled) in \
1.109 enumerate(map(None, all_start_values, all_end_values, all_dtend_enabled, all_dttimes_enabled)):
1.110
1.111 dtend_enabled = str(index) in all_dtend_enabled
1.112 dttimes_enabled = str(index) in all_dttimes_enabled
1.113 - period, errors = self.handle_period_controls(start_values, end_values, dtend_enabled, dttimes_enabled, index)
1.114 -
1.115 - if errors:
1.116 - return None, errors
1.117 + period, _errors = self.handle_period_controls(start_values, end_values, dtend_enabled, dttimes_enabled, index)
1.118
1.119 periods.append(period)
1.120 + errors += _errors
1.121
1.122 - return periods, None
1.123 + return periods, errors
1.124
1.125 def handle_period_controls(self, start_values, end_values, dtend_enabled, dttimes_enabled, index=None):
1.126
1.127 @@ -287,7 +283,7 @@
1.128 index is not None and ("dtend", index) or "dtend"
1.129 ]
1.130
1.131 - return ((dtstart, dtstart_attr), (dtend, dtend_attr)), None
1.132 + return EventPeriod(dtstart, dtend, dtstart_attr, dtend_attr), None
1.133
1.134 def handle_date_control_values(self, values, with_time=True):
1.135
1.136 @@ -368,10 +364,9 @@
1.137
1.138 "Set in the given 'obj' the given 'period' as the main start and end."
1.139
1.140 - (dtstart, dtstart_attr), (dtend, dtend_attr) = period
1.141 -
1.142 - result = self.set_datetime_in_object(dtstart, dtstart_attr.get("TZID"), "DTSTART", obj)
1.143 - result = self.set_datetime_in_object(dtend, dtend_attr.get("TZID"), "DTEND", obj) or result
1.144 + p = period
1.145 + result = self.set_datetime_in_object(p.start, p.start_attr and p.start_attr.get("TZID"), "DTSTART", obj)
1.146 + result = self.set_datetime_in_object(p.end, p.end_attr and p.end_attr.get("TZID"), "DTEND", obj) or result
1.147 return result
1.148
1.149 def set_periods_in_object(self, obj, periods):
1.150 @@ -386,10 +381,9 @@
1.151 if obj.has_key("RDATE"):
1.152 del obj["RDATE"]
1.153
1.154 - for period in periods:
1.155 - (dtstart, dtstart_attr), (dtend, dtend_attr) = period
1.156 - tzid = dtstart_attr.get("TZID") or dtend_attr.get("TZID")
1.157 - new_rdates.append(get_period_item(dtstart, dtend, tzid))
1.158 + for p in periods:
1.159 + tzid = p.start_attr and p.start_attr.get("TZID") or p.end_attr and p.end_attr.get("TZID")
1.160 + new_rdates.append(get_period_item(p.start, p.end, tzid))
1.161
1.162 obj["RDATE"] = new_rdates
1.163