# HG changeset patch # User Paul Boddie # Date 1508022272 -7200 # Node ID 27150486ae63c3e6feb8f9b139aef1e17db6ffd5 # Parent 0012a92689b87301026fc8b8ad1d502a7c9c8cc3 Check for overlapping periods when validating the data. diff -r 0012a92689b8 -r 27150486ae63 imipweb/data.py --- a/imipweb/data.py Sun Oct 15 01:04:11 2017 +0200 +++ b/imipweb/data.py Sun Oct 15 01:04:32 2017 +0200 @@ -28,7 +28,7 @@ format_datetime, get_datetime, \ get_datetime_attributes, get_end_of_day, \ to_date, to_utc_datetime, to_timezone -from imiptools.period import RecurringPeriod +from imiptools.period import get_overlapping_members, RecurringPeriod from itertools import chain # General editing abstractions. @@ -239,10 +239,11 @@ """ self.state["period_errors"] = errors = {} + + # Basic validation. + try: periods = event_periods_from_periods(self.state.get("periods")) - self.state["periods"] = form_periods_from_periods(periods) - return periods except PeriodError, exc: @@ -256,6 +257,21 @@ l.append(err) raise + # Check for overlapping periods. + + overlapping = get_overlapping_members(periods) + + for period in overlapping: + for index, p in enumerate(periods): + if period is p: + errors[index] = ["overlap"] + + if overlapping: + raise PeriodError + + self.state["periods"] = form_periods_from_periods(periods) + return periods + # Update result computation. def classify_attendee_changes(self):