imip-agent

Changeset

661:0802aded40fe
2015-08-16 Paul Boddie raw files shortlog changelog graph Improved the main period setting method in the object abstraction. Added a correction method to the object.
imiptools/data.py (file)
     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