1.1 --- a/imipweb/data.py Wed Sep 13 00:11:22 2017 +0200
1.2 +++ b/imipweb/data.py Wed Sep 13 00:29:48 2017 +0200
1.3 @@ -358,6 +358,34 @@
1.4 active_periods[p] += 1
1.5 return active_periods
1.6
1.7 +def get_removed_periods(periods, still_to_remove):
1.8 +
1.9 + """
1.10 + From the recurrence 'periods', given details of those 'still_to_remove',
1.11 + return the remaining active periods and the periods to unschedule or
1.12 + exclude, using a tuple of the form (active, unscheduled, excluded).
1.13 + """
1.14 +
1.15 + to_remove = set()
1.16 +
1.17 + # Get all periods that are not replaced.
1.18 +
1.19 + active_periods = get_active_periods(periods)
1.20 +
1.21 + for period in still_to_remove:
1.22 + active_periods[period] -= 1
1.23 + to_remove.add(period)
1.24 +
1.25 + # Determine whether some periods are both removed and added.
1.26 +
1.27 + remaining = []
1.28 + for period, n in active_periods.items():
1.29 + if n > 0:
1.30 + remaining.append(period)
1.31 +
1.32 + to_remove.difference_update(remaining)
1.33 + return remaining, to_remove
1.34 +
1.35
1.36
1.37 # Form field extraction and serialisation.
2.1 --- a/imipweb/event.py Wed Sep 13 00:11:22 2017 +0200
2.2 +++ b/imipweb/event.py Wed Sep 13 00:29:48 2017 +0200
2.3 @@ -25,7 +25,7 @@
2.4 from imiptools.mail import Messenger
2.5 from imipweb.data import EventPeriod, event_period_from_period, \
2.6 filter_duplicates, get_active_periods, \
2.7 - remove_from_collection, \
2.8 + get_removed_periods, remove_from_collection, \
2.9 get_period_control_values, \
2.10 PeriodError
2.11 from imipweb.resource import DateTimeFormUtilities, FormUtilities, ResourceClientForObject
2.12 @@ -1044,31 +1044,21 @@
2.13 excluded).
2.14 """
2.15
2.16 + # Get remaining periods and those whose removal is deferred.
2.17 +
2.18 + remaining, to_remove = get_removed_periods(periods,
2.19 + self.get_state("recur-remove", list))
2.20 +
2.21 + # Sort the deferred removal periods into categories.
2.22 +
2.23 to_unschedule = set()
2.24 to_exclude = set()
2.25
2.26 - # Get all periods that are not replaced.
2.27 -
2.28 - active_periods = get_active_periods(periods)
2.29 -
2.30 - for period in self.get_state("recur-remove", list):
2.31 - active_periods[period] -= 1
2.32 -
2.33 + for period in to_remove:
2.34 if not self.can_edit_recurrence(period) and self.is_organiser():
2.35 - l = to_unschedule
2.36 + to_unschedule.add(period)
2.37 else:
2.38 - l = to_exclude
2.39 - l.add(period)
2.40 -
2.41 - # Determine whether some periods are both removed and added.
2.42 -
2.43 - remaining = []
2.44 - for period, n in active_periods.items():
2.45 - if n > 0:
2.46 - remaining.append(period)
2.47 -
2.48 - to_unschedule.difference_update(remaining)
2.49 - to_exclude.difference_update(remaining)
2.50 + to_exclude.add(period)
2.51
2.52 return remaining, to_unschedule, to_exclude
2.53