1.1 --- a/imiptools/data.py Mon Oct 26 19:07:51 2015 +0100
1.2 +++ b/imiptools/data.py Mon Oct 26 19:37:27 2015 +0100
1.3 @@ -22,8 +22,7 @@
1.4 from bisect import bisect_left
1.5 from datetime import date, datetime, timedelta
1.6 from email.mime.text import MIMEText
1.7 -from imiptools.dates import check_permitted_values, correct_datetime, \
1.8 - format_datetime, get_datetime, \
1.9 +from imiptools.dates import format_datetime, get_datetime, \
1.10 get_datetime_item as get_item_from_datetime, \
1.11 get_datetime_tzid, \
1.12 get_duration, get_period, get_period_item, \
1.13 @@ -499,33 +498,27 @@
1.14
1.15 def correct_object(self, tzid, permitted_values):
1.16
1.17 - "Correct the object's period details."
1.18 + """
1.19 + Correct the object's period details using the given 'tzid' and
1.20 + 'permitted_values'.
1.21 + """
1.22
1.23 corrected = set()
1.24 rdates = []
1.25
1.26 for period in self.get_periods(tzid):
1.27 - start = period.get_start()
1.28 - end = period.get_end()
1.29 - start_errors = check_permitted_values(start, permitted_values)
1.30 - end_errors = check_permitted_values(end, permitted_values)
1.31 + corrected_period = period.get_corrected(permitted_values)
1.32
1.33 - if not (start_errors or end_errors):
1.34 + if corrected_period is period:
1.35 if period.origin == "RDATE":
1.36 rdates.append(period)
1.37 continue
1.38
1.39 - if start_errors:
1.40 - start = correct_datetime(start, permitted_values)
1.41 - if end_errors:
1.42 - end = correct_datetime(end, permitted_values)
1.43 - period = RecurringPeriod(start, end, period.tzid, period.origin, period.get_start_attr(), period.get_end_attr())
1.44 -
1.45 if period.origin == "DTSTART":
1.46 - self.set_period(period)
1.47 + self.set_period(corrected_period)
1.48 corrected.add("DTSTART")
1.49 elif period.origin == "RDATE":
1.50 - rdates.append(period)
1.51 + rdates.append(corrected_period)
1.52 corrected.add("RDATE")
1.53
1.54 if "RDATE" in corrected:
2.1 --- a/imiptools/period.py Mon Oct 26 19:07:51 2015 +0100
2.2 +++ b/imiptools/period.py Mon Oct 26 19:37:27 2015 +0100
2.3 @@ -21,7 +21,8 @@
2.4
2.5 from bisect import bisect_left, bisect_right, insort_left
2.6 from datetime import date, datetime, timedelta
2.7 -from imiptools.dates import format_datetime, get_datetime, \
2.8 +from imiptools.dates import check_permitted_values, correct_datetime, \
2.9 + format_datetime, get_datetime, \
2.10 get_datetime_attributes, \
2.11 get_recurrence_start, get_recurrence_start_point, \
2.12 get_start_of_day, \
2.13 @@ -236,6 +237,30 @@
2.14 return recurrenceid
2.15 return None
2.16
2.17 + # Value correction methods.
2.18 +
2.19 + def get_corrected(self, permitted_values):
2.20 +
2.21 + "Return a corrected version of this period."
2.22 +
2.23 + start = self.get_start()
2.24 + end = self.get_end()
2.25 + start_errors = check_permitted_values(start, permitted_values)
2.26 + end_errors = check_permitted_values(end, permitted_values)
2.27 +
2.28 + if not (start_errors or end_errors):
2.29 + return self
2.30 +
2.31 + if start_errors:
2.32 + start = correct_datetime(start, permitted_values)
2.33 + if end_errors:
2.34 + end = correct_datetime(end, permitted_values)
2.35 +
2.36 + return self.make_corrected(start, end)
2.37 +
2.38 + def make_corrected(self, start, end):
2.39 + return self.__class__(start, end, self.tzid, self.origin)
2.40 +
2.41 class FreeBusyPeriod(PeriodBase):
2.42
2.43 "A free/busy record abstraction."
2.44 @@ -348,6 +373,9 @@
2.45 def __repr__(self):
2.46 return "RecurringPeriod%r" % (self.as_tuple(),)
2.47
2.48 + def make_corrected(self, start, end):
2.49 + return self.__class__(start, end, self.tzid, self.origin, self.get_start_attr(), self.get_end_attr())
2.50 +
2.51 # Time and period management.
2.52
2.53 def can_schedule(freebusy, periods, uid, recurrenceid):