summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
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
commitdbc9513456f63612db110cfa847ee65e35954a06 (patch)
treee249583d291a8e3df4741007f5ad43d6a317684f /ishtar_common
parent4b6c126dd1b3b8c7d52e64167758a505f0960f27 (diff)
downloadIshtar-dbc9513456f63612db110cfa847ee65e35954a06.tar.bz2
Ishtar-dbc9513456f63612db110cfa847ee65e35954a06.zip
Context records: related parcel are now kept when you modify operation (refs #3115)
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/wizards.py29
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'):