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() |