# HG changeset patch # User Paul Boddie # Date 1508102548 -7200 # Node ID d4a1ce61c6261b301b1749086d9573bdc986d16a # Parent c74acb35be674486f1b1f400f7a34c123a15ff76 Obtain obsolete periods so that rule-originating periods that are replaced can be excluded in various messages. diff -r c74acb35be67 -r d4a1ce61c626 imipweb/data.py --- a/imipweb/data.py Sun Oct 15 23:21:37 2017 +0200 +++ b/imipweb/data.py Sun Oct 15 23:22:28 2017 +0200 @@ -343,7 +343,7 @@ "Classify period update operations." - new, replaced, retained, cancelled = self.classify_periods() + new, replaced, retained, cancelled, obsolete = self.classify_periods() modified, unmodified, removed = self.classify_period_changes() @@ -351,7 +351,7 @@ is_shared = self.obj.is_shared() return classify_period_operations(new, replaced, retained, cancelled, - modified, removed, + obsolete, modified, removed, is_organiser, is_shared, is_changed) def properties_changed(self): @@ -1195,19 +1195,22 @@ """ Using the 'updated_periods', being a list of (stored, current) periods, - return a tuple containing collections of new, replaced, retained and - cancelled periods. + return a tuple containing collections of new, replaced, retained, cancelled + and obsolete periods. Note that replaced and retained indicate the presence or absence of differences between the original event periods and the current periods that would need to be represented using separate recurrence instances, not whether any editing operations have changed the periods. + + Obsolete periods are those that have been replaced but not cancelled. """ new = [] replaced = [] retained = [] cancelled = [] + obsolete = [] for sp, p in updated_periods: @@ -1226,6 +1229,7 @@ replaced.append(p) if not p.replacement: p.new_replacement = True + obsolete.append(sp) # With retained, not differing current periods. @@ -1239,7 +1243,7 @@ elif p: new.append(p) - return new, replaced, retained, cancelled + return new, replaced, retained, cancelled, obsolete def classify_period_changes(updated_periods): @@ -1274,7 +1278,7 @@ return modified, unmodified, removed def classify_period_operations(new, replaced, retained, cancelled, - modified, removed, + obsolete, modified, removed, is_organiser, is_shared, is_changed): """ @@ -1306,14 +1310,6 @@ cancelled_removed = select_recurrences(cancelled, removed).values() - # Cancelled periods originating from rules must be excluded since there are - # no explicit instances to be deleted. - - cancelled_rule = [] - for p in cancelled_removed: - if p.origin == "RRULE": - cancelled_rule.append(p) - # Reinstated periods are previously-cancelled periods that are now modified # periods, and they appear in updates. @@ -1324,6 +1320,22 @@ cancelled_unmodified = subtract_recurrences(cancelled, modified).values() + # Cancelled periods originating from rules must be excluded since there are + # no explicit instances to be deleted. + + cancelled_rule = [] + for p in cancelled_removed: + if p.origin == "RRULE": + cancelled_rule.append(p) + + # Obsolete periods (replaced by other periods) originating from rules must + # be excluded if no explicit instance will be used to replace them. + + obsolete_rule = [] + for p in obsolete: + if p.origin == "RRULE": + obsolete_rule.append(p) + # As organiser... if is_organiser: @@ -1339,7 +1351,7 @@ if not is_shared or new and not replaced: to_set = active_periods - to_exclude = cancelled_rule + to_exclude = list(chain(cancelled_rule, obsolete_rule)) to_unschedule = [] to_reschedule = [] to_add = [] @@ -1376,11 +1388,11 @@ all_rescheduled = list(chain(replaced_unmodified, to_reschedule)) # Otherwise, the event is defined in terms of new periods and - # exceptions for removed periods. + # exceptions for removed periods or obsolete rule periods. else: to_set = active_periods - to_exclude = cancelled + to_exclude = list(chain(cancelled, obsolete_rule)) to_reschedule = [] all_unscheduled = [] all_rescheduled = []