1.1 --- a/imiptools/period.py Sun May 17 17:16:23 2015 +0200
1.2 +++ b/imiptools/period.py Sun May 17 17:59:06 2015 +0200
1.3 @@ -23,26 +23,42 @@
1.4 from datetime import date, datetime, timedelta
1.5 from imiptools.dates import format_datetime, get_datetime, \
1.6 get_datetime_attributes, \
1.7 - get_start_of_day, to_timezone
1.8 + get_start_of_day, to_timezone, to_utc_datetime
1.9
1.10 class Period:
1.11
1.12 "A basic period abstraction."
1.13
1.14 - def __init__(self, start, end, origin=None):
1.15 + def __init__(self, start, end, tzid=None, origin=None):
1.16 +
1.17 + """
1.18 + Initialise a period with the given 'start' and 'end', having a
1.19 + contextual 'tzid', if specified, and an indicated 'origin'.
1.20 + """
1.21 +
1.22 self.start = isinstance(start, date) and start or get_datetime(start)
1.23 self.end = isinstance(end, date) and end or get_datetime(end)
1.24 + self.tzid = tzid
1.25 self.origin = origin
1.26
1.27 def as_tuple(self):
1.28 - return self.start, self.end
1.29 + return self.start, self.end, self.tzid, self.origin
1.30
1.31 def __hash__(self):
1.32 return hash((self.get_start(), self.get_end()))
1.33
1.34 def __cmp__(self, other):
1.35 +
1.36 + """
1.37 + Return a comparison result against 'other' using points in time,
1.38 + employing the time zone context to convert dates.
1.39 + """
1.40 +
1.41 if isinstance(other, Period):
1.42 - return cmp((self.get_start(), self.get_end()), (other.get_start(), other.get_end()))
1.43 + return cmp(
1.44 + (to_utc_datetime(self.get_start(), self.get_tzid()), to_utc_datetime(self.get_end(), self.get_tzid())),
1.45 + (to_utc_datetime(other.get_start(), self.get_tzid()), to_utc_datetime(other.get_end(), self.get_tzid()))
1.46 + )
1.47 else:
1.48 return 1
1.49
1.50 @@ -50,7 +66,7 @@
1.51 return self.get_start(), self.get_end()
1.52
1.53 def __repr__(self):
1.54 - return "Period(%r, %r)" % (self.start, self.end)
1.55 + return "Period(%r)" % (self.as_tuple(),)
1.56
1.57 # Datetime metadata methods.
1.58
1.59 @@ -60,6 +76,9 @@
1.60 def get_end(self):
1.61 return self.end
1.62
1.63 + def get_tzid(self):
1.64 + return self.tzid
1.65 +
1.66 def get_start_item(self):
1.67 return self.start, get_datetime_attributes(self.start)
1.68
1.69 @@ -70,15 +89,15 @@
1.70
1.71 "A free/busy record abstraction."
1.72
1.73 - def __init__(self, start, end, uid=None, transp=None, recurrenceid=None, summary=None, organiser=None):
1.74 + def __init__(self, start, end, uid=None, transp=None, recurrenceid=None, summary=None, organiser=None, tzid=None):
1.75
1.76 """
1.77 - Initialise a free/busy period with 'start' and 'end' datetime string
1.78 - representations, employing UTC, plus any 'uid', 'transp',
1.79 - 'recurrenceid', 'summary' and 'organiser' details.
1.80 + Initialise a free/busy period with the given 'start' and 'end' limits,
1.81 + with an optional 'tzid', plus any 'uid', 'transp', 'recurrenceid',
1.82 + 'summary' and 'organiser' details.
1.83 """
1.84
1.85 - Period.__init__(self, start, end)
1.86 + Period.__init__(self, start, end, tzid)
1.87 self.uid = uid
1.88 self.transp = transp
1.89 self.recurrenceid = recurrenceid
1.90 @@ -89,18 +108,23 @@
1.91 return format_datetime(self.start), format_datetime(self.end), self.uid, self.transp, self.recurrenceid, self.summary, self.organiser
1.92
1.93 def __cmp__(self, other):
1.94 - if isinstance(other, FreeBusyPeriod):
1.95 - return cmp((self.get_start(), self.get_end(), self.uid), (other.get_start(), other.get_end(), other.uid))
1.96 +
1.97 + """
1.98 + Compare this object to 'other', employing the uid if the periods
1.99 + involved are the same.
1.100 + """
1.101 +
1.102 + result = Period.__cmp__(self, other)
1.103 + if result == 0 and isinstance(other, FreeBusyPeriod):
1.104 + return cmp(self.uid, other.uid)
1.105 else:
1.106 - return Period.__cmp__(self, other)
1.107 + return result
1.108
1.109 def get_key(self):
1.110 - return self.uid, self.recurrenceid, self.start
1.111 + return self.uid, self.recurrenceid, self.get_start()
1.112
1.113 def __repr__(self):
1.114 - return "FreeBusyPeriod(%r, %r, %r, %r, %r, %r, %r)" % (
1.115 - self.start, self.end, self.uid, self.transp, self.recurrenceid,
1.116 - self.summary, self.organiser)
1.117 + return "FreeBusyPeriod(%r)" % (self.as_tuple(),)
1.118
1.119 # Time and period management.
1.120