# HG changeset patch # User Paul Boddie # Date 1439678381 -7200 # Node ID 0802aded40fe706bb8df62993e9f5bbbb1d0ea40 # Parent 414cc471e70e49ca65d9e503930d9672d937a114 Improved the main period setting method in the object abstraction. Added a correction method to the object. diff -r 414cc471e70e -r 0802aded40fe imiptools/data.py --- a/imiptools/data.py Sun Aug 16 00:38:43 2015 +0200 +++ b/imiptools/data.py Sun Aug 16 00:39:41 2015 +0200 @@ -22,7 +22,8 @@ from bisect import bisect_left from datetime import date, datetime, timedelta from email.mime.text import MIMEText -from imiptools.dates import format_datetime, get_datetime, \ +from imiptools.dates import check_resolution, correct_datetime, \ + format_datetime, get_datetime, \ get_datetime_item as get_item_from_datetime, \ get_datetime_tzid, \ get_duration, get_period, get_period_item, \ @@ -368,6 +369,9 @@ result = self.set_datetime("DTSTART", period.get_start()) result = self.set_datetime("DTEND", period.get_end()) or result + if self.has_key("DURATION"): + del self["DURATION"] + return result def set_periods(self, periods): @@ -377,9 +381,7 @@ previous RDATE properties and ignoring any RRULE properties. """ - update = False - - old_values = self.get_values("RDATE") + old_values = set(self.get_date_values("RDATE")) new_rdates = [] if self.has_key("RDATE"): @@ -389,10 +391,46 @@ if p.origin != "RRULE": new_rdates.append(get_period_item(p.get_start(), p.get_end())) - self["RDATE"] = new_rdates + if new_rdates: + self["RDATE"] = new_rdates + + return old_values != set(self.get_date_values("RDATE")) + + def correct_object(self, tzid, resolution): + + "Correct the object's period details." + + corrected = set() + rdates = [] + + for period in self.get_periods(tzid): + start = period.get_start() + end = period.get_end() + start_errors = check_resolution(start, resolution) + end_errors = check_resolution(end, resolution) - # NOTE: To do: calculate the update status. - return update + if not (start_errors or end_errors): + if period.origin == "RDATE": + rdates.append(period) + continue + + if start_errors: + start = correct_datetime(start, resolution) + if end_errors: + end = correct_datetime(end, resolution) + period = RecurringPeriod(start, end, period.tzid, period.origin, period.get_start_attr(), period.get_end_attr()) + + if period.origin == "DTSTART": + self.set_period(period) + corrected.add("DTSTART") + elif period.origin == "RDATE": + rdates.append(period) + corrected.add("RDATE") + + if "RDATE" in corrected: + self.set_periods(rdates) + + return corrected # Construction and serialisation.