diff options
| -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'): | 
