# HG changeset patch # User Paul Boddie # Date 1445900746 -3600 # Node ID 4d0a8c6e750c782eac184e88d3cf5ab874461290 # Parent fade5d6b17907f82e8d4fd0231484560d81ca8c6 Simplified period checking in the client, adding period correction and other utility methods to the period abstractions. diff -r fade5d6b1790 -r 4d0a8c6e750c imiptools/client.py --- a/imiptools/client.py Mon Oct 26 19:46:49 2015 +0100 +++ b/imiptools/client.py Tue Oct 27 00:05:46 2015 +0100 @@ -233,14 +233,16 @@ return None - def get_periods(self, obj): + def get_periods(self, obj, explicit_only=False): """ Return periods for the given 'obj'. Interpretation of periods can depend - on the time zone, which is obtained for the current user. + on the time zone, which is obtained for the current user. If + 'explicit_only' is set to a true value, only explicit periods will be + returned, not rule-based periods. """ - return obj.get_periods(self.get_tzid(), self.get_window_end()) + return obj.get_periods(self.get_tzid(), not explicit_only and self.get_window_end() or None) # Store operations. @@ -880,11 +882,9 @@ invalid = [] for period in self.obj.get_periods(self.get_tzid()): - start = period.get_start() - end = period.get_end() - start_errors = check_permitted_values(start, permitted_values) - end_errors = check_permitted_values(end, permitted_values) - if start_errors or end_errors: + errors = period.check_permitted(permitted_values) + if errors: + start_errors, end_errors = errors invalid.append((period.origin, start_errors, end_errors)) return invalid @@ -896,6 +896,16 @@ permitted_values = self.get_permitted_values() return permitted_values and self.obj.correct_object(self.get_tzid(), permitted_values) + def correct_period(self, period): + + "Correct 'period' according to any scheduling constraints." + + permitted_values = self.get_permitted_values() + if not permitted_values: + return period + else: + return period.get_corrected(permitted_values) + # Object retrieval. def get_stored_object_version(self): diff -r fade5d6b1790 -r 4d0a8c6e750c imiptools/period.py --- a/imiptools/period.py Mon Oct 26 19:46:49 2015 +0100 +++ b/imiptools/period.py Tue Oct 27 00:05:46 2015 +0100 @@ -129,6 +129,10 @@ return Comparable(ifnone(self.get_end_point(), EndOfTime())) > Comparable(ifnone(other.get_start_point(), StartOfTime())) and \ Comparable(ifnone(self.get_start_point(), StartOfTime())) < Comparable(ifnone(other.get_end_point(), EndOfTime())) + def within(self, other): + return Comparable(ifnone(self.get_start_point(), StartOfTime())) >= Comparable(ifnone(other.get_start_point(), StartOfTime())) and \ + Comparable(ifnone(self.get_end_point(), EndOfTime())) <= Comparable(ifnone(other.get_end_point(), EndOfTime())) + def get_key(self): return self.get_start(), self.get_end() @@ -239,9 +243,18 @@ # Value correction methods. - def get_corrected(self, permitted_values): + def with_duration(self, duration): - "Return a corrected version of this period." + """ + Return a version of this period with the same start point but with the + given 'duration'. + """ + + return self.make_corrected(self.get_start(), self.get_start() + duration) + + def check_permitted(self, permitted_values): + + "Check the period against the given 'permitted_values'." start = self.get_start() end = self.get_end() @@ -249,8 +262,21 @@ end_errors = check_permitted_values(end, permitted_values) if not (start_errors or end_errors): + return None + + return start_errors, end_errors + + def get_corrected(self, permitted_values): + + "Return a corrected version of this period." + + errors = self.check_permitted(permitted_values) + + if not errors: return self + start_errors, end_errors = errors + if start_errors: start = correct_datetime(start, permitted_values) if end_errors: