# HG changeset patch # User Paul Boddie # Date 1438867703 -7200 # Node ID 3496863a16a2a65dda98121328c7112d5a0e4b18 # Parent 13a95199e8e3759a49c3c6889732c507550bdbec Removed time zone details from free/busy period abstractions, reorganising the period class hierarchy and introducing a common base class. diff -r 13a95199e8e3 -r 3496863a16a2 imiptools/data.py --- a/imiptools/data.py Thu Aug 06 13:57:42 2015 +0200 +++ b/imiptools/data.py Thu Aug 06 15:28:23 2015 +0200 @@ -124,8 +124,8 @@ def get_date_value_items(self, name, tzid=None): return get_date_value_items(self.details, name, tzid) - def get_period_values(self, name, tzid=None, period_type=None): - return get_period_values(self.details, name, tzid, period_type) + def get_period_values(self, name, tzid=None): + return get_period_values(self.details, name, tzid) def get_datetime(self, name): t = get_datetime_item(self.details, name) @@ -481,12 +481,11 @@ else: return None -def get_period_values(d, name, tzid=None, period_type=None): +def get_period_values(d, name, tzid=None): """ Return period values from 'd' for the given property 'name', using 'tzid' - where specified to indicate the time zone, and 'period_type' to indicate a - particular period type to be used when creating period instances. + where specified to indicate the time zone. """ values = [] @@ -494,7 +493,7 @@ if not attr.has_key("TZID") and tzid: attr["TZID"] = tzid start, end = get_period(value, attr) - values.append((period_type or Period)(start, end, tzid=tzid)) + values.append(Period(start, end, tzid=tzid)) return values def get_utc_datetime(d, name, date_tzid=None): diff -r 13a95199e8e3 -r 3496863a16a2 imiptools/handlers/person.py --- a/imiptools/handlers/person.py Thu Aug 06 13:57:42 2015 +0200 +++ b/imiptools/handlers/person.py Thu Aug 06 15:28:23 2015 +0200 @@ -128,7 +128,7 @@ if not senders: return - freebusy = self.obj.get_period_values("FREEBUSY", period_type=FreeBusyPeriod) + freebusy = [FreeBusyPeriod(p.get_start_point(), p.get_end_point()) for p in self.obj.get_period_values("FREEBUSY")] dtstart = self.obj.get_datetime("DTSTART") dtend = self.obj.get_datetime("DTEND") period = Period(dtstart, dtend, self.get_tzid()) diff -r 13a95199e8e3 -r 3496863a16a2 imiptools/period.py --- a/imiptools/period.py Thu Aug 06 13:57:42 2015 +0200 +++ b/imiptools/period.py Thu Aug 06 15:28:23 2015 +0200 @@ -28,10 +28,61 @@ get_tzid, \ to_timezone, to_utc_datetime -class Period: +class PeriodBase: "A basic period abstraction." + def as_tuple(self): + return self.start, self.end + + def __hash__(self): + return hash((self.get_start(), self.get_end())) + + def __cmp__(self, other): + + "Return a comparison result against 'other' using points in time." + + if isinstance(other, PeriodBase): + return cmp( + (self.get_start_point(), self.get_end_point()), + (other.get_start_point(), other.get_end_point()) + ) + else: + return 1 + + def get_key(self): + return self.get_start(), self.get_end() + + # Datetime and metadata methods. + + def get_start(self): + return self.start + + def get_end(self): + return self.end + + def get_start_attr(self): + return get_datetime_attributes(self.start, self.tzid) + + def get_end_attr(self): + return get_datetime_attributes(self.end, self.tzid) + + def get_start_item(self): + return self.get_start(), self.get_start_attr() + + def get_end_item(self): + return self.get_end(), self.get_end_attr() + + def get_start_point(self): + return self.start + + def get_end_point(self): + return self.end + +class Period(PeriodBase): + + "A simple period abstraction." + def __init__(self, start, end, tzid=None, origin=None): """ @@ -50,53 +101,14 @@ def as_tuple(self): return self.start, self.end, self.tzid, self.origin - def __hash__(self): - return hash((self.get_start(), self.get_end())) - - def __cmp__(self, other): - - """ - Return a comparison result against 'other' using points in time, - employing the time zone context to convert dates. - """ - - if isinstance(other, Period): - return cmp( - (self.get_start_point(), self.get_end_point()), - (other.get_start_point(), other.get_end_point()) - ) - else: - return 1 - - def get_key(self): - return self.get_start(), self.get_end() - def __repr__(self): return "Period%r" % (self.as_tuple(),) - # Datetime metadata methods. - - def get_start(self): - return self.start - - def get_end(self): - return self.end + # Datetime and metadata methods. def get_tzid(self): return get_tzid(self.get_start_attr(), self.get_end_attr()) or self.tzid - def get_start_attr(self): - return get_datetime_attributes(self.start, self.tzid) - - def get_end_attr(self): - return get_datetime_attributes(self.end, self.tzid) - - def get_start_item(self): - return self.get_start(), self.get_start_attr() - - def get_end_item(self): - return self.get_end(), self.get_end_attr() - def get_start_point(self): return to_utc_datetime(self.get_start(), self.get_tzid()) @@ -137,19 +149,20 @@ return recurrenceid return None -class FreeBusyPeriod(Period): +class FreeBusyPeriod(PeriodBase): "A free/busy record abstraction." - def __init__(self, start, end, uid=None, transp=None, recurrenceid=None, summary=None, organiser=None, tzid=None): + def __init__(self, start, end, uid=None, transp=None, recurrenceid=None, summary=None, organiser=None): """ Initialise a free/busy period with the given 'start' and 'end' points, - with an optional 'tzid', plus any 'uid', 'transp', 'recurrenceid', - 'summary' and 'organiser' details. + plus any 'uid', 'transp', 'recurrenceid', 'summary' and 'organiser' + details. """ - Period.__init__(self, start, end, tzid) + self.start = isinstance(start, datetime) and start or get_datetime(start) + self.end = isinstance(end, datetime) and end or get_datetime(end) self.uid = uid self.transp = transp self.recurrenceid = recurrenceid @@ -181,7 +194,7 @@ involved are the same. """ - result = Period.__cmp__(self, other) + result = PeriodBase.__cmp__(self, other) if result == 0 and isinstance(other, FreeBusyPeriod): return cmp(self.uid, other.uid) else: @@ -193,12 +206,6 @@ def __repr__(self): return "FreeBusyPeriod%r" % (self.as_tuple(),) - def get_start_point(self): - return self.start - - def get_end_point(self): - return self.end - class RecurringPeriod(Period): """ @@ -670,6 +677,6 @@ remove_period(freebusy, uid, recurrenceid) for p in periods: - insert_period(freebusy, FreeBusyPeriod(p.get_start_point(), p.get_end_point(), uid, transp, recurrenceid, summary, organiser, p.tzid)) + insert_period(freebusy, FreeBusyPeriod(p.get_start_point(), p.get_end_point(), uid, transp, recurrenceid, summary, organiser)) # vim: tabstop=4 expandtab shiftwidth=4 diff -r 13a95199e8e3 -r 3496863a16a2 imipweb/resource.py --- a/imipweb/resource.py Thu Aug 06 13:57:42 2015 +0200 +++ b/imipweb/resource.py Thu Aug 06 15:28:23 2015 +0200 @@ -152,8 +152,7 @@ obj.get_value("TRANSP"), recurrenceid, obj.get_value("SUMMARY"), - obj.get_value("ORGANIZER"), - p.tzid + obj.get_value("ORGANIZER") )) return summary diff -r 13a95199e8e3 -r 3496863a16a2 tools/make_freebusy.py --- a/tools/make_freebusy.py Thu Aug 06 13:57:42 2015 +0200 +++ b/tools/make_freebusy.py Thu Aug 06 15:28:23 2015 +0200 @@ -46,8 +46,7 @@ only_organiser and "ORG" or obj.get_value("TRANSP") or "OPAQUE", recurrenceid, obj.get_value("SUMMARY"), - obj.get_value("ORGANIZER"), - p.get_tzid() + obj.get_value("ORGANIZER") )) # Main program.