1.1 --- a/imiptools/data.py Tue Feb 10 21:53:52 2015 +0100
1.2 +++ b/imiptools/data.py Tue Feb 10 23:13:06 2015 +0100
1.3 @@ -22,7 +22,7 @@
1.4 from datetime import datetime, timedelta
1.5 from email.mime.text import MIMEText
1.6 from imiptools.dates import format_datetime, get_datetime, get_freebusy_period, \
1.7 - to_utc_datetime
1.8 + to_timezone, to_utc_datetime
1.9 from pytz import timezone
1.10 from vCalendar import iterwrite, parse, ParseError, to_dict, to_node
1.11 from vRecurrence import get_parameters, get_rule
1.12 @@ -58,6 +58,10 @@
1.13 def get_utc_datetime(self, name):
1.14 return get_utc_datetime(self.details, name)
1.15
1.16 + def get_datetime(self, name):
1.17 + dt, attr = get_datetime_item(self.details, name)
1.18 + return dt
1.19 +
1.20 def get_datetime_item(self, name):
1.21 return get_datetime_item(self.details, name)
1.22
1.23 @@ -80,11 +84,11 @@
1.24
1.25 # Computed results.
1.26
1.27 - def get_periods(self, window_size=100):
1.28 - return get_periods(self, window_size)
1.29 + def get_periods(self, tzid, window_size=100):
1.30 + return get_periods(self, tzid, window_size)
1.31
1.32 def get_periods_for_freebusy(self, tzid, window_size=100):
1.33 - periods = self.get_periods(window_size)
1.34 + periods = self.get_periods(tzid, window_size)
1.35 return get_periods_for_freebusy(self, periods, tzid)
1.36
1.37 # Construction and serialisation.
1.38 @@ -287,15 +291,26 @@
1.39 # NOTE: Need to expose the 100 day window for recurring events in the
1.40 # NOTE: configuration.
1.41
1.42 -def get_periods(obj, window_size=100):
1.43 +def get_periods(obj, tzid, window_size=100):
1.44
1.45 """
1.46 Return periods for the given object 'obj', confining materialised periods
1.47 to the given 'window_size' in days starting from the present moment.
1.48 """
1.49
1.50 - dtstart = obj.get_utc_datetime("DTSTART")
1.51 - dtend = obj.get_utc_datetime("DTEND")
1.52 + # NOTE: Need also RDATE and EXDATE support.
1.53 +
1.54 + rrule = obj.get_value("RRULE")
1.55 +
1.56 + if not rrule:
1.57 + return [(obj.get_utc_datetime("DTSTART"), obj.get_utc_datetime("DTEND"))]
1.58 +
1.59 + # Use localised datetimes.
1.60 +
1.61 + dtstart, start_attr = obj.get_datetime_item("DTSTART")
1.62 + dtend, end_attr = obj.get_datetime_item("DTEND")
1.63 +
1.64 + tzid = start_attr.get("TZID") or end_attr.get("TZID") or tzid
1.65
1.66 # NOTE: Need also DURATION support.
1.67
1.68 @@ -306,22 +321,17 @@
1.69 # for the agent, with instances outside that period being considered
1.70 # unchecked.
1.71
1.72 - window_end = datetime.now() + timedelta(window_size)
1.73 + window_end = to_timezone(datetime.now(), tzid) + timedelta(window_size)
1.74
1.75 - # NOTE: Need also RDATE and EXDATE support.
1.76 -
1.77 - rrule = obj.get_value("RRULE")
1.78 + selector = get_rule(dtstart, rrule)
1.79 + parameters = get_parameters(rrule)
1.80 + periods = []
1.81
1.82 - if rrule:
1.83 - selector = get_rule(dtstart, rrule)
1.84 - parameters = get_parameters(rrule)
1.85 - periods = []
1.86 - for start in selector.materialise(dtstart, window_end, parameters.get("COUNT"), parameters.get("BYSETPOS")):
1.87 - start = datetime(*start, tzinfo=timezone("UTC"))
1.88 - end = start + duration
1.89 - periods.append((start, end))
1.90 - else:
1.91 - periods = [(dtstart, dtend)]
1.92 + for start in selector.materialise(dtstart, window_end, parameters.get("COUNT"), parameters.get("BYSETPOS")):
1.93 + start = to_timezone(datetime(*start), tzid)
1.94 + start = to_timezone(start, "UTC")
1.95 + end = start + duration
1.96 + periods.append((start, end))
1.97
1.98 return periods
1.99