# HG changeset patch # User Paul Boddie # Date 1512945681 -3600 # Node ID 337a05845a69789c02903fdb16a60da1261f3c80 # Parent 78a913d3bdef1f05822a8db084e3fac22807ea69 Ensure that periods in the managed state are copied and can therefore be edited independently from the original values. diff -r 78a913d3bdef -r 337a05845a69 imiptools/editing.py --- a/imiptools/editing.py Sat Dec 09 22:35:53 2017 +0100 +++ b/imiptools/editing.py Sun Dec 10 23:41:21 2017 +0100 @@ -33,6 +33,16 @@ # General editing abstractions. +class CopiableList(list): + + "A list whose elements promise to implement a copy method." + + def copy(self): + copied = [] + for i in self: + copied.append(i.copy()) + return copied + class State: "Manage editing state." @@ -64,7 +74,12 @@ "Return the original state for the given 'key'." self.ensure_original(key) - return copy(self.original[key]) + data = self.original[key] + if isinstance(data, CopiableList): + copied = data.copy() + else: + copied = copy(self.original[key]) + return copied def get(self, key, reset=False): @@ -88,6 +103,13 @@ self.ensure_original(key) self.state[key] = value + def unset(self, key): + + "Unset 'key' in the state." + + del self.state[key] + del self.original[key] + def has_changed(self, key): "Return whether 'key' has changed during editing." @@ -96,6 +118,9 @@ # Dictionary emulation methods. + def __delitem__(self, key): + self.unset(key) + def __getitem__(self, key): return self.get(key) @@ -127,7 +152,7 @@ self.state = State({ "attendees" : lambda: OrderedDict(self.obj.get_items("ATTENDEE") or []), "organiser" : lambda: self.obj.get_value("ORGANIZER"), - "periods" : lambda: form_periods_from_periods(self.get_unedited_periods()), + "periods" : lambda: CopiableList(form_periods_from_periods(self.get_unedited_periods())), "suggested_attendees" : self.get_suggested_attendees, "suggested_periods" : self.get_suggested_periods, "summary" : lambda: self.obj.get_value("SUMMARY"), @@ -398,7 +423,7 @@ "Combine unedited and checked edited periods to make updated periods." - original = self.get_unedited_periods() + original = self.state.get_original("periods") current = self.get_checked_periods() return combine_periods(original, current)