# HG changeset patch # User Paul Boddie # Date 1445884647 -3600 # Node ID d8b0495f4f1a55dc4c893e029a4eae780b4a24e4 # Parent 4f736b142589a6793121a03d20dde000c2f71dcd Moved period correction to methods on the period abstractions. diff -r 4f736b142589 -r d8b0495f4f1a imiptools/data.py --- a/imiptools/data.py Mon Oct 26 19:07:51 2015 +0100 +++ b/imiptools/data.py Mon Oct 26 19:37:27 2015 +0100 @@ -22,8 +22,7 @@ from bisect import bisect_left from datetime import date, datetime, timedelta from email.mime.text import MIMEText -from imiptools.dates import check_permitted_values, correct_datetime, \ - format_datetime, get_datetime, \ +from imiptools.dates import format_datetime, get_datetime, \ get_datetime_item as get_item_from_datetime, \ get_datetime_tzid, \ get_duration, get_period, get_period_item, \ @@ -499,33 +498,27 @@ def correct_object(self, tzid, permitted_values): - "Correct the object's period details." + """ + Correct the object's period details using the given 'tzid' and + 'permitted_values'. + """ corrected = set() rdates = [] for period in self.get_periods(tzid): - start = period.get_start() - end = period.get_end() - start_errors = check_permitted_values(start, permitted_values) - end_errors = check_permitted_values(end, permitted_values) + corrected_period = period.get_corrected(permitted_values) - if not (start_errors or end_errors): + if corrected_period is period: if period.origin == "RDATE": rdates.append(period) continue - if start_errors: - start = correct_datetime(start, permitted_values) - if end_errors: - end = correct_datetime(end, permitted_values) - period = RecurringPeriod(start, end, period.tzid, period.origin, period.get_start_attr(), period.get_end_attr()) - if period.origin == "DTSTART": - self.set_period(period) + self.set_period(corrected_period) corrected.add("DTSTART") elif period.origin == "RDATE": - rdates.append(period) + rdates.append(corrected_period) corrected.add("RDATE") if "RDATE" in corrected: diff -r 4f736b142589 -r d8b0495f4f1a imiptools/period.py --- a/imiptools/period.py Mon Oct 26 19:07:51 2015 +0100 +++ b/imiptools/period.py Mon Oct 26 19:37:27 2015 +0100 @@ -21,7 +21,8 @@ from bisect import bisect_left, bisect_right, insort_left from datetime import date, datetime, timedelta -from imiptools.dates import format_datetime, get_datetime, \ +from imiptools.dates import check_permitted_values, correct_datetime, \ + format_datetime, get_datetime, \ get_datetime_attributes, \ get_recurrence_start, get_recurrence_start_point, \ get_start_of_day, \ @@ -236,6 +237,30 @@ return recurrenceid return None + # Value correction methods. + + def get_corrected(self, permitted_values): + + "Return a corrected version of this period." + + start = self.get_start() + end = self.get_end() + start_errors = check_permitted_values(start, permitted_values) + end_errors = check_permitted_values(end, permitted_values) + + if not (start_errors or end_errors): + return self + + if start_errors: + start = correct_datetime(start, permitted_values) + if end_errors: + end = correct_datetime(end, permitted_values) + + return self.make_corrected(start, end) + + def make_corrected(self, start, end): + return self.__class__(start, end, self.tzid, self.origin) + class FreeBusyPeriod(PeriodBase): "A free/busy record abstraction." @@ -348,6 +373,9 @@ def __repr__(self): return "RecurringPeriod%r" % (self.as_tuple(),) + def make_corrected(self, start, end): + return self.__class__(start, end, self.tzid, self.origin, self.get_start_attr(), self.get_end_attr()) + # Time and period management. def can_schedule(freebusy, periods, uid, recurrenceid):