diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-09 00:46:34 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-09 00:46:34 +0100 |
commit | 6afe48ce4f15f14b75980f62de321185367a3d64 (patch) | |
tree | 18e151e014e96d922c2d6f1f163c0fcb04341c5e | |
parent | afb60d9f6d59816fb4e3e1986ab5d2f29f5603fc (diff) | |
download | Ishtar-6afe48ce4f15f14b75980f62de321185367a3d64.tar.bz2 Ishtar-6afe48ce4f15f14b75980f62de321185367a3d64.zip |
Manage save of modifications (refs #51)
-rw-r--r-- | ishtar/furnitures/forms.py | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index d0618ed36..3736029d5 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -176,11 +176,19 @@ class Wizard(NamedUrlSessionFormWizard): value = associated_models[key].objects.get(pk=value) dct[key] = value dct = self.get_extra_model(dct, request, storage, form_list) - obj = self.model(**dct) + obj = self.get_current_object(request, storage) + if obj: + for k in dct: + if k == 'pk': + continue + setattr(obj, k, dct[k]) + else: + obj = self.model(**dct) obj.save() for key, value in m2m: - getattr(obj, key+'s').add(value) - obj.save() + if value not in getattr(obj, key+'s').all(): + getattr(obj, key+'s').add(value) + obj.save() res = render_to_response('wizard_done.html', {}, context_instance=RequestContext(request)) return return_object and (obj, res) or res @@ -222,8 +230,12 @@ class Wizard(NamedUrlSessionFormWizard): data[ck] = data.pop(key)[0] # get a form key base_key = form.form.base_fields.keys()[0] - total_field = len([key for key in data.keys() + init = self.get_form_initial(request, storage, step) + if not init: + total_field = len([key for key in data.keys() if base_key in key.split('-') and data[key]]) + else: + total_field = len(init) data[step + u'-INITIAL_FORMS'] = unicode(total_field) data[step + u'-TOTAL_FORMS'] = unicode(total_field + 1) data = data or None @@ -258,7 +270,11 @@ class Wizard(NamedUrlSessionFormWizard): return super(Wizard, self).process_post_request(request, storage, *args, **kwargs) - def get_form_initial(self, request, storage, step): + def get_current_object(self, request, storage): + """ + Get the current object for an instancied wizard + """ + current_obj = None main_form_key = 'selec-' + self.url_name pk = main_form_key + '-pk' if storage.prefix in request.session \ @@ -270,11 +286,16 @@ class Wizard(NamedUrlSessionFormWizard): idx = int(request.session[storage.prefix]['step_data'] [main_form_key][pk]) current_obj = self.model.objects.get(pk=idx) - return self.get_instanced_init(current_obj, request, storage, - step) except(TypeError, ObjectDoesNotExist): pass - return super(FileWizard, self).get_form_initial(request, storage, step) + return current_obj + + def get_form_initial(self, request, storage, step): + current_obj = self.get_current_object(request, storage) + if current_obj: + return self.get_instanced_init(current_obj, request, storage, + step) + return super(Wizard, self).get_form_initial(request, storage, step) def get_instanced_init(self, obj, request, storage, step): """ @@ -383,9 +404,11 @@ class FileWizard(Wizard): dct['operation'] = None if 'DELETE' in dct: dct.pop('DELETE') - dct['history_modifier'] = request.user - parcel = models.Parcel(**dct) - parcel.save() + parcel = models.Parcel.objects.filter(**dct).count() + if not parcel: + dct['history_modifier'] = request.user + parcel = models.Parcel(**dct) + parcel.save() return res def get_now(): |