1.1 --- a/imiptools/period.py Thu Aug 06 13:57:42 2015 +0200
1.2 +++ b/imiptools/period.py Thu Aug 06 15:28:23 2015 +0200
1.3 @@ -28,10 +28,61 @@
1.4 get_tzid, \
1.5 to_timezone, to_utc_datetime
1.6
1.7 -class Period:
1.8 +class PeriodBase:
1.9
1.10 "A basic period abstraction."
1.11
1.12 + def as_tuple(self):
1.13 + return self.start, self.end
1.14 +
1.15 + def __hash__(self):
1.16 + return hash((self.get_start(), self.get_end()))
1.17 +
1.18 + def __cmp__(self, other):
1.19 +
1.20 + "Return a comparison result against 'other' using points in time."
1.21 +
1.22 + if isinstance(other, PeriodBase):
1.23 + return cmp(
1.24 + (self.get_start_point(), self.get_end_point()),
1.25 + (other.get_start_point(), other.get_end_point())
1.26 + )
1.27 + else:
1.28 + return 1
1.29 +
1.30 + def get_key(self):
1.31 + return self.get_start(), self.get_end()
1.32 +
1.33 + # Datetime and metadata methods.
1.34 +
1.35 + def get_start(self):
1.36 + return self.start
1.37 +
1.38 + def get_end(self):
1.39 + return self.end
1.40 +
1.41 + def get_start_attr(self):
1.42 + return get_datetime_attributes(self.start, self.tzid)
1.43 +
1.44 + def get_end_attr(self):
1.45 + return get_datetime_attributes(self.end, self.tzid)
1.46 +
1.47 + def get_start_item(self):
1.48 + return self.get_start(), self.get_start_attr()
1.49 +
1.50 + def get_end_item(self):
1.51 + return self.get_end(), self.get_end_attr()
1.52 +
1.53 + def get_start_point(self):
1.54 + return self.start
1.55 +
1.56 + def get_end_point(self):
1.57 + return self.end
1.58 +
1.59 +class Period(PeriodBase):
1.60 +
1.61 + "A simple period abstraction."
1.62 +
1.63 def __init__(self, start, end, tzid=None, origin=None):
1.64
1.65 """
1.66 @@ -50,53 +101,14 @@
1.67 def as_tuple(self):
1.68 return self.start, self.end, self.tzid, self.origin
1.69
1.70 - def __hash__(self):
1.71 - return hash((self.get_start(), self.get_end()))
1.72 -
1.73 - def __cmp__(self, other):
1.74 -
1.75 - """
1.76 - Return a comparison result against 'other' using points in time,
1.77 - employing the time zone context to convert dates.
1.78 - """
1.79 -
1.80 - if isinstance(other, Period):
1.81 - return cmp(
1.82 - (self.get_start_point(), self.get_end_point()),
1.83 - (other.get_start_point(), other.get_end_point())
1.84 - )
1.85 - else:
1.86 - return 1
1.87 -
1.88 - def get_key(self):
1.89 - return self.get_start(), self.get_end()
1.90 -
1.91 def __repr__(self):
1.92 return "Period%r" % (self.as_tuple(),)
1.93
1.94 - # Datetime metadata methods.
1.95 -
1.96 - def get_start(self):
1.97 - return self.start
1.98 -
1.99 - def get_end(self):
1.100 - return self.end
1.101 + # Datetime and metadata methods.
1.102
1.103 def get_tzid(self):
1.104 return get_tzid(self.get_start_attr(), self.get_end_attr()) or self.tzid
1.105
1.106 - def get_start_attr(self):
1.107 - return get_datetime_attributes(self.start, self.tzid)
1.108 -
1.109 - def get_end_attr(self):
1.110 - return get_datetime_attributes(self.end, self.tzid)
1.111 -
1.112 - def get_start_item(self):
1.113 - return self.get_start(), self.get_start_attr()
1.114 -
1.115 - def get_end_item(self):
1.116 - return self.get_end(), self.get_end_attr()
1.117 -
1.118 def get_start_point(self):
1.119 return to_utc_datetime(self.get_start(), self.get_tzid())
1.120
1.121 @@ -137,19 +149,20 @@
1.122 return recurrenceid
1.123 return None
1.124
1.125 -class FreeBusyPeriod(Period):
1.126 +class FreeBusyPeriod(PeriodBase):
1.127
1.128 "A free/busy record abstraction."
1.129
1.130 - def __init__(self, start, end, uid=None, transp=None, recurrenceid=None, summary=None, organiser=None, tzid=None):
1.131 + def __init__(self, start, end, uid=None, transp=None, recurrenceid=None, summary=None, organiser=None):
1.132
1.133 """
1.134 Initialise a free/busy period with the given 'start' and 'end' points,
1.135 - with an optional 'tzid', plus any 'uid', 'transp', 'recurrenceid',
1.136 - 'summary' and 'organiser' details.
1.137 + plus any 'uid', 'transp', 'recurrenceid', 'summary' and 'organiser'
1.138 + details.
1.139 """
1.140
1.141 - Period.__init__(self, start, end, tzid)
1.142 + self.start = isinstance(start, datetime) and start or get_datetime(start)
1.143 + self.end = isinstance(end, datetime) and end or get_datetime(end)
1.144 self.uid = uid
1.145 self.transp = transp
1.146 self.recurrenceid = recurrenceid
1.147 @@ -181,7 +194,7 @@
1.148 involved are the same.
1.149 """
1.150
1.151 - result = Period.__cmp__(self, other)
1.152 + result = PeriodBase.__cmp__(self, other)
1.153 if result == 0 and isinstance(other, FreeBusyPeriod):
1.154 return cmp(self.uid, other.uid)
1.155 else:
1.156 @@ -193,12 +206,6 @@
1.157 def __repr__(self):
1.158 return "FreeBusyPeriod%r" % (self.as_tuple(),)
1.159
1.160 - def get_start_point(self):
1.161 - return self.start
1.162 -
1.163 - def get_end_point(self):
1.164 - return self.end
1.165 -
1.166 class RecurringPeriod(Period):
1.167
1.168 """
1.169 @@ -670,6 +677,6 @@
1.170 remove_period(freebusy, uid, recurrenceid)
1.171
1.172 for p in periods:
1.173 - insert_period(freebusy, FreeBusyPeriod(p.get_start_point(), p.get_end_point(), uid, transp, recurrenceid, summary, organiser, p.tzid))
1.174 + insert_period(freebusy, FreeBusyPeriod(p.get_start_point(), p.get_end_point(), uid, transp, recurrenceid, summary, organiser))
1.175
1.176 # vim: tabstop=4 expandtab shiftwidth=4