diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-09-06 18:45:21 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-09-06 18:45:21 +0200 |
commit | 66a0826cb59bad4c1b4c321ddaf946227bb37e3e (patch) | |
tree | e249583d291a8e3df4741007f5ad43d6a317684f /ishtar_common/wizards.py | |
parent | 11242d6f7140b91c25b302f6e06c48968c34da16 (diff) | |
download | Ishtar-66a0826cb59bad4c1b4c321ddaf946227bb37e3e.tar.bz2 Ishtar-66a0826cb59bad4c1b4c321ddaf946227bb37e3e.zip |
Context records: related parcel are now kept when you modify operation (refs #3115)
Diffstat (limited to 'ishtar_common/wizards.py')
-rw-r--r-- | ishtar_common/wizards.py | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 7fc22f1a9..002eeeb57 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -557,10 +557,15 @@ class Wizard(NamedUrlWizardView): m2m_items = {} # clear # TODO! perf - to be really optimized + old_m2ms = {} for model in whole_associated_models: related_model = getattr(obj, model + 's') # clear real m2m if hasattr(related_model, 'clear'): + old_m2ms[model] = [] + # stock items in order to not recreate them + for old_item in related_model.all(): + old_m2ms[model].append(old_item) related_model.clear() else: for r in related_model.all(): @@ -581,16 +586,32 @@ class Wizard(NamedUrlWizardView): if value not in m2m_items[key]: if type(value) == dict: model = related_model.model - if issubclass(model, models.BaseHistorizedItem): - value['history_modifier'] = self.request.user # not m2m -> foreign key if not hasattr(related_model, 'clear'): assert hasattr(model, 'MAIN_ATTR'), \ u"Must define a MAIN_ATTR for " + \ unicode(model.__class__) value[getattr(model, 'MAIN_ATTR')] = obj - value = model.objects.create(**value) - value.save() + + # check old links + my_old_item = None + if key in old_m2ms: + for old_item in old_m2ms[key]: + is_ok = True + for k in value: + if is_ok and getattr(old_item, k) != value[k]: + is_ok = False + continue + if is_ok: + my_old_item = old_item + break + if my_old_item: + value = my_old_item + else: + if issubclass(model, models.BaseHistorizedItem): + value['history_modifier'] = self.request.user + value = model.objects.create(**value) + value.save() # check that an item is not add multiple times (forged forms) if value not in related_model.all() and\ hasattr(related_model, 'add'): |