summaryrefslogtreecommitdiff
path: root/ishtar_common/wizards.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/wizards.py')
-rw-r--r--ishtar_common/wizards.py40
1 files changed, 30 insertions, 10 deletions
diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py
index 7fc22f1a9..c8467ca61 100644
--- a/ishtar_common/wizards.py
+++ b/ishtar_common/wizards.py
@@ -32,7 +32,7 @@ from django.db.models.fields.files import FileField
from django.db.models.fields.related import ManyToManyField
from django.http import HttpResponseRedirect
from django.forms import ValidationError
-from django.shortcuts import render_to_response
+from django.shortcuts import render_to_response, redirect
from django.template import Context, RequestContext, loader
from django.utils.datastructures import MultiValueDict as BaseMultiValueDict
from django.utils.translation import ugettext_lazy as _
@@ -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'):
@@ -632,7 +653,7 @@ class Wizard(NamedUrlWizardView):
return (to_delete, not_to_delete)
def get_form(self, step=None, data=None, files=None):
- """Manage formset"""
+ # Manage formset
if data:
data = data.copy()
if not step:
@@ -695,6 +716,7 @@ class Wizard(NamedUrlWizardView):
# for k in init[0]:
# data[step + '-' + unicode(total_field) + '-' + k] = \
# init[0][k]
+
data = data or None
form = super(Wizard, self).get_form(step, data, files)
# add autofocus to first field
@@ -723,6 +745,7 @@ class Wizard(NamedUrlWizardView):
if frm.fields[key].widget.source_full is not None:
frm.fields[key].widget.source_full = unicode(
frm.fields[key].widget.source_full) + "own/"
+
return form
def render_next_step(self, form, **kwargs):
@@ -760,10 +783,7 @@ class Wizard(NamedUrlWizardView):
except (ValueError, IndexError):
return super(Wizard, self).post(*args, **kwargs)
self.storage.current_step = wizard_goto_step
- form = self.get_form(
- data=self.storage.get_step_data(self.steps.current),
- files=self.storage.get_step_files(self.steps.current))
- return self.render(form)
+ return redirect(self.get_step_url(wizard_goto_step))
def session_get_keys(self, form_key):
"""Get list of available keys for a specific form