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")) | 
