diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-31 21:28:02 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-31 21:28:02 +0100 | 
| commit | 603b94b71f230cccfc1edd325c884c701660c473 (patch) | |
| tree | fa4bdd92fb48644dd2565d2c8651029f638a545d /ishtar/furnitures/forms.py | |
| parent | 4c8f1f09ba137d3f5bdd10ff1825c81fceb443d7 (diff) | |
| download | Ishtar-603b94b71f230cccfc1edd325c884c701660c473.tar.bz2 Ishtar-603b94b71f230cccfc1edd325c884c701660c473.zip | |
Link parcels to operations (closes #153)
Diffstat (limited to 'ishtar/furnitures/forms.py')
| -rw-r--r-- | ishtar/furnitures/forms.py | 91 | 
1 files changed, 80 insertions, 11 deletions
| diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index abf76d781..db440081c 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -289,7 +289,7 @@ class Wizard(NamedUrlSessionFormWizard):          return super(Wizard, self).process_post_request(request, storage, *args,                                                          **kwargs)      @classmethod -    def session_has_key(cls, request, storage, form_key, key=None): +    def session_has_key(cls, request, storage, form_key, key=None, multi=None):          """          Check if the session has value of a specific form and (if provided)          of a key @@ -299,18 +299,28 @@ class Wizard(NamedUrlSessionFormWizard):            and form_key in request.session[storage.prefix]['step_data']          if not key or not test:              return test -        key = key.startswith(form_key) and key or form_key + '-' + key +        key = key.startswith(form_key) and key or \ +              not multi and form_key + '-' + key or \ +              form_key + '-0-' + key #only check if the first field is available          return key in request.session[storage.prefix]['step_data'][form_key]      @classmethod -    def session_get_value(cls, request, storage, form_key, key): +    def session_get_value(cls, request, storage, form_key, key, multi=False):          """          Get the value of a specific form          """ -        if not cls.session_has_key(request, storage, form_key, key): +        if not cls.session_has_key(request, storage, form_key, key, multi):              return -        key = key.startswith(form_key) and key or form_key + '-' + key -        return request.session[storage.prefix]['step_data'][form_key][key] +        if not multi: +            key = key.startswith(form_key) and key or form_key + '-' + key +            return request.session[storage.prefix]['step_data'][form_key][key] +        vals = [] +        for k in request.session[storage.prefix]['step_data'][form_key]: +            if k.startswith(form_key) and k.endswith(key) and \ +               request.session[storage.prefix]['step_data'][form_key][k]: +                vals.append(request.session[storage.prefix]['step_data']\ +                                           [form_key][k]) +        return vals      def get_current_object(self, request, storage):          """ @@ -1046,16 +1056,21 @@ class OperationWizard(Wizard):      def process_post_request(self, request, storage, *args, **kwargs):          """ -        Change the town form to a free selection town's form if no archaelogical -        file is provided +        Change the town (and parcel) form to a free selection town's (parcel's) +        form if no archaelogical file is provided          """          file_key = 'general-' + self.url_name + '-associated_file'          if file_key in request.POST.keys(): -            form_key = 'towns-' + self.url_name +            town_form_key = 'towns-' + self.url_name +            parcel_form_key = 'parcels-' + self.url_name              if request.POST[file_key]: -                self.form_list[unicode(form_key)] = SelectedTownFormSet +                self.form_list[unicode(town_form_key)] = SelectedTownFormSet +                self.form_list[unicode(parcel_form_key)] = SelectedParcelFormSet              else: -                self.form_list[unicode(form_key)] = SelectedTownGeneralFormSet +                self.form_list[unicode(town_form_key)] = \ +                                                      SelectedTownGeneralFormSet +                self.form_list[unicode(parcel_form_key)] = \ +                                                    SelectedParcelGeneralFormSet          return super(OperationWizard, self).process_post_request(request,                                                         storage, *args, **kwargs) @@ -1096,6 +1111,30 @@ class OperationWizard(Wizard):                  except (ValueError, ObjectDoesNotExist):                      pass                  data['TOWNS'] = sorted(towns, key=lambda x:x[1]) +        elif step.startswith('parcels-') and hasattr(form, 'management_form'): +            file_id = self.session_get_value(request, storage, general_form_key, +                                             "associated_file") +            if file_id: +                parcels = [] +                try: +                    for parcel in models.File.objects.get(pk=int(file_id) +                                                        ).parcels.all(): +                        parcels.append((parcel.pk, unicode(parcel))) +                except (ValueError, ObjectDoesNotExist): +                    pass +                data['PARCELS'] = sorted(parcels, key=lambda x:x[1]) +            else: +                towns = [] +                town_form_key = 'towns-' + self.url_name +                town_ids = self.session_get_value(request, storage, +                                            town_form_key, 'town', multi=True) +                for town_id in town_ids: +                    try: +                        town = models.Town.objects.get(pk=int(town_id)) +                        towns.append((town.pk, unicode(town))) +                    except (ValueError, ObjectDoesNotExist): +                        pass +                data['TOWNS'] = sorted(towns, key=lambda x:x[1])          data = data or None          form = super(OperationWizard, self).get_form(request, storage, step,                                                       data, files) @@ -1229,6 +1268,34 @@ SelectedTownGeneralFormSet = formset_factory(TownForm, can_delete=True,                                               formset=TownFormSet)  SelectedTownGeneralFormSet.form_label = _("Towns") +class SelectedParcelForm(forms.Form): +    form_label = _("Parcels") +    associated_models = {'parcel':models.Parcel} +    parcel = forms.ChoiceField(label=_("Parcel"), choices=(), +                             validators=[models.valid_id(models.Parcel)]) +    def __init__(self, *args, **kwargs): +        parcels = None +        if 'data' in kwargs and 'PARCELS' in kwargs['data']: +            parcels = kwargs['data']['PARCELS'] +            # clean data if not "real" data +            prefix_value = kwargs['prefix'] + '-parcel' +            if not [k for k in kwargs['data'].keys() +                    if k.startswith(prefix_value) and kwargs['data'][k]]: +                kwargs['data'] = None +                if 'files' in kwargs: +                    kwargs.pop('files') +        super(SelectedParcelForm, self).__init__(*args, **kwargs) +        if parcels: +            self.fields['parcel'].choices = [('', '--')] + parcels + +SelectedParcelFormSet = formset_factory(SelectedParcelForm, can_delete=True, +                                formset=ParcelFormSet) +SelectedParcelFormSet.form_label = _("Parcels") + +SelectedParcelGeneralFormSet = formset_factory(ParcelForm, can_delete=True, +                                             formset=ParcelFormSet) +SelectedParcelGeneralFormSet.form_label = _("Parcels") +  class RemainForm(forms.Form):      form_label = _("Remain types")      associated_models = {'remain':models.RemainType} @@ -1261,6 +1328,7 @@ operation_creation_wizard = OperationWizard([                     ('general-operation_creation', OperationFormGeneral),                     ('refs-operation_creation', OperationFormReference),                     ('towns-operation_creation', SelectedTownFormSet), +                   ('parcels-operation_creation', SelectedParcelFormSet),                     ('remains-operation_creation', RemainFormSet),                     ('final-operation_creation', FinalForm)],                      url_name='operation_creation',) @@ -1270,6 +1338,7 @@ operation_modification_wizard = OperationWizard([                     ('general-operation_modification', OperationFormGeneral),                     ('refs-operation_modification', OperationFormReference),                     ('towns-operation_modification', SelectedTownFormSet), +                   ('parcels-operation_modification', SelectedParcelFormSet),                     ('remains-operation_modification', RemainFormSet),                     ('final-operation_modification', FinalForm)],                      url_name='operation_modification',) | 
