diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2016-01-10 15:35:51 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2016-01-10 15:35:51 +0100 |
commit | 11d7e76203e13a6d4c2a0c9aa29bd2d1dd86f5b6 (patch) | |
tree | 8d8e7c09faf179b2fed07878d1cf450a245a78d0 /ishtar_common/wizards.py | |
parent | 19fcd922361b045894c0eeb56e095d785299909e (diff) | |
parent | 2c063aace94e5a9f3b5dc596e4a502ef062db059 (diff) | |
download | Ishtar-11d7e76203e13a6d4c2a0c9aa29bd2d1dd86f5b6.tar.bz2 Ishtar-11d7e76203e13a6d4c2a0c9aa29bd2d1dd86f5b6.zip |
Merge branch 'master' into master-land-planner-2999
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() |