1.1 --- a/imiptools/data.py Wed Jul 29 18:41:11 2015 +0200
1.2 +++ b/imiptools/data.py Thu Jul 30 18:28:43 2015 +0200
1.3 @@ -92,6 +92,20 @@
1.4 dt, attr = t
1.5 return dt
1.6
1.7 + def set_datetime(self, name, dt, tzid):
1.8 +
1.9 + """
1.10 + Set a datetime for property 'name' using 'dt' and 'tzid', returning
1.11 + whether an update has occurred.
1.12 + """
1.13 +
1.14 + if dt:
1.15 + old_value = self.get_value(name)
1.16 + self[name] = [get_datetime_item(dt, tzid)]
1.17 + return format_datetime(dt) != old_value
1.18 +
1.19 + return False
1.20 +
1.21 def get_datetime_item(self, name):
1.22 return get_datetime_item(self.details, name)
1.23
1.24 @@ -134,8 +148,23 @@
1.25 # Computed results.
1.26
1.27 def get_periods(self, tzid, end):
1.28 +
1.29 + """
1.30 + Return periods defined by this object, employing the given 'tzid' where
1.31 + no time zone information is defined, and limiting the collection to a
1.32 + window of time with the given 'end'.
1.33 + """
1.34 +
1.35 return get_periods(self, tzid, end)
1.36
1.37 + def set_period(self, period):
1.38 +
1.39 + "Set the given 'period' as the main start and end."
1.40 +
1.41 + result = self.set_datetime("DTSTART", period.get_start(), period.start_attr().get("TZID"))
1.42 + result = self.set_datetime("DTEND", period.get_end(), period.end_attr().get("TZID")) or result
1.43 + return result
1.44 +
1.45 def get_tzid(self):
1.46
1.47 """
2.1 --- a/imiptools/handlers/common.py Wed Jul 29 18:41:11 2015 +0200
2.2 +++ b/imiptools/handlers/common.py Thu Jul 30 18:28:43 2015 +0200
2.3 @@ -56,10 +56,9 @@
2.4 if self.messenger:
2.5 attendee_attr["SENT-BY"] = get_uri(self.messenger.sender)
2.6
2.7 - tzid = self.obj.get_tzid() or self.get_tzid()
2.8 dtstart = self.obj.get_datetime("DTSTART")
2.9 dtend = self.obj.get_datetime("DTEND")
2.10 - period = dtstart and dtend and Period(dtstart, dtend, tzid) or None
2.11 + period = dtstart and dtend and Period(dtstart, dtend, self.get_tzid()) or None
2.12
2.13 rwrite(make_freebusy(freebusy, self.uid, organiser, organiser_attr, attendee, attendee_attr, period))
2.14
3.1 --- a/imiptools/handlers/person.py Wed Jul 29 18:41:11 2015 +0200
3.2 +++ b/imiptools/handlers/person.py Thu Jul 30 18:28:43 2015 +0200
3.3 @@ -140,10 +140,9 @@
3.4 except ValueError:
3.5 pass
3.6
3.7 - tzid = self.obj.get_tzid() or self.get_tzid()
3.8 dtstart = self.obj.get_datetime("DTSTART")
3.9 dtend = self.obj.get_datetime("DTEND")
3.10 - period = Period(dtstart, dtend, tzid)
3.11 + period = Period(dtstart, dtend, self.get_tzid())
3.12
3.13 for sender, sender_attr in senders:
3.14 stored_freebusy = self.store.get_freebusy_for_other(self.user, sender)
4.1 --- a/imiptools/period.py Wed Jul 29 18:41:11 2015 +0200
4.2 +++ b/imiptools/period.py Thu Jul 30 18:28:43 2015 +0200
4.3 @@ -37,6 +37,9 @@
4.4 """
4.5 Initialise a period with the given 'start' and 'end', having a
4.6 contextual 'tzid', if specified, and an indicated 'origin'.
4.7 +
4.8 + All metadata from the start and end points are derived from the supplied
4.9 + dates/datetimes.
4.10 """
4.11
4.12 self.start = isinstance(start, date) and start or get_datetime(start)
4.13 @@ -80,13 +83,19 @@
4.14 return self.end
4.15
4.16 def get_tzid(self):
4.17 - return self.tzid
4.18 + return get_tzid(self.get_start_attr(), self.get_end_attr()) or self.tzid
4.19 +
4.20 + def get_start_attr(self):
4.21 + return get_datetime_attributes(self.start, self.tzid)
4.22 +
4.23 + def get_end_attr(self):
4.24 + return get_datetime_attributes(self.end, self.tzid)
4.25
4.26 def get_start_item(self):
4.27 - return self.start, get_datetime_attributes(self.start, self.get_tzid())
4.28 + return self.get_start(), self.get_start_attr()
4.29
4.30 def get_end_item(self):
4.31 - return self.end, get_datetime_attributes(self.end, self.get_tzid())
4.32 + return self.get_end(), self.get_end_attr()
4.33
4.34 def get_start_point(self):
4.35 return to_utc_datetime(self.get_start(), self.get_tzid())
4.36 @@ -152,21 +161,21 @@
4.37
4.38 class RecurringPeriod(Period):
4.39
4.40 - "A period with iCalendar attribute and origin information from the object."
4.41 + """
4.42 + A period with iCalendar metadata attributes and origin information from an
4.43 + object.
4.44 + """
4.45
4.46 def __init__(self, start, end, tzid=None, origin=None, start_attr=None, end_attr=None):
4.47 Period.__init__(self, start, end, tzid, origin)
4.48 self.start_attr = start_attr
4.49 self.end_attr = end_attr
4.50
4.51 - def get_start_item(self):
4.52 - return self.get_start(), self.start_attr
4.53 + def get_start_attr(self):
4.54 + return self.start_attr
4.55
4.56 - def get_end_item(self):
4.57 - return self.get_end(), self.end_attr
4.58 -
4.59 - def get_tzid(self):
4.60 - return get_tzid(self.start_attr, self.end_attr) or self.tzid
4.61 + def get_end_attr(self):
4.62 + return self.end_attr
4.63
4.64 def as_tuple(self):
4.65 return self.start, self.end, self.tzid, self.origin, self.start_attr, self.end_attr
5.1 --- a/imipweb/data.py Wed Jul 29 18:41:11 2015 +0200
5.2 +++ b/imipweb/data.py Thu Jul 30 18:28:43 2015 +0200
5.3 @@ -89,7 +89,7 @@
5.4 dt, attr
5.5 )
5.6
5.7 -class FormPeriod:
5.8 +class FormPeriod(RecurringPeriod):
5.9
5.10 "A period whose information originates from a form."
5.11
5.12 @@ -107,36 +107,6 @@
5.13 def __repr__(self):
5.14 return "FormPeriod(%r)" % (self.as_tuple(),)
5.15
5.16 - def _get_start(self):
5.17 - return self.start.as_datetime(self.times_enabled), self.start.get_attributes(self.times_enabled)
5.18 -
5.19 - def _get_end(self):
5.20 -
5.21 - # Handle specified end datetimes.
5.22 -
5.23 - if self.end_enabled:
5.24 - dtend = self.end.as_datetime(self.times_enabled)
5.25 - dtend_attr = self.end.get_attributes(self.times_enabled)
5.26 - if not dtend:
5.27 - return None, None
5.28 -
5.29 - # Otherwise, treat the end date as the start date. Datetimes are
5.30 - # handled by making the event occupy the rest of the day.
5.31 -
5.32 - else:
5.33 - dtstart, dtstart_attr = self._get_start()
5.34 - if dtstart:
5.35 - dtend_attr = dtstart_attr
5.36 -
5.37 - if isinstance(dtstart, datetime):
5.38 - dtend = get_end_of_day(dtstart, dtstart_attr["TZID"])
5.39 - else:
5.40 - dtend = dtstart
5.41 - else:
5.42 - return None, None
5.43 -
5.44 - return dtend, dtend_attr
5.45 -
5.46 def as_event_period(self, index=None):
5.47
5.48 """
5.49 @@ -164,18 +134,37 @@
5.50 # Period data methods.
5.51
5.52 def get_start(self):
5.53 - dtstart, dtstart_attr = self._get_start()
5.54 - return dtstart
5.55 + return self.start.as_datetime(self.times_enabled)
5.56
5.57 def get_end(self):
5.58 - dtend, dtend_attr = self._get_end()
5.59 +
5.60 + # Handle specified end datetimes.
5.61 +
5.62 + if self.end_enabled:
5.63 + dtend = self.end.as_datetime(self.times_enabled)
5.64 + if not dtend:
5.65 + return None
5.66 +
5.67 + # Otherwise, treat the end date as the start date. Datetimes are
5.68 + # handled by making the event occupy the rest of the day.
5.69 +
5.70 + else:
5.71 + dtstart, dtstart_attr = self.get_start_item()
5.72 + if dtstart:
5.73 + if isinstance(dtstart, datetime):
5.74 + dtend = get_end_of_day(dtstart, dtstart_attr["TZID"])
5.75 + else:
5.76 + dtend = dtstart
5.77 + else:
5.78 + return None
5.79 +
5.80 return dtend
5.81
5.82 - def get_start_item(self):
5.83 - return self._get_start()
5.84 + def get_start_attr(self):
5.85 + return self.start.get_attributes(self.times_enabled)
5.86
5.87 - def get_end_item(self):
5.88 - return self._get_end()
5.89 + def get_end_attr(self):
5.90 + return self.end.get_attributes(self.times_enabled)
5.91
5.92 # Form data methods.
5.93
6.1 --- a/imipweb/event.py Wed Jul 29 18:41:11 2015 +0200
6.2 +++ b/imipweb/event.py Thu Jul 30 18:28:43 2015 +0200
6.3 @@ -165,7 +165,7 @@
6.4
6.5 to_unschedule = self.get_removed_periods()
6.6
6.7 - self.set_period_in_object(obj, period)
6.8 + obj.set_period(period)
6.9 self.set_periods_in_object(obj, periods)
6.10
6.11 # Update summary.
6.12 @@ -234,14 +234,6 @@
6.13
6.14 return None
6.15
6.16 - def set_period_in_object(self, obj, period):
6.17 -
6.18 - "Set in the given 'obj' the given 'period' as the main start and end."
6.19 -
6.20 - result = self.set_datetime_in_object(period.get_start(), period.start_attr and period.start_attr.get("TZID"), "DTSTART", obj)
6.21 - result = self.set_datetime_in_object(period.get_end(), period.end_attr and period.end_attr.get("TZID"), "DTEND", obj) or result
6.22 - return result
6.23 -
6.24 def set_periods_in_object(self, obj, periods):
6.25
6.26 "Set in the given 'obj' the given 'periods'."
6.27 @@ -263,20 +255,6 @@
6.28 # NOTE: To do: calculate the update status.
6.29 return update
6.30
6.31 - def set_datetime_in_object(self, dt, tzid, property, obj):
6.32 -
6.33 - """
6.34 - Set 'dt' and 'tzid' for the given 'property' in 'obj', returning whether
6.35 - an update has occurred.
6.36 - """
6.37 -
6.38 - if dt:
6.39 - old_value = obj.get_value(property)
6.40 - obj[property] = [get_datetime_item(dt, tzid)]
6.41 - return format_datetime(dt) != old_value
6.42 -
6.43 - return False
6.44 -
6.45 def handle_main_period(self):
6.46
6.47 "Return period details for the main start/end period in an event."