1.1 --- a/imipweb/data.py Mon Apr 06 22:57:23 2015 +0200
1.2 +++ b/imipweb/data.py Tue Apr 07 00:36:47 2015 +0200
1.3 @@ -33,43 +33,48 @@
1.4 intended to represent information obtained from an iCalendar resource.
1.5 """
1.6
1.7 - def __init__(self, start, end, start_attr=None, end_attr=None, form_start=None, form_end=None):
1.8 + def __init__(self, start, end, start_attr=None, end_attr=None, form_start=None, form_end=None, origin=None):
1.9 Period.__init__(self, start, end)
1.10 self.start_attr = start_attr
1.11 self.end_attr = end_attr
1.12 self.form_start = form_start
1.13 self.form_end = form_end
1.14 + self.origin = origin
1.15
1.16 def as_tuple(self):
1.17 - return self.start, self.end, self.start_attr, self.end_attr, self.form_start, self.form_end
1.18 + return self.start, self.end, self.start_attr, self.end_attr, self.form_start, self.form_end, self.origin
1.19
1.20 def __repr__(self):
1.21 - return "EventPeriod(%r, %r, %r, %r, %r, %r)" % self.as_tuple()
1.22 + return "EventPeriod(%r, %r, %r, %r, %r, %r, %r)" % self.as_tuple()
1.23 +
1.24 + def as_event_period(self):
1.25 + return self
1.26 +
1.27 + # Period data methods.
1.28
1.29 def get_start(self):
1.30 return self.start
1.31
1.32 def get_end(self):
1.33 - return self.end
1.34 + return end_date_from_calendar(self.end)
1.35
1.36 - def as_event_period(self):
1.37 - return self
1.38 + # Form data compatibility methods.
1.39
1.40 def get_form_start(self):
1.41 if not self.form_start:
1.42 - self.form_start = self.get_form_date(self.start, self.start_attr)
1.43 + self.form_start = self.get_form_date(self.get_start(), self.start_attr)
1.44 return self.form_start
1.45
1.46 def get_form_end(self):
1.47 if not self.form_end:
1.48 - self.form_end = self.get_form_date(self.end, self.end_attr)
1.49 + self.form_end = self.get_form_date(self.get_end(), self.end_attr)
1.50 return self.form_end
1.51
1.52 def as_form_period(self):
1.53 return FormPeriod(
1.54 - self.get_form_date(self.start, self.start_attr),
1.55 - self.get_form_date(self.end, self.end_attr),
1.56 - isinstance(self.end, datetime) or self.start != self.end - timedelta(1),
1.57 + self.get_form_start(),
1.58 + self.get_form_end(),
1.59 + isinstance(self.end, datetime) or self.get_start() != self.get_end(),
1.60 isinstance(self.start, datetime) or isinstance(self.end, datetime)
1.61 )
1.62
1.63 @@ -83,24 +88,22 @@
1.64 dt, attr
1.65 )
1.66
1.67 -def event_period_from_recurrence_period(period):
1.68 - return EventPeriod(period.start, period.end, period.start_attr, period.end_attr)
1.69 -
1.70 class FormPeriod:
1.71
1.72 "A period whose information originates from a form."
1.73
1.74 - def __init__(self, start, end, end_enabled=True, times_enabled=True):
1.75 + def __init__(self, start, end, end_enabled=True, times_enabled=True, origin=None):
1.76 self.start = start
1.77 self.end = end
1.78 self.end_enabled = end_enabled
1.79 self.times_enabled = times_enabled
1.80 + self.origin = origin
1.81
1.82 def as_tuple(self):
1.83 - return self.start, self.end, self.end_enabled, self.times_enabled
1.84 + return self.start, self.end, self.end_enabled, self.times_enabled, self.origin
1.85
1.86 def __repr__(self):
1.87 - return "FormPeriod(%r, %r, %r, %r)" % self.as_tuple()
1.88 + return "FormPeriod(%r, %r, %r, %r, %r)" % self.as_tuple()
1.89
1.90 def _get_start(self):
1.91 t = self.start.as_datetime_item(self.times_enabled)
1.92 @@ -109,7 +112,7 @@
1.93 else:
1.94 return None
1.95
1.96 - def _get_end(self):
1.97 + def _get_end(self, adjust=False):
1.98
1.99 # Handle specified end datetimes.
1.100
1.101 @@ -117,6 +120,7 @@
1.102 t = self.end.as_datetime_item(self.times_enabled)
1.103 if t:
1.104 dtend, dtend_attr = t
1.105 + dtend = adjust and end_date_to_calendar(dtend) or dtend
1.106 else:
1.107 return None
1.108
1.109 @@ -137,6 +141,29 @@
1.110
1.111 return dtend, dtend_attr
1.112
1.113 + def as_event_period(self, index=None):
1.114 + t = self._get_start()
1.115 + if t:
1.116 + dtstart, dtstart_attr = t
1.117 + else:
1.118 + raise PeriodError(*[index is not None and ("dtstart", index) or "dtstart"])
1.119 +
1.120 + t = self._get_end(adjust=True)
1.121 + if t:
1.122 + dtend, dtend_attr = t
1.123 + else:
1.124 + raise PeriodError(*[index is not None and ("dtend", index) or "dtend"])
1.125 +
1.126 + if dtstart > dtend:
1.127 + raise PeriodError(*[
1.128 + index is not None and ("dtstart", index) or "dtstart",
1.129 + index is not None and ("dtend", index) or "dtend"
1.130 + ])
1.131 +
1.132 + return EventPeriod(dtstart, dtend, dtstart_attr, dtend_attr, self.start, self.end)
1.133 +
1.134 + # Period data methods.
1.135 +
1.136 def get_start(self):
1.137 t = self._get_start()
1.138 if t:
1.139 @@ -153,26 +180,7 @@
1.140 else:
1.141 return None
1.142
1.143 - def as_event_period(self, index=None):
1.144 - t = self._get_start()
1.145 - if t:
1.146 - dtstart, dtstart_attr = t
1.147 - else:
1.148 - raise PeriodError(*[index is not None and ("dtstart", index) or "dtstart"])
1.149 -
1.150 - t = self._get_end()
1.151 - if t:
1.152 - dtend, dtend_attr = t
1.153 - else:
1.154 - raise PeriodError(*[index is not None and ("dtend", index) or "dtend"])
1.155 -
1.156 - if dtstart > dtend:
1.157 - raise PeriodError(*[
1.158 - index is not None and ("dtstart", index) or "dtstart",
1.159 - index is not None and ("dtend", index) or "dtend"
1.160 - ])
1.161 -
1.162 - return EventPeriod(dtstart, dtend, dtstart_attr, dtend_attr, self.start, self.end)
1.163 + # Form data methods.
1.164
1.165 def get_form_start(self):
1.166 return self.start
1.167 @@ -291,4 +299,20 @@
1.168 else:
1.169 return dt
1.170
1.171 +def event_period_from_period(period):
1.172 + if isinstance(period, EventPeriod):
1.173 + return period
1.174 + elif isinstance(period, FormPeriod):
1.175 + return period.as_event_period()
1.176 + else:
1.177 + return EventPeriod(period.start, period.end, period.start_attr, period.end_attr, origin=period.origin)
1.178 +
1.179 +def form_period_from_period(period):
1.180 + if isinstance(period, EventPeriod):
1.181 + return period.as_form_period()
1.182 + elif isinstance(period, FormPeriod):
1.183 + return period
1.184 + else:
1.185 + return event_period_from_period(period).as_form_period()
1.186 +
1.187 # vim: tabstop=4 expandtab shiftwidth=4