# HG changeset patch # User Paul Boddie # Date 1517697264 -3600 # Node ID 04fc45977b5fffe3d90a1cc259ad978872024198 # Parent 4f171f95185724a4b4eefb3062a99c22d493c240 Made FormDate instances return corrected end date information instead of explicitly correcting end dates elsewhere. Added a reset method to FormPeriod and time usage methods to FormDate so that time usage can be updated for periods whose dates lack time information. Added an output string representation for form dates. diff -r 4f171f951857 -r 04fc45977b5f imiptools/editing.py --- a/imiptools/editing.py Sat Feb 03 23:30:04 2018 +0100 +++ b/imiptools/editing.py Sat Feb 03 23:34:24 2018 +0100 @@ -971,6 +971,9 @@ args = (self.start.copy(), self.end.copy()) + self.as_tuple()[2:] return FormPeriod(*args) + def reset(self): + self.times_enabled = self.start.has_time() and self.end.has_time() and True or False + def as_event_period(self, index=None): """ @@ -999,7 +1002,7 @@ else: raise PeriodError("dtstart", "dtend") - return EventPeriod(dtstart, end_date_to_calendar(dtend), self.tzid, + return EventPeriod(dtstart, dtend, self.tzid, self.origin, dtstart_attr, dtend_attr, self.start, self.end, self.replacement, self.cancelled, self.recurrenceid) @@ -1014,7 +1017,7 @@ # Handle specified end datetimes. if self.end_enabled: - dtend = self.end.as_datetime(self.times_enabled) + dtend = self.end.as_datetime(self.times_enabled, True) if not dtend: return None @@ -1022,7 +1025,7 @@ elif self.times_enabled: formdate = FormDate(self.start.date, self.end.hour, self.end.minute, self.end.second, self.end.tzid) - dtend = formdate.as_datetime(self.times_enabled) + dtend = formdate.as_datetime(self.times_enabled, True) if not dtend: return None @@ -1080,9 +1083,20 @@ def reset(self): self.dt = None + def set_as_day(self): + self.hour = self.minute = self.second = None + + def has_time(self): + return self.hour and self.minute and self.second + def __repr__(self): return "FormDate%r" % (self.as_tuple(),) + def __str__(self): + return "%s%s%s" % (self.get_date_string(), + self.has_time() and " %s:%s:%s" % (self.get_hour(), self.get_minute(), self.get_second()) or "", + self.tzid and " %s" % self.tzid or "") + def get_component(self, value): return (value or "").rjust(2, "0")[:2] @@ -1114,7 +1128,7 @@ def get_tzid(self): return self.tzid - def as_datetime(self, with_time=True): + def as_datetime(self, with_time=True, as_end=False): """ Return a datetime for this object if one is provided or can be produced. @@ -1134,10 +1148,17 @@ # An erroneous datetime will yield None as result. try: - return get_datetime(s, attr) + dt = get_datetime(s, attr) except ValueError: return None + # Return end dates using calendar conventions. + + if as_end and not with_time: + return end_date_to_calendar(dt) + else: + return dt + def as_datetime_item(self, with_time=True): """ @@ -1182,9 +1203,6 @@ dtstart, dtstart_attr = period.get_start_item() dtend, dtend_attr = period.get_end_item() - if not isinstance(period, RecurringPeriod): - dtend = end_date_to_calendar(dtend) - return EventPeriod(dtstart, dtend, period.tzid, period.origin, dtstart_attr, dtend_attr, recurrenceid=format_datetime(to_utc_datetime(dtstart)))