# HG changeset patch # User Paul Boddie # Date 1505255388 -7200 # Node ID caed4fe9512208b537c877fc30c285fdbdef4d4c # Parent 3247e43c0af89512d200adcc4a7be0f7f4fd4df6# Parent 1aa985ba6e761305bf79d1e1cf23f0fd22133dbc Merged changes from concurrent branch. diff -r 3247e43c0af8 -r caed4fe95122 imipweb/data.py --- a/imipweb/data.py Wed Sep 13 00:11:22 2017 +0200 +++ b/imipweb/data.py Wed Sep 13 00:29:48 2017 +0200 @@ -358,6 +358,34 @@ active_periods[p] += 1 return active_periods +def get_removed_periods(periods, still_to_remove): + + """ + From the recurrence 'periods', given details of those 'still_to_remove', + return the remaining active periods and the periods to unschedule or + exclude, using a tuple of the form (active, unscheduled, excluded). + """ + + to_remove = set() + + # Get all periods that are not replaced. + + active_periods = get_active_periods(periods) + + for period in still_to_remove: + active_periods[period] -= 1 + to_remove.add(period) + + # Determine whether some periods are both removed and added. + + remaining = [] + for period, n in active_periods.items(): + if n > 0: + remaining.append(period) + + to_remove.difference_update(remaining) + return remaining, to_remove + # Form field extraction and serialisation. diff -r 3247e43c0af8 -r caed4fe95122 imipweb/event.py --- a/imipweb/event.py Wed Sep 13 00:11:22 2017 +0200 +++ b/imipweb/event.py Wed Sep 13 00:29:48 2017 +0200 @@ -25,7 +25,7 @@ from imiptools.mail import Messenger from imipweb.data import EventPeriod, event_period_from_period, \ filter_duplicates, get_active_periods, \ - remove_from_collection, \ + get_removed_periods, remove_from_collection, \ get_period_control_values, \ PeriodError from imipweb.resource import DateTimeFormUtilities, FormUtilities, ResourceClientForObject @@ -1044,31 +1044,21 @@ excluded). """ + # Get remaining periods and those whose removal is deferred. + + remaining, to_remove = get_removed_periods(periods, + self.get_state("recur-remove", list)) + + # Sort the deferred removal periods into categories. + to_unschedule = set() to_exclude = set() - # Get all periods that are not replaced. - - active_periods = get_active_periods(periods) - - for period in self.get_state("recur-remove", list): - active_periods[period] -= 1 - + for period in to_remove: if not self.can_edit_recurrence(period) and self.is_organiser(): - l = to_unschedule + to_unschedule.add(period) else: - l = to_exclude - l.add(period) - - # Determine whether some periods are both removed and added. - - remaining = [] - for period, n in active_periods.items(): - if n > 0: - remaining.append(period) - - to_unschedule.difference_update(remaining) - to_exclude.difference_update(remaining) + to_exclude.add(period) return remaining, to_unschedule, to_exclude