# HG changeset patch # User Paul Boddie # Date 1505254866 -7200 # Node ID 1aa985ba6e761305bf79d1e1cf23f0fd22133dbc # Parent 19a3de939b452ca3759ce9fcd201582024cdf2a7 Moved period removal logic into the data module. diff -r 19a3de939b45 -r 1aa985ba6e76 imipweb/data.py --- a/imipweb/data.py Wed Sep 13 00:09:24 2017 +0200 +++ b/imipweb/data.py Wed Sep 13 00:21:06 2017 +0200 @@ -358,6 +358,39 @@ 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 i in still_to_remove: + try: + period = periods[int(i)] + except (IndexError, ValueError): + continue + + 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 19a3de939b45 -r 1aa985ba6e76 imipweb/event.py --- a/imipweb/event.py Wed Sep 13 00:09:24 2017 +0200 +++ b/imipweb/event.py Wed Sep 13 00:21:06 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, set_period_control_values, \ PeriodError from imipweb.resource import DateTimeFormUtilities, FormUtilities, ResourceClientForObject @@ -1045,38 +1045,21 @@ excluded). """ - args = self.env.get_args() + # Get remaining periods and those whose removal is deferred. + + remaining, to_remove = get_removed_periods(periods, + self.env.get_args().get("recur-remove", [])) + + # 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 i in args.get("recur-remove", []): - try: - period = periods[int(i)] - except (IndexError, ValueError): - continue - - 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