1.1 --- a/imiptools/data.py Thu Aug 06 13:57:42 2015 +0200
1.2 +++ b/imiptools/data.py Thu Aug 06 15:28:23 2015 +0200
1.3 @@ -124,8 +124,8 @@
1.4 def get_date_value_items(self, name, tzid=None):
1.5 return get_date_value_items(self.details, name, tzid)
1.6
1.7 - def get_period_values(self, name, tzid=None, period_type=None):
1.8 - return get_period_values(self.details, name, tzid, period_type)
1.9 + def get_period_values(self, name, tzid=None):
1.10 + return get_period_values(self.details, name, tzid)
1.11
1.12 def get_datetime(self, name):
1.13 t = get_datetime_item(self.details, name)
1.14 @@ -481,12 +481,11 @@
1.15 else:
1.16 return None
1.17
1.18 -def get_period_values(d, name, tzid=None, period_type=None):
1.19 +def get_period_values(d, name, tzid=None):
1.20
1.21 """
1.22 Return period values from 'd' for the given property 'name', using 'tzid'
1.23 - where specified to indicate the time zone, and 'period_type' to indicate a
1.24 - particular period type to be used when creating period instances.
1.25 + where specified to indicate the time zone.
1.26 """
1.27
1.28 values = []
1.29 @@ -494,7 +493,7 @@
1.30 if not attr.has_key("TZID") and tzid:
1.31 attr["TZID"] = tzid
1.32 start, end = get_period(value, attr)
1.33 - values.append((period_type or Period)(start, end, tzid=tzid))
1.34 + values.append(Period(start, end, tzid=tzid))
1.35 return values
1.36
1.37 def get_utc_datetime(d, name, date_tzid=None):
3.1 --- a/imiptools/period.py Thu Aug 06 13:57:42 2015 +0200
3.2 +++ b/imiptools/period.py Thu Aug 06 15:28:23 2015 +0200
3.3 @@ -28,10 +28,61 @@
3.4 get_tzid, \
3.5 to_timezone, to_utc_datetime
3.6
3.7 -class Period:
3.8 +class PeriodBase:
3.9
3.10 "A basic period abstraction."
3.11
3.12 + def as_tuple(self):
3.13 + return self.start, self.end
3.14 +
3.15 + def __hash__(self):
3.16 + return hash((self.get_start(), self.get_end()))
3.17 +
3.18 + def __cmp__(self, other):
3.19 +
3.20 + "Return a comparison result against 'other' using points in time."
3.21 +
3.22 + if isinstance(other, PeriodBase):
3.23 + return cmp(
3.24 + (self.get_start_point(), self.get_end_point()),
3.25 + (other.get_start_point(), other.get_end_point())
3.26 + )
3.27 + else:
3.28 + return 1
3.29 +
3.30 + def get_key(self):
3.31 + return self.get_start(), self.get_end()
3.32 +
3.33 + # Datetime and metadata methods.
3.34 +
3.35 + def get_start(self):
3.36 + return self.start
3.37 +
3.38 + def get_end(self):
3.39 + return self.end
3.40 +
3.41 + def get_start_attr(self):
3.42 + return get_datetime_attributes(self.start, self.tzid)
3.43 +
3.44 + def get_end_attr(self):
3.45 + return get_datetime_attributes(self.end, self.tzid)
3.46 +
3.47 + def get_start_item(self):
3.48 + return self.get_start(), self.get_start_attr()
3.49 +
3.50 + def get_end_item(self):
3.51 + return self.get_end(), self.get_end_attr()
3.52 +
3.53 + def get_start_point(self):
3.54 + return self.start
3.55 +
3.56 + def get_end_point(self):
3.57 + return self.end
3.58 +
3.59 +class Period(PeriodBase):
3.60 +
3.61 + "A simple period abstraction."
3.62 +
3.63 def __init__(self, start, end, tzid=None, origin=None):
3.64
3.65 """
3.66 @@ -50,53 +101,14 @@
3.67 def as_tuple(self):
3.68 return self.start, self.end, self.tzid, self.origin
3.69
3.70 - def __hash__(self):
3.71 - return hash((self.get_start(), self.get_end()))
3.72 -
3.73 - def __cmp__(self, other):
3.74 -
3.75 - """
3.76 - Return a comparison result against 'other' using points in time,
3.77 - employing the time zone context to convert dates.
3.78 - """
3.79 -
3.80 - if isinstance(other, Period):
3.81 - return cmp(
3.82 - (self.get_start_point(), self.get_end_point()),
3.83 - (other.get_start_point(), other.get_end_point())
3.84 - )
3.85 - else:
3.86 - return 1
3.87 -
3.88 - def get_key(self):
3.89 - return self.get_start(), self.get_end()
3.90 -
3.91 def __repr__(self):
3.92 return "Period%r" % (self.as_tuple(),)
3.93
3.94 - # Datetime metadata methods.
3.95 -
3.96 - def get_start(self):
3.97 - return self.start
3.98 -
3.99 - def get_end(self):
3.100 - return self.end
3.101 + # Datetime and metadata methods.
3.102
3.103 def get_tzid(self):
3.104 return get_tzid(self.get_start_attr(), self.get_end_attr()) or self.tzid
3.105
3.106 - def get_start_attr(self):
3.107 - return get_datetime_attributes(self.start, self.tzid)
3.108 -
3.109 - def get_end_attr(self):
3.110 - return get_datetime_attributes(self.end, self.tzid)
3.111 -
3.112 - def get_start_item(self):
3.113 - return self.get_start(), self.get_start_attr()
3.114 -
3.115 - def get_end_item(self):
3.116 - return self.get_end(), self.get_end_attr()
3.117 -
3.118 def get_start_point(self):
3.119 return to_utc_datetime(self.get_start(), self.get_tzid())
3.120
3.121 @@ -137,19 +149,20 @@
3.122 return recurrenceid
3.123 return None
3.124
3.125 -class FreeBusyPeriod(Period):
3.126 +class FreeBusyPeriod(PeriodBase):
3.127
3.128 "A free/busy record abstraction."
3.129
3.130 - def __init__(self, start, end, uid=None, transp=None, recurrenceid=None, summary=None, organiser=None, tzid=None):
3.131 + def __init__(self, start, end, uid=None, transp=None, recurrenceid=None, summary=None, organiser=None):
3.132
3.133 """
3.134 Initialise a free/busy period with the given 'start' and 'end' points,
3.135 - with an optional 'tzid', plus any 'uid', 'transp', 'recurrenceid',
3.136 - 'summary' and 'organiser' details.
3.137 + plus any 'uid', 'transp', 'recurrenceid', 'summary' and 'organiser'
3.138 + details.
3.139 """
3.140
3.141 - Period.__init__(self, start, end, tzid)
3.142 + self.start = isinstance(start, datetime) and start or get_datetime(start)
3.143 + self.end = isinstance(end, datetime) and end or get_datetime(end)
3.144 self.uid = uid
3.145 self.transp = transp
3.146 self.recurrenceid = recurrenceid
3.147 @@ -181,7 +194,7 @@
3.148 involved are the same.
3.149 """
3.150
3.151 - result = Period.__cmp__(self, other)
3.152 + result = PeriodBase.__cmp__(self, other)
3.153 if result == 0 and isinstance(other, FreeBusyPeriod):
3.154 return cmp(self.uid, other.uid)
3.155 else:
3.156 @@ -193,12 +206,6 @@
3.157 def __repr__(self):
3.158 return "FreeBusyPeriod%r" % (self.as_tuple(),)
3.159
3.160 - def get_start_point(self):
3.161 - return self.start
3.162 -
3.163 - def get_end_point(self):
3.164 - return self.end
3.165 -
3.166 class RecurringPeriod(Period):
3.167
3.168 """
3.169 @@ -670,6 +677,6 @@
3.170 remove_period(freebusy, uid, recurrenceid)
3.171
3.172 for p in periods:
3.173 - insert_period(freebusy, FreeBusyPeriod(p.get_start_point(), p.get_end_point(), uid, transp, recurrenceid, summary, organiser, p.tzid))
3.174 + insert_period(freebusy, FreeBusyPeriod(p.get_start_point(), p.get_end_point(), uid, transp, recurrenceid, summary, organiser))
3.175
3.176 # vim: tabstop=4 expandtab shiftwidth=4