diff options
Diffstat (limited to 'archaeological_operations/forms.py')
| -rw-r--r-- | archaeological_operations/forms.py | 96 | 
1 files changed, 71 insertions, 25 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index b61285177..67cc8892d 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -41,11 +41,11 @@ from ishtar_common.wizards import MultiValueDict  from archaeological_files.models import File  import models -from widgets import ParcelWidget, SelectParcelWidget +from widgets import ParcelWidget, SelectParcelWidget, OAWidget  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 @@ -434,9 +458,10 @@ class OperationSelect(TableSelect):      operation_code = forms.IntegerField(label=_(u"Numeric reference"))      if settings.COUNTRY == 'fr':          code_patriarche = forms.IntegerField( -            label="Numéro d'opération (OA Patriarche)") +            widget=OAWidget, +            label="Code 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 +561,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)) @@ -696,6 +722,7 @@ class OperationFormGeneral(forms.Form):      pk = forms.IntegerField(required=False, widget=forms.HiddenInput)      if settings.COUNTRY == 'fr':          code_patriarche = forms.IntegerField(label=u"Code PATRIARCHE", +                                             widget=OAWidget,                                               required=False)      common_name = forms.CharField(label=_(u"Generic name"), required=False,                                    max_length=120, widget=forms.Textarea) @@ -705,6 +732,9 @@ class OperationFormGeneral(forms.Form):                                initial=lambda: datetime.datetime.now().year,                                validators=[validators.MinValueValidator(1900),                                            validators.MaxValueValidator(2100)]) +    old_code = forms.CharField( +        label=_(u"Old code"), required=False, +        validators=[validators.MaxLengthValidator(200)])      scientist = forms.IntegerField(          label=_("Head scientist"),          widget=widgets.JQueryAutoComplete( @@ -751,9 +781,6 @@ class OperationFormGeneral(forms.Form):      report_processing = forms.ChoiceField(label=_(u"Report processing"),                                            choices=[], required=False)      if settings.COUNTRY == 'fr': -        code_dracar = forms.CharField( -            label=u"Code DRACAR", required=False, -            validators=[validators.MaxLengthValidator(10)])          cira_date = forms.DateField(label=u"Date avis CIRA", required=False,                                      widget=widgets.JQueryDate)          negative_result = forms.NullBooleanField( @@ -806,13 +833,24 @@ class OperationFormGeneral(forms.Form):                  raise forms.ValidationError(                      _(u"The excavation end date cannot be before the start "                        u"date.")) +        # verify patriarche +        code_p = self.cleaned_data.get('code_patriarche', None) + +        if code_p: +            ops = models.Operation.objects.filter(code_patriarche=code_p) +            if 'pk' in cleaned_data and cleaned_data['pk']: +                ops = ops.exclude(pk=cleaned_data['pk']) +            if ops.count(): +                msg = _(u"Ce code Patriarche a déjà été affecté à une " +                        u"autre opération") +                raise forms.ValidationError(msg) +        # manage unique operation ID          year = self.cleaned_data.get("year")          operation_code = cleaned_data.get("operation_code", None)          if not operation_code:              return self.cleaned_data          ops = models.Operation.objects.filter(year=year,                                                operation_code=operation_code) -        # manage unique operation ID          if 'pk' in cleaned_data and cleaned_data['pk']:              ops = ops.exclude(pk=cleaned_data['pk'])          if ops.count(): @@ -1120,10 +1158,16 @@ SourceOperationFormSelection = get_form_selection(  class OperationSourceSelect(SourceSelect): +    operation__year = forms.IntegerField(label=_(u"Operation's year")) +    operation__operation_code = forms.IntegerField( +        label=_(u"Numeric reference")) +    if settings.COUNTRY == 'fr': +        operation__code_patriarche = forms.IntegerField( +            widget=OAWidget, +            label="Code PATRIARCHE")      operation__towns = get_town_field(label=_(u"Operation's town"))      operation__operation_type = forms.ChoiceField(label=_(u"Operation type"),                                                    choices=[]) -    operation__year = forms.IntegerField(label=_(u"Operation's year"))      def __init__(self, *args, **kwargs):          super(OperationSourceSelect, self).__init__(*args, **kwargs) @@ -1151,11 +1195,12 @@ class AdministrativeActOpeSelect(TableSelect):          ref_sra = forms.CharField(label=u"Autre référence",                                    max_length=15)          operation__code_patriarche = forms.IntegerField( -            label="Numéro d'opération (OA Patriarche)") +            widget=OAWidget, +            label="Code PATRIARCHE")      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=[]) @@ -1191,6 +1236,7 @@ class AdministrativeActOpeSelect(TableSelect):          ids.pop(ids.index('parcel'))          ids.append('parcel_0')          ids.append('parcel_1') +        ids.append('parcel_2')          return ids  | 
