# HG changeset patch # User Paul Boddie # Date 1428278848 -7200 # Node ID b16031755c2f71ecca87da154f4f6cbb84157b85 # Parent 626175542bdca78ca75c516c472362e08d235cdd Introduced an event period abstraction and tidied up period saving. diff -r 626175542bdc -r b16031755c2f imipweb/event.py --- a/imipweb/event.py Mon Apr 06 00:39:51 2015 +0200 +++ b/imipweb/event.py Mon Apr 06 02:07:28 2015 +0200 @@ -26,11 +26,26 @@ get_datetime_item, get_period_item, \ get_start_of_day, to_timezone from imiptools.mail import Messenger -from imiptools.period import have_conflict +from imiptools.period import have_conflict, Period from imipweb.handler import ManagerHandler from imipweb.resource import Resource import pytz +class EventPeriod(Period): + + "A simple period plus attribute details, compatible with RecurringPeriod." + + def __init__(self, start, end, start_attr=None, end_attr=None): + Period.__init__(self, start, end) + self.start_attr = start_attr + self.end_attr = end_attr + + def as_tuple(self): + return self.start, self.end, self.start_attr, self.end_attr + + def __repr__(self): + return "EventPeriod(%r, %r, %r, %r)" % self.as_tuple() + class EventPage(Resource): "A request handler for the event page." @@ -95,15 +110,7 @@ self.redirect(self.env.get_path()) return None - # Obtain the user's timezone and process datetime values. - update = False - periods = None - - if self.is_organiser(obj): - periods, errors = self.handle_all_period_controls() - if errors: - return errors # Update the object. @@ -115,9 +122,16 @@ # Update time periods (main and recurring). - if periods: - self.set_period_in_object(obj, periods[0]) - self.set_periods_in_object(obj, periods[1:]) + period, errors = self.handle_main_period() + if errors: + return errors + + periods, errors = self.handle_recurrence_periods() + if errors: + return errors + + self.set_period_in_object(obj, period) + self.set_periods_in_object(obj, periods) # Update summary. @@ -179,24 +193,7 @@ return None - def handle_all_period_controls(self): - - """ - Handle datetime controls for all periods, including the main period for - an event as well as any recurring periods. - """ - - period, errors = self.handle_main_period_controls() - if errors: - return None, errors - - periods, errors = self.handle_recurrence_period_controls() - if errors: - return None, errors - - return ([period] + periods), None - - def handle_main_period_controls(self): + def handle_main_period(self): "Return period details for the main start/end period in an event." @@ -214,7 +211,7 @@ else: return period, errors - def handle_recurrence_period_controls(self): + def handle_recurrence_periods(self): "Return period details for the recurrences specified for an event." @@ -226,20 +223,19 @@ all_end_values = self.get_date_control_values("dtend-recur", multiple=True, tzid_name="dtstart-recur") periods = [] + errors = [] for index, (start_values, end_values, dtend_enabled, dttimes_enabled) in \ enumerate(map(None, all_start_values, all_end_values, all_dtend_enabled, all_dttimes_enabled)): dtend_enabled = str(index) in all_dtend_enabled dttimes_enabled = str(index) in all_dttimes_enabled - period, errors = self.handle_period_controls(start_values, end_values, dtend_enabled, dttimes_enabled, index) - - if errors: - return None, errors + period, _errors = self.handle_period_controls(start_values, end_values, dtend_enabled, dttimes_enabled, index) periods.append(period) + errors += _errors - return periods, None + return periods, errors def handle_period_controls(self, start_values, end_values, dtend_enabled, dttimes_enabled, index=None): @@ -287,7 +283,7 @@ index is not None and ("dtend", index) or "dtend" ] - return ((dtstart, dtstart_attr), (dtend, dtend_attr)), None + return EventPeriod(dtstart, dtend, dtstart_attr, dtend_attr), None def handle_date_control_values(self, values, with_time=True): @@ -368,10 +364,9 @@ "Set in the given 'obj' the given 'period' as the main start and end." - (dtstart, dtstart_attr), (dtend, dtend_attr) = period - - result = self.set_datetime_in_object(dtstart, dtstart_attr.get("TZID"), "DTSTART", obj) - result = self.set_datetime_in_object(dtend, dtend_attr.get("TZID"), "DTEND", obj) or result + p = period + result = self.set_datetime_in_object(p.start, p.start_attr and p.start_attr.get("TZID"), "DTSTART", obj) + result = self.set_datetime_in_object(p.end, p.end_attr and p.end_attr.get("TZID"), "DTEND", obj) or result return result def set_periods_in_object(self, obj, periods): @@ -386,10 +381,9 @@ if obj.has_key("RDATE"): del obj["RDATE"] - for period in periods: - (dtstart, dtstart_attr), (dtend, dtend_attr) = period - tzid = dtstart_attr.get("TZID") or dtend_attr.get("TZID") - new_rdates.append(get_period_item(dtstart, dtend, tzid)) + for p in periods: + tzid = p.start_attr and p.start_attr.get("TZID") or p.end_attr and p.end_attr.get("TZID") + new_rdates.append(get_period_item(p.start, p.end, tzid)) obj["RDATE"] = new_rdates