1.1 --- a/imiptools/data.py Thu Aug 06 22:00:45 2015 +0200
1.2 +++ b/imiptools/data.py Sun Aug 09 22:57:29 2015 +0200
1.3 @@ -174,6 +174,27 @@
1.4
1.5 # Computed results.
1.6
1.7 + def get_main_period_items(self, tzid):
1.8 +
1.9 + """
1.10 + Return two (value, attributes) items corresponding to the main start-end
1.11 + period for the object.
1.12 + """
1.13 +
1.14 + dtstart, dtstart_attr = self.get_datetime_item("DTSTART")
1.15 +
1.16 + if self.has_key("DTEND"):
1.17 + dtend, dtend_attr = self.get_datetime_item("DTEND")
1.18 + duration = dtend - dtstart
1.19 + elif self.has_key("DURATION"):
1.20 + duration = self.get_duration("DURATION")
1.21 + dtend = dtstart + duration
1.22 + dtend_attr = dtstart_attr
1.23 + else:
1.24 + dtend, dtend_attr = dtstart, dtstart_attr
1.25 +
1.26 + return (dtstart, dtstart_attr), (dtend, dtend_attr)
1.27 +
1.28 def get_periods(self, tzid, end=None):
1.29
1.30 """
1.31 @@ -294,6 +315,33 @@
1.32
1.33 return self.get_value("SEQUENCE") is not None
1.34
1.35 + def possibly_active_from(self, dt, tzid):
1.36 +
1.37 + """
1.38 + Return whether the object is possibly active from or after the given
1.39 + datetime 'dt' using 'tzid' to convert any dates or floating datetimes.
1.40 + """
1.41 +
1.42 + dt = to_datetime(dt, tzid)
1.43 + periods = self.get_periods(tzid)
1.44 +
1.45 + for p in periods:
1.46 + if p.get_end_point() > dt:
1.47 + return True
1.48 +
1.49 + rrule = self.get_value("RRULE")
1.50 + parameters = rrule and get_parameters(rrule)
1.51 + until = parameters and parameters.get("UNTIL")
1.52 +
1.53 + if not rrule:
1.54 + return False
1.55 + elif not until:
1.56 + return True
1.57 +
1.58 + dtstart, dtstart_attr = self.get_datetime_item("DTSTART")
1.59 + until = get_datetime(until, dtstart_attr)
1.60 + return until > dt
1.61 +
1.62 # Modification methods.
1.63
1.64 def set_datetime(self, name, dt, tzid=None):
1.65 @@ -649,17 +697,8 @@
1.66
1.67 # Use localised datetimes.
1.68
1.69 - dtstart, dtstart_attr = obj.get_datetime_item("DTSTART")
1.70 -
1.71 - if obj.has_key("DTEND"):
1.72 - dtend, dtend_attr = obj.get_datetime_item("DTEND")
1.73 - duration = dtend - dtstart
1.74 - elif obj.has_key("DURATION"):
1.75 - duration = obj.get_duration("DURATION")
1.76 - dtend = dtstart + duration
1.77 - dtend_attr = dtstart_attr
1.78 - else:
1.79 - dtend, dtend_attr = dtstart, dtstart_attr
1.80 + (dtstart, dtstart_attr), (dtend, dtend_attr) = obj.get_main_period_items(tzid)
1.81 + duration = dtend - dtstart
1.82
1.83 # Attempt to get time zone details from the object, using the supplied zone
1.84 # only as a fallback.
1.85 @@ -681,7 +720,8 @@
1.86
1.87 until = parameters.get("UNTIL")
1.88 if until:
1.89 - end = min(to_timezone(get_datetime(until, dtstart_attr), obj_tzid), end)
1.90 + until_dt = to_timezone(get_datetime(until, dtstart_attr), obj_tzid)
1.91 + end = end and min(until_dt, end) or until_dt
1.92 inclusive = True
1.93
1.94 for recurrence_start in selector.materialise(dtstart, end, parameters.get("COUNT"), parameters.get("BYSETPOS"), inclusive):