imip-agent

Changeset

939:d8b0495f4f1a
2015-10-26 Paul Boddie raw files shortlog changelog graph Moved period correction to methods on the period abstractions.
imiptools/data.py (file) imiptools/period.py (file)
     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):