summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/wizards.py30
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()