diff options
Diffstat (limited to 'ishtar_common')
-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'): |