1.1 --- a/imiptools/editing.py Fri Jan 12 21:56:34 2018 +0100
1.2 +++ b/imiptools/editing.py Sat Jan 13 17:25:04 2018 +0100
1.3 @@ -1434,17 +1434,18 @@
1.4 active_periods = new + replaced + retained
1.5 active_non_rule = filter(lambda p: p.origin != "RRULE", active_periods)
1.6
1.7 - # Modified replaced and retained recurrences are used for incremental
1.8 - # updates.
1.9 + # Modified replaced recurrences are used for incremental updates.
1.10
1.11 replaced_modified = select_recurrences(replaced, modified).values()
1.12 - retained_modified = select_recurrences(retained, modified).values()
1.13
1.14 - # Unmodified replaced and retained recurrences are used in the complete
1.15 - # event summary.
1.16 + # Unmodified replaced recurrences are used in the complete event summary.
1.17
1.18 replaced_unmodified = subtract_recurrences(replaced, modified).values()
1.19 - retained_unmodified = subtract_recurrences(retained, modified).values()
1.20 +
1.21 + # Determine any new replacement periods. These are edited periods that were
1.22 + # not previously replacements.
1.23 +
1.24 + replaced_new = filter(lambda p: p.new_replacement, replaced)
1.25
1.26 # Obtain the removed periods in terms of existing periods. These are used in
1.27 # incremental updates.
1.28 @@ -1466,18 +1467,12 @@
1.29 # Cancelled periods originating from rules must be excluded since there are
1.30 # no explicit instances to be deleted.
1.31
1.32 - cancelled_rule = []
1.33 - for p in cancelled_removed:
1.34 - if p.origin == "RRULE":
1.35 - cancelled_rule.append(p)
1.36 + cancelled_rule = filter(lambda p: p.origin == "RRULE", cancelled_removed)
1.37
1.38 # Obsolete periods (replaced by other periods) originating from rules must
1.39 # be excluded if no explicit instance will be used to replace them.
1.40
1.41 - obsolete_rule = []
1.42 - for p in obsolete:
1.43 - if p.origin == "RRULE":
1.44 - obsolete_rule.append(p)
1.45 + obsolete_rule = filter(lambda p: p.origin == "RRULE", obsolete)
1.46
1.47 # As organiser...
1.48
1.49 @@ -1509,7 +1504,7 @@
1.50 to_set = []
1.51 to_exclude = []
1.52 to_unschedule = cancelled_removed
1.53 - to_reschedule = list(chain(replaced_modified, retained_modified, reinstated))
1.54 + to_reschedule = list(chain(replaced_modified, reinstated))
1.55 to_add = new
1.56 all_unscheduled = cancelled_unmodified
1.57 all_rescheduled = list(chain(replaced_unmodified, to_reschedule))
1.58 @@ -1520,27 +1515,27 @@
1.59 to_unschedule = []
1.60 to_add = []
1.61
1.62 - # Changed periods without new or removed periods are proposed as
1.63 - # separate changes. Parent event changes cause redefinition of the
1.64 - # entire event.
1.65 + # Parent event changes cause redefinition of the entire event.
1.66 + # The event is defined in terms of new periods and exceptions for
1.67 + # removed periods or obsolete rule periods.
1.68
1.69 - if not new and not removed and not is_changed:
1.70 - to_set = []
1.71 - to_exclude = []
1.72 - to_reschedule = list(chain(replaced_modified, retained_modified, reinstated))
1.73 - all_unscheduled = list(cancelled_unmodified)
1.74 - all_rescheduled = list(chain(replaced_unmodified, to_reschedule))
1.75 -
1.76 - # Otherwise, the event is defined in terms of new periods and
1.77 - # exceptions for removed periods or obsolete rule periods.
1.78 -
1.79 - else:
1.80 + if new or removed or is_changed or reinstated or replaced_new:
1.81 to_set = active_non_rule
1.82 to_exclude = list(chain(cancelled, obsolete_rule, cancelled_main))
1.83 to_reschedule = []
1.84 all_unscheduled = []
1.85 all_rescheduled = []
1.86
1.87 + # Changed periods without new or removed periods are proposed as
1.88 + # separate changes.
1.89 +
1.90 + else:
1.91 + to_set = []
1.92 + to_exclude = []
1.93 + to_reschedule = replaced_modified
1.94 + all_unscheduled = cancelled_unmodified
1.95 + all_rescheduled = list(chain(replaced_unmodified, to_reschedule))
1.96 +
1.97 return to_unschedule, to_reschedule, to_add, to_exclude, to_set, all_unscheduled, all_rescheduled
1.98
1.99 def get_period_mapping(periods):