diff options
Diffstat (limited to 'ishtar_common/wizards.py')
| -rw-r--r-- | ishtar_common/wizards.py | 30 | 
1 files changed, 23 insertions, 7 deletions
| diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index d00766978..031498ca3 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -326,7 +326,7 @@ class Wizard(NamedUrlWizardView):                          for val in values:                              item = associated_models[key].objects.get(pk=val)                              if hasattr(item, 'short_label'): -                                value = item.short_label +                                value = unicode(item.short_label)                              else:                                  value = unicode(item)                              rendered_values.append(value) @@ -545,30 +545,46 @@ class Wizard(NamedUrlWizardView):              # material_index management for baseitems              obj.save()          m2m_items = {} +        # clear +        # TODO! perf - to be really optimized          for model in whole_associated_models: -            getattr(obj, model + 's').clear() +            related_model = getattr(obj, model + 's') +            # clear real m2m +            if hasattr(related_model, 'clear'): +                related_model.clear() +            else: +                for r in related_model.all(): +                    r.delete()          for key, value in m2m: +            related_model = getattr(obj, key + 's')              if key not in m2m_items:                  if type(key) == dict:                      vals = [] -                    for item in getattr(obj, key + 's').all(): +                    for item in related_model.all():                          v = {}                          for k in value.keys():                              v[k] = getattr(item, k)                          vals.append(v)                      m2m_items[key] = vals                  else: -                    m2m_items[key] = getattr(obj, key + 's').all() +                    m2m_items[key] = related_model.all()              if value not in m2m_items[key]:                  if type(value) == dict: -                    model = getattr(obj, key + 's').model +                    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 that an item is not add multiple times (forged forms) -                if value not in getattr(obj, key + 's').all(): -                    getattr(obj, key + 's').add(value) +                if value not in related_model.all() and\ +                        hasattr(related_model, 'add'): +                    related_model.add(value)                      # necessary to manage interaction between models like                      # material_index management for baseitems                      obj.save() | 
