diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-07 02:20:09 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-07 02:20:09 +0100 |
commit | 67d9315db7656319322f38e31bc7bd44d0dbe9b9 (patch) | |
tree | d2ae727ef94647ca502cb61e3032ab5bd7f53c7b | |
parent | ac07856860b811d27e5cd4265cf85a2523f87a41 (diff) | |
download | Ishtar-67d9315db7656319322f38e31bc7bd44d0dbe9b9.tar.bz2 Ishtar-67d9315db7656319322f38e31bc7bd44d0dbe9b9.zip |
Save of parcels (refs #14)
-rw-r--r-- | ishtar/furnitures/forms.py | 70 | ||||
-rw-r--r-- | ishtar/furnitures/models.py | 7 |
2 files changed, 58 insertions, 19 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index 1dc06fb32..a65c44611 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -50,6 +50,7 @@ class FormSet(BaseFormSet): pass class Wizard(NamedUrlSessionFormWizard): + model = None def get_template(self, request, storage): templates = ['default_wizard.html'] current_step = storage.get_current_step() or '0' @@ -114,37 +115,42 @@ class Wizard(NamedUrlSessionFormWizard): datas.append((lbl, value)) return datas - def done(self, request, storage, form_list, **kwargs): + def done(self, request, storage, form_list, return_object=False, **kwargs): """ Save to the model """ dct, m2m = {}, [] for form in form_list: + if not form.is_valid(): + return self.render(request, storage, form) base_form = hasattr(form, 'forms') and form.forms[0] or form associated_models = hasattr(base_form, 'associated_models') and \ base_form.associated_models or {} - if type(form.cleaned_data) == dict: - for key in form.cleaned_data: - value = form.cleaned_data[key] - if key in associated_models: - value = associated_models[key].objects.get(pk=value) - dct[key] = value - elif type(form.cleaned_data) == list: - for item in form.cleaned_data: - for key in item: + if hasattr(form, 'forms'): + for frm in form.forms: + if not frm.is_valid(): + continue + for key in frm: if key not in associated_models: # datas not managed continue - value = item[key] + value = frm[key] value = associated_models[key].objects.get(pk=value) m2m.append((key, value)) + elif type(form.cleaned_data) == dict: + for key in form.cleaned_data: + value = form.cleaned_data[key] + if key in associated_models: + value = associated_models[key].objects.get(pk=value) + dct[key] = value dct['history_modifier'] = request.user - fle = models.File(**dct) - fle.save() + obj = self.model(**dct) + obj.save() for key, value in m2m: - getattr(fle, key+'s').add(value) - return render_to_response('wizard_done.html', {}, + getattr(obj, key+'s').add(value) + res = render_to_response('wizard_done.html', {}, context_instance=RequestContext(request)) + return return_object and (obj, res) or res def get_form(self, request, storage, step=None, data=None, files=None): """ @@ -187,6 +193,7 @@ class Wizard(NamedUrlSessionFormWizard): if base_key in key.split('-') and data[key]]) data[step + u'-INITIAL_FORMS'] = unicode(total_field) data[step + u'-TOTAL_FORMS'] = unicode(total_field + 1) + data = data or None form = super(Wizard, self).get_form(request, storage, step, data, files) return form @@ -201,6 +208,7 @@ class Wizard(NamedUrlSessionFormWizard): **kwargs) class FileWizard(Wizard): + model = models.File def get_form(self, request, storage, step=None, data=None, files=None): """ Manage formset @@ -231,6 +239,35 @@ class FileWizard(Wizard): files) return form + def done(self, request, storage, form_list, **kwargs): + ''' + Save parcels + ''' + r = super(FileWizard, self).done(request, storage, form_list, + return_object=True, **kwargs) + if type(r) not in (list, tuple) or len(r) != 2: + return r + obj, res = r + for form in form_list: + if not hasattr(form, 'prefix') or form.prefix != '3' \ + or not hasattr(form, 'forms'): + continue + for frm in form.forms: + if not frm.is_valid(): + continue + dct = frm.cleaned_data.copy() + try: + dct['town'] = models.Town.objects.get(pk=int(dct['town'])) + except (ValueError, ObjectDoesNotExist): + continue + dct['associated_file'] = obj + dct['operation'] = None + if 'DELETE' in dct: + dct.pop('DELETE') + parcel = models.Parcel(**dct) + parcel.save() + return res + class FileForm1(forms.Form): form_label = _("General") associated_models = {'in_charge':models.Person, @@ -284,6 +321,7 @@ TownFormSet.form_label = _("Towns") class ParcelForm(forms.Form): form_label = _("Parcels") + associated_models = {'parcel':models.Parcel} town = forms.ChoiceField(label=_("Town"), choices=(), validators=[models.Town.valid_id]) section = forms.CharField(label=_(u"Section"), @@ -300,7 +338,7 @@ class ParcelForm(forms.Form): prefix_value = kwargs['prefix'] + '-town' if not [k for k in kwargs['data'].keys() if k.startswith(prefix_value) and kwargs['data'][k]]: - kwargs.pop('data') + kwargs['data'] = None if 'files' in kwargs: kwargs.pop('files') super(ParcelForm, self).__init__(*args, **kwargs) diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py index 6e623d321..65307e15a 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -301,9 +301,9 @@ class Operation(BaseHistorizedItem, OwnPerms): class Parcel(LightHistorizedItem) : - associated_file = models.ForeignKey(File, related_name='+', blank=True, + associated_file = models.ForeignKey(File, related_name='parcel', blank=True, null=True, verbose_name=_(u"File")) - operation = models.ForeignKey(Operation, related_name='+', blank=True, + operation = models.ForeignKey(Operation, related_name='parcel', blank=True, null=True, verbose_name=_(u"Operation")) year = models.IntegerField(_(u"Year"), default=lambda:datetime.datetime.now().year) @@ -317,7 +317,8 @@ class Parcel(LightHistorizedItem) : def __unicode__(self): return u" - ".join([unicode(item) for item in \ - [self.operation, self.section, self.parcel_number]]) + [self.associated_file, self.operation, self.section, self.parcel_number] + if item]) class Period(GeneralType) : order = models.IntegerField(_(u"Order")) |