diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-08-17 13:52:44 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-08-17 13:53:44 +0200 |
commit | c3bb366cb00fd1eaf7d1487a7c8e46b14659d081 (patch) | |
tree | 8c0b91b41ceb45dcfc72bb3ac8d55bc1b945089c /archaeological_operations/forms.py | |
parent | 6f78867c8dfa8adb58f8d072d71ee8e52dd660fa (diff) | |
download | Ishtar-c3bb366cb00fd1eaf7d1487a7c8e46b14659d081.tar.bz2 Ishtar-c3bb366cb00fd1eaf7d1487a7c8e46b14659d081.zip |
Parcels: add public domain field - better management of parcel formsets (refs #2284)
Diffstat (limited to 'archaeological_operations/forms.py')
-rw-r--r-- | archaeological_operations/forms.py | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index f71129615..644114619 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -45,7 +45,7 @@ from widgets import ParcelWidget, SelectParcelWidget from ishtar_common import widgets from ishtar_common.forms import FinalForm, FormSet, get_now, \ - reverse_lazy, get_form_selection, TableSelect + reverse_lazy, get_form_selection, TableSelect, get_data_from_formset from ishtar_common.forms_common import TownFormSet, SourceForm, SourceSelect, \ get_town_field @@ -76,6 +76,22 @@ class ParcelForm(forms.Form): parcel_number = forms.CharField( label=_(u"Parcel number"), required=False, validators=[validators.MaxLengthValidator(6)]) + public_domain = forms.BooleanField(label=_(u"Public domain"), + initial=False, required=False) + + def count_valid_fields(self, data): + if not data: + return 0 + data = get_data_from_formset(data) + nb = len(data) + # remove last non relevant fields + for idx, vals in enumerate(reversed(data[:])): + if 'public_domain' in vals: + break + if 'section' in vals and 'parcel_number' in vals: + break + nb -= 1 + return nb def __init__(self, *args, **kwargs): towns = None @@ -99,13 +115,12 @@ class ParcelForm(forms.Form): if not self.cleaned_data or (DELETION_FIELD_NAME in self.cleaned_data and self.cleaned_data[DELETION_FIELD_NAME]): return - if not self.cleaned_data.get('parcel_number') and \ - self.cleaned_data.get('section') != 'DP': + if (not self.cleaned_data.get('parcel_number') or + not self.cleaned_data.get('section')) and \ + not self.cleaned_data.get('public_domain'): return {} - for key in ('town', 'section'): - if key not in self.cleaned_data or not self.cleaned_data[key]: - raise forms.ValidationError(_(u"Town section and parcel number" - u" fields are required.")) + if not self.cleaned_data.get('town'): + raise forms.ValidationError(_(u"Town section is required.")) return self.cleaned_data @classmethod @@ -141,7 +156,9 @@ class ParcelForm(forms.Form): else: c_number = 0 values = [town, data.get('year') or '', data.get('section') or '', - c_number, data.get('parcel_number') or ''] + c_number, str(data.get('parcel_number') or '') + + str(u"Public domain") if data.get('public_domain') + else u""] if data.get('DELETE'): deleted.append(values) else: @@ -247,15 +264,17 @@ class ParcelFormSet(FormSet): parcel.parcel_number] continue if number not in ordering_keys: - ordering_keys[number] = ['', '', '', ''] - if field == 'town': + ordering_keys[number] = ['', '', '', '', ''] + if field == 'public_domain': ordering_keys[number][0] = value - elif field == 'year': + elif field == 'town': ordering_keys[number][1] = value - elif field == 'section': + elif field == 'year': ordering_keys[number][2] = value - elif field == 'parcel_number': + elif field == 'section': ordering_keys[number][3] = value + elif field == 'parcel_number': + ordering_keys[number][4] = value reverse_ordering_keys = {} for number in ordering_keys: @@ -271,7 +290,7 @@ class ParcelFormSet(FormSet): return new_values def _parcel_sorting(self, key): - town, year, section, parcel = key + public_domain, town, year, section, parcel = key # deal with parcel_number such as '34p' and convert to int parcel_number = '' for p in parcel: @@ -283,7 +302,12 @@ class ParcelFormSet(FormSet): parcel_number = 0 else: parcel_number = int(parcel_number) - return (town, year, section, parcel_number) + # empty must be at the end + if not year and not section and not parcel_number \ + and not public_domain: + Z = 'ZZZZZZZZZZZZZ' + return (Z, Z, Z, Z, Z) + return (town, year, section, parcel_number, public_domain) def as_table(self): # add dynamic widget @@ -436,7 +460,7 @@ class OperationSelect(TableSelect): code_patriarche = forms.IntegerField( label="Numéro d'opération (OA Patriarche)") towns = get_town_field() - parcel = ParcelField(label=_("Parcel (section/number)")) + parcel = ParcelField(label=_("Parcel (section/number/public domain)")) if settings.ISHTAR_DPTS: towns__numero_insee__startswith = forms.ChoiceField( label=_(u"Department"), choices=[]) @@ -536,6 +560,7 @@ class OperationSelect(TableSelect): ids.pop(ids.index('parcel')) ids.append('parcel_0') ids.append('parcel_1') + ids.append('parcel_2') ids.pop(ids.index('relation_types')) for idx, c in enumerate(self.fields['relation_types'].choices): ids.append('relation_types_{}'.format(idx)) @@ -1160,7 +1185,7 @@ class AdministrativeActOpeSelect(TableSelect): act_type = forms.ChoiceField(label=_("Act type"), choices=[]) indexed = forms.NullBooleanField(label=_(u"Indexed?")) operation__towns = get_town_field() - parcel = ParcelField(label=_("Parcel (section/number)")) + parcel = ParcelField(label=_("Parcel (section/number/public domain)")) if settings.ISHTAR_DPTS: operation__towns__numero_insee__startswith = forms.ChoiceField( label=_(u"Department"), choices=[]) @@ -1196,6 +1221,7 @@ class AdministrativeActOpeSelect(TableSelect): ids.pop(ids.index('parcel')) ids.append('parcel_0') ids.append('parcel_1') + ids.append('parcel_2') return ids |