1.1 --- a/imiptools/data.py Sun Aug 16 00:38:43 2015 +0200
1.2 +++ b/imiptools/data.py Sun Aug 16 00:39:41 2015 +0200
1.3 @@ -22,7 +22,8 @@
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 format_datetime, get_datetime, \
1.8 +from imiptools.dates import check_resolution, correct_datetime, \
1.9 + 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 @@ -368,6 +369,9 @@
1.14
1.15 result = self.set_datetime("DTSTART", period.get_start())
1.16 result = self.set_datetime("DTEND", period.get_end()) or result
1.17 + if self.has_key("DURATION"):
1.18 + del self["DURATION"]
1.19 +
1.20 return result
1.21
1.22 def set_periods(self, periods):
1.23 @@ -377,9 +381,7 @@
1.24 previous RDATE properties and ignoring any RRULE properties.
1.25 """
1.26
1.27 - update = False
1.28 -
1.29 - old_values = self.get_values("RDATE")
1.30 + old_values = set(self.get_date_values("RDATE"))
1.31 new_rdates = []
1.32
1.33 if self.has_key("RDATE"):
1.34 @@ -389,10 +391,46 @@
1.35 if p.origin != "RRULE":
1.36 new_rdates.append(get_period_item(p.get_start(), p.get_end()))
1.37
1.38 - self["RDATE"] = new_rdates
1.39 + if new_rdates:
1.40 + self["RDATE"] = new_rdates
1.41 +
1.42 + return old_values != set(self.get_date_values("RDATE"))
1.43 +
1.44 + def correct_object(self, tzid, resolution):
1.45 +
1.46 + "Correct the object's period details."
1.47 +
1.48 + corrected = set()
1.49 + rdates = []
1.50 +
1.51 + for period in self.get_periods(tzid):
1.52 + start = period.get_start()
1.53 + end = period.get_end()
1.54 + start_errors = check_resolution(start, resolution)
1.55 + end_errors = check_resolution(end, resolution)
1.56
1.57 - # NOTE: To do: calculate the update status.
1.58 - return update
1.59 + if not (start_errors or end_errors):
1.60 + if period.origin == "RDATE":
1.61 + rdates.append(period)
1.62 + continue
1.63 +
1.64 + if start_errors:
1.65 + start = correct_datetime(start, resolution)
1.66 + if end_errors:
1.67 + end = correct_datetime(end, resolution)
1.68 + period = RecurringPeriod(start, end, period.tzid, period.origin, period.get_start_attr(), period.get_end_attr())
1.69 +
1.70 + if period.origin == "DTSTART":
1.71 + self.set_period(period)
1.72 + corrected.add("DTSTART")
1.73 + elif period.origin == "RDATE":
1.74 + rdates.append(period)
1.75 + corrected.add("RDATE")
1.76 +
1.77 + if "RDATE" in corrected:
1.78 + self.set_periods(rdates)
1.79 +
1.80 + return corrected
1.81
1.82 # Construction and serialisation.
1.83