diff options
| author | Le Jeune Yann <lj.yann@gmail.com> | 2011-01-09 01:39:27 +0100 | 
|---|---|---|
| committer | Le Jeune Yann <lj.yann@gmail.com> | 2011-01-09 01:39:27 +0100 | 
| commit | 2906e1e6b8fab767be4fddb28814f83b31fc783e (patch) | |
| tree | b6cec68237b9ed994fd07d5285e624fe24c03129 /ishtar/furnitures/forms.py | |
| parent | bd9a7b9981e0cdd787a6ec774c55bc875fbadb64 (diff) | |
| parent | 09ab8db48f245271991b1bdce281033de7275c80 (diff) | |
| download | Ishtar-2906e1e6b8fab767be4fddb28814f83b31fc783e.tar.bz2 Ishtar-2906e1e6b8fab767be4fddb28814f83b31fc783e.zip | |
Merge branch 'master' of ssh://lysithea.proxience.com/home/proxience/git/ishtar
Diffstat (limited to 'ishtar/furnitures/forms.py')
| -rw-r--r-- | ishtar/furnitures/forms.py | 127 | 
1 files changed, 115 insertions, 12 deletions
| diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index 924ea8b94..64acaa5c5 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -55,6 +55,13 @@ class FormSet(BaseFormSet):  class Wizard(NamedUrlSessionFormWizard):      model = None + +    def get_wizard_name(self): +        """ +        As the class name can interfere when reused, use the url_name +        """ +        return self.url_name +      def get_template(self, request, storage):          templates = ['default_wizard.html']          current_step = storage.get_current_step() or self.get_first_step( @@ -155,11 +162,11 @@ class Wizard(NamedUrlSessionFormWizard):                  for frm in form.forms:                      if not frm.is_valid():                          continue -                    for key in frm: +                    for key in frm.cleaned_data:                          if key not in associated_models:                              # datas not managed                              continue -                        value = frm[key] +                        value = frm.cleaned_data[key]                          value = associated_models[key].objects.get(pk=value)                          m2m.append((key, value))              elif type(form.cleaned_data) == dict: @@ -169,10 +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) +            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 @@ -214,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 @@ -250,8 +270,74 @@ class Wizard(NamedUrlSessionFormWizard):          return super(Wizard, self).process_post_request(request, storage, *args,                                                          **kwargs) +    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 \ +           and 'step_data' in request.session[storage.prefix] \ +           and main_form_key in request.session[storage.prefix]['step_data'] \ +           and pk in request.session[storage.prefix]['step_data']\ +                                                    [main_form_key]: +            try: +                idx = int(request.session[storage.prefix]['step_data'] +                                                         [main_form_key][pk]) +                current_obj = self.model.objects.get(pk=idx) +            except(TypeError, ObjectDoesNotExist): +                pass +        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): +        """ +        Get initial data from an init +        """ +        current_step = storage.get_current_step() or self.get_first_step( +                                                            request, storage) +        c_form = self.form_list[current_step] +        initial = {} +        if hasattr(c_form, 'base_fields'): +            for field in c_form.base_fields.keys(): +                if hasattr(obj, field): +                    value = getattr(obj, field) +                    if hasattr(value, 'pk'): +                        value = value.pk +                    initial[field] = unicode(value) +        elif hasattr(c_form, 'management_form'): +            initial = [] +            key = current_step.split('-')[0] +            if not hasattr(obj, key): +                return initial +            for child_obj in getattr(obj, key).all(): +                vals = {} +                keys = c_form.form.base_fields.keys() +                if len(keys) == 1: +                    # only one field: must be the id of the object +                    vals[keys[0]] = unicode(child_obj.pk) +                else: +                    for field in keys: +                        if hasattr(child_obj, field): +                            value = getattr(child_obj, field) +                            if hasattr(value, 'pk'): +                                value = value.pk +                            vals[field] = unicode(value) +                if vals: +                    initial.append(vals) +        return initial + +  class FileWizard(Wizard):      model = models.File +      def get_form(self, request, storage, step=None, data=None, files=None):          """          Manage formset @@ -297,7 +383,7 @@ class FileWizard(Wizard):          Save parcels          '''          r = super(FileWizard, self).done(request, storage, form_list, -                                                return_object=True, **kwargs) +                                         return_object=True, **kwargs)          if type(r) not in (list, tuple) or len(r) != 2:              return r          obj, res = r @@ -318,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(): @@ -330,7 +418,8 @@ def get_now():  class FileFormSelection(forms.Form):      form_label = _("Archaelogical file") -    archaelogical_file = forms.IntegerField(label=_("Archaelogical file"), +    associated_models = {'pk':models.File} +    pk = forms.IntegerField(label=_("Archaelogical file"),           widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-file'),                                             associated_model=models.File),           validators=[models.valid_id(models.File)]) @@ -345,6 +434,8 @@ class FileFormGeneral(forms.Form):           validators=[models.valid_id(models.Person)])      year = forms.IntegerField(label=_("Year"),                                initial=lambda:datetime.datetime.now().year) +    numeric_reference = forms.IntegerField(label=_("Numeric reference"), +                widget=forms.HiddenInput, required=False)      internal_reference = forms.CharField(label=_(u"Internal reference"),  max_length=60, validators=[models.is_unique(models.File, 'internal_reference')])      creation_date = forms.DateField(label=_(u"Creation date"), @@ -354,10 +445,22 @@ max_length=60, validators=[models.is_unique(models.File, 'internal_reference')])      comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea,                                required=False) +class FileFormGeneralRO(FileFormGeneral): +    year = forms.IntegerField(label=_("Year"), +                        widget=forms.TextInput(attrs={'readonly':True})) +    numeric_reference = forms.IntegerField(label=_("Numeric reference"), +                        widget=forms.TextInput(attrs={'readonly':True})) +    internal_reference = forms.CharField(label=_(u"Internal reference"), +                        widget=forms.TextInput(attrs={'readonly':True})) +  class FileFormAddress(forms.Form):      form_label = _("Address") +    associated_models = {'town':models.Town}      total_surface = forms.IntegerField(label=_("Total surface")) -    address = forms.CharField(label=_(u"Address"), widget=forms.Textarea) +    address = forms.CharField(label=_(u"Main address"), widget=forms.Textarea) +    address_complement = forms.CharField(label=_(u"Main address - complement")) +    postal_code = forms.CharField(label=_(u"Main address - postal code"), +                                  max_length=10)  class TownForm(forms.Form):      form_label = _("Towns") @@ -482,7 +585,7 @@ file_creation_wizard = FileWizard([  file_modification_wizard = FileWizard([                            ('selec-file_modification', FileFormSelection), -                          ('general-file_modification', FileFormGeneral), +                          ('general-file_modification', FileFormGeneralRO),                            ('adress-file_modification', FileFormAddress),                            ('towns-file_modification', TownFormSet),                            ('parcels-file_modification', ParcelFormSet), | 
