diff options
Diffstat (limited to 'archaeological_files_pdl/forms.py')
| -rw-r--r-- | archaeological_files_pdl/forms.py | 442 | 
1 files changed, 247 insertions, 195 deletions
| diff --git a/archaeological_files_pdl/forms.py b/archaeological_files_pdl/forms.py index 8f3847ced..18940f2d5 100644 --- a/archaeological_files_pdl/forms.py +++ b/archaeological_files_pdl/forms.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3  # -*- coding: utf-8 -*-  # Copyright (C) 2014-2016 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> @@ -25,17 +25,33 @@ from django.utils.functional import lazy  from django.utils.safestring import mark_safe  from ishtar_common.utils import ugettext_lazy as _ -from ishtar_common.models import Person, Town, valid_id, \ -    person_type_pk_lazy, person_type_pks_lazy, organization_type_pks_lazy, \ -    organization_type_pk_lazy, get_sra_agent_label, \ -    get_orga_general_contractor_label, get_general_contractor_label, \ -    get_orga_planning_service_label, get_responsible_planning_service_label +from ishtar_common.models import ( +    Person, +    Town, +    valid_id, +    person_type_pk_lazy, +    person_type_pks_lazy, +    organization_type_pks_lazy, +    organization_type_pk_lazy, +    get_sra_agent_label, +    get_orga_general_contractor_label, +    get_general_contractor_label, +    get_orga_planning_service_label, +    get_responsible_planning_service_label, +)  from ishtar_common.models_common import Department  from archaeological_files import models -from ishtar_common.forms import get_now, reverse_lazy, ManageOldType, \ -    CustomForm, FieldType, IshtarForm, FormHeader +from ishtar_common.forms import ( +    get_now, +    reverse_lazy, +    ManageOldType, +    CustomForm, +    FieldType, +    IshtarForm, +    FormHeader, +)  from ishtar_common import widgets  from bootstrap_datepicker.widgets import DatePicker @@ -45,26 +61,31 @@ class FileFormGeneral(CustomForm, ManageOldType):      form_label = _("General")      form_admin_name = _("Archaeological file - 010 - General")      form_slug = "file-010-general" -    associated_models = {'file_type': models.FileType} +    associated_models = {"file_type": models.FileType}      file_type = forms.ChoiceField(label=_("File type"), choices=[]) -    year = forms.IntegerField(label=_("Year"), -                              initial=lambda: datetime.datetime.now().year, -                              validators=[validators.MinValueValidator(1000), -                                          validators.MaxValueValidator(2100)]) -    creation_date = forms.DateField(label=_("Creation date"), -                                    initial=get_now, widget=DatePicker) +    year = forms.IntegerField( +        label=_("Year"), +        initial=lambda: datetime.datetime.now().year, +        validators=[ +            validators.MinValueValidator(1000), +            validators.MaxValueValidator(2100), +        ], +    ) +    creation_date = forms.DateField( +        label=_("Creation date"), initial=get_now, widget=DatePicker +    )      reception_date = forms.DateField( -        label=_("Reception date"), initial=get_now, widget=DatePicker) +        label=_("Reception date"), initial=get_now, widget=DatePicker +    )      TYPES = [ -        FieldType('file_type', models.FileType), +        FieldType("file_type", models.FileType),      ]      def clean_reception_date(self): -        value = self.cleaned_data.get('reception_date', None) +        value = self.cleaned_data.get("reception_date", None)          if value and value > datetime.date.today(): -            raise forms.ValidationError( -                _('Reception date cannot be after today.')) +            raise forms.ValidationError(_("Reception date cannot be after today."))          return value @@ -72,114 +93,123 @@ class FileFormPreventiveType(CustomForm, ManageOldType, forms.Form):      form_label = "Saisine"      form_admin_name = _("Archaeological file - 013 - Preventive - Saisine")      form_slug = "file-013-preventivesaisine" -    associated_models = {'saisine_type': models.SaisineType, -                         'permit_type': models.PermitType} -    permit_type = forms.ChoiceField(label=_("Permit type"), required=False, -                                    choices=[]) -    saisine_type = forms.ChoiceField(label=_("Saisine type"), -                                     choices=[]) +    associated_models = { +        "saisine_type": models.SaisineType, +        "permit_type": models.PermitType, +    } +    permit_type = forms.ChoiceField(label=_("Permit type"), required=False, choices=[]) +    saisine_type = forms.ChoiceField(label=_("Saisine type"), choices=[])      TYPES = [ -        FieldType('saisine_type', models.SaisineType), +        FieldType("saisine_type", models.SaisineType),      ]      def __init__(self, *args, **kwargs):          super(FileFormPreventiveType, self).__init__(*args, **kwargs) -        self.fields['permit_type'].choices = models.PermitType.get_types( -            default='NP', initial=self.init_data.get('permit_type')) -        self.fields['permit_type'].help_text = models.PermitType.get_help() +        self.fields["permit_type"].choices = models.PermitType.get_types( +            default="NP", initial=self.init_data.get("permit_type") +        ) +        self.fields["permit_type"].help_text = models.PermitType.get_help()  class FileFormPlanning(CustomForm, ManageOldType):      form_label = _("Planning")      form_admin_name = _("Archaeological file - 017 - Preventive - Planning")      form_slug = "file-017-preventiveplanning" -    base_models = ['town', 'department'] -    associated_models = {'town': Town, 'department': Department} +    base_models = ["town", "department"] +    associated_models = {"town": Town, "department": Department}      HEADERS = {} -    HEADERS['town'] = FormHeader(_("Localisation")) -    name = forms.CharField(label=_("Planning name"), required=False, -                           max_length=100) +    HEADERS["town"] = FormHeader(_("Localisation")) +    name = forms.CharField(label=_("Planning name"), required=False, max_length=100)      town = widgets.Select2MultipleField( -        model=Town, label=_("Towns"), required=False, remote=True) +        model=Town, label=_("Towns"), required=False, remote=True +    )      department = widgets.Select2MultipleField( -        model=Department, label=_("Departments"), required=False, -        help_text=_("Only relevant when no town is provided.") +        model=Department, +        label=_("Departments"), +        required=False, +        help_text=_("Only relevant when no town is provided."),      ) -    locality = forms.CharField(label=_("Locality"), max_length=100, -                               required=False) +    locality = forms.CharField(label=_("Locality"), max_length=100, required=False)      address = forms.CharField(          label=_("Address (number/street)"),          widget=forms.Textarea(attrs={"placeholder": _("Number/street")}), -        required=False) -    postal_code = forms.CharField(label=_("Postal code"), max_length=10, -                                  required=False) -    HEADERS['total_surface'] = FormHeader(_("Surfaces")) +        required=False, +    ) +    postal_code = forms.CharField(label=_("Postal code"), max_length=10, required=False) +    HEADERS["total_surface"] = FormHeader(_("Surfaces"))      total_surface = forms.FloatField(          required=False,          widget=widgets.AreaWidget,          label=_("Total surface (m2)"), -        validators=[validators.MinValueValidator(0), -                    validators.MaxValueValidator(999999999)]) +        validators=[ +            validators.MinValueValidator(0), +            validators.MaxValueValidator(999999999), +        ], +    )      total_developed_surface = forms.FloatField(          widget=widgets.AreaWidget,          label=_("Total developed surface (m2)"),          required=False, -        validators=[validators.MinValueValidator(0), -                    validators.MaxValueValidator(999999999)]) +        validators=[ +            validators.MinValueValidator(0), +            validators.MaxValueValidator(999999999), +        ], +    )  class FileFormResearchAddress(CustomForm, forms.Form):      form_label = _("Address")      form_admin_name = _("Archaeological file - 015 - Research - Address")      form_slug = "file-015-researchplanning" -    base_models = ['town', 'department'] -    associated_models = {'town': Town, 'department': Department} -    name = forms.CharField(label=_("Project name"), required=False, -                           max_length=100) +    base_models = ["town", "department"] +    associated_models = {"town": Town, "department": Department} +    name = forms.CharField(label=_("Project name"), required=False, max_length=100)      town = widgets.Select2MultipleField( -        model=Town, label=_("Towns"), required=False, remote=True) +        model=Town, label=_("Towns"), required=False, remote=True +    )      department = widgets.Select2MultipleField( -        model=Department, label=_("Departments"), required=False) -    locality = forms.CharField(label=_("Locality"), max_length=100, -                               required=False) +        model=Department, label=_("Departments"), required=False +    ) +    locality = forms.CharField(label=_("Locality"), max_length=100, required=False)      address = forms.CharField(          label=_("Address (number/street)"),          widget=forms.Textarea(attrs={"placeholder": _("Number/street")}), -        required=False) -    postal_code = forms.CharField(label=_("Postal code"), max_length=10, -                                  required=False) +        required=False, +    ) +    postal_code = forms.CharField(label=_("Postal code"), max_length=10, required=False)  class PersonOrgaForm(forms.Form): -    PERSON_FIELD = 'TO BE DEFINED' -    PERSON_TYPE_PK = person_type_pk_lazy('general_contractor') +    PERSON_FIELD = "TO BE DEFINED" +    PERSON_TYPE_PK = person_type_pk_lazy("general_contractor")      PERSON_LABEL = "" -    ORGA_FIELD = 'TO BE DEFINED' -    ORGA_TYPE_PK = organization_type_pk_lazy('general_contractor') +    ORGA_FIELD = "TO BE DEFINED" +    ORGA_TYPE_PK = organization_type_pk_lazy("general_contractor")      ORGA_LABEL = ""      def _media(self): -        if self.status == 'corporation': -            return forms.Media(js=('js/JQueryCorporation.js',)) +        if self.status == "corporation": +            return forms.Media(js=("js/JQueryCorporation.js",)) +      media = property(_media)      def __init__(self, *args, **kwargs):          # get the status: natural person or corporation -        DEFAULT_STATUS = 'natural' -        current_status = '' -        if 'data' in kwargs: +        DEFAULT_STATUS = "natural" +        current_status = "" +        if "data" in kwargs:              # the order is important: PERSON can have an ORGA              for field in [self.ORGA_FIELD, self.PERSON_FIELD]:                  current_item_key = ( -                    (kwargs['prefix'] + '-') -                    if kwargs.get('prefix') else '') + field -                if kwargs['data'] and kwargs['data'].get(current_item_key): +                    (kwargs["prefix"] + "-") if kwargs.get("prefix") else "" +                ) + field +                if kwargs["data"] and kwargs["data"].get(current_item_key):                      model = self.associated_models[field]                      try: -                        model.objects.get( -                            pk=kwargs['data'][current_item_key]) -                        current_status = 'natural' \ -                            if field == self.PERSON_FIELD else 'corporation' +                        model.objects.get(pk=kwargs["data"][current_item_key]) +                        current_status = ( +                            "natural" if field == self.PERSON_FIELD else "corporation" +                        )                      except (model.DoesNotExist, ValueError):                          pass          initial = kwargs.get("initial", {}) @@ -190,18 +220,19 @@ class PersonOrgaForm(forms.Form):                  model = self.associated_models[field]                  try:                      model.objects.get(pk=value) -                    current_status = 'natural' if field == self.PERSON_FIELD \ -                        else 'corporation' +                    current_status = ( +                        "natural" if field == self.PERSON_FIELD else "corporation" +                    )                  except (model.DoesNotExist, ValueError):                      pass -        status = '' -        if 'status' in kwargs: -            status = kwargs.pop('status') +        status = "" +        if "status" in kwargs: +            status = kwargs.pop("status")              if current_status != status: -                if kwargs.get('data'): +                if kwargs.get("data"):                      # status is different from the existing - clear fields -                    kwargs.pop('data') +                    kwargs.pop("data")          elif current_status:              status = current_status          else: @@ -209,41 +240,45 @@ class PersonOrgaForm(forms.Form):          self.status = status -        if status not in ('natural', 'corporation'): +        if status not in ("natural", "corporation"):              status = DEFAULT_STATUS          super(PersonOrgaForm, self).__init__(*args, **kwargs)          # distinct widget for natural and corporation -        if status == 'natural': +        if status == "natural":              self.fields[self.PERSON_FIELD] = forms.IntegerField(                  label=self.PERSON_LABEL,                  required=False,                  initial=initial.get(self.PERSON_FIELD, None),                  widget=widgets.JQueryPersonOrganization( -                    reverse_lazy('autocomplete-person', -                                 args=[self.PERSON_TYPE_PK]), -                    reverse_lazy('person_create'), +                    reverse_lazy("autocomplete-person", args=[self.PERSON_TYPE_PK]), +                    reverse_lazy("person_create"),                      model=Person, -                    limit={'person_types': [self.PERSON_TYPE_PK], -                           'attached_to__isnull': True}, -                    js_template='ishtar/blocks/JQueryNaturalPerson.js', -                    new=True), -                validators=[valid_id(Person)]) +                    limit={ +                        "person_types": [self.PERSON_TYPE_PK], +                        "attached_to__isnull": True, +                    }, +                    js_template="ishtar/blocks/JQueryNaturalPerson.js", +                    new=True, +                ), +                validators=[valid_id(Person)], +            )          else:              self.fields[self.ORGA_FIELD] = forms.IntegerField(                  label=self.ORGA_LABEL,                  required=False,                  initial=initial.get(self.ORGA_FIELD, None),                  widget=widgets.JQueryPersonOrganization( -                    reverse_lazy('autocomplete-organization', -                                 args=[self.ORGA_TYPE_PK]), -                    reverse_lazy('organization_create'), +                    reverse_lazy("autocomplete-organization", args=[self.ORGA_TYPE_PK]), +                    reverse_lazy("organization_create"),                      model=models.Organization, -                    limit={'organization_type': [self.ORGA_TYPE_PK]}, -                    js_template='ishtar/blocks/JQueryCorporationPerson.js', -                    new=True), -                validators=[valid_id(models.Organization)]) +                    limit={"organization_type": [self.ORGA_TYPE_PK]}, +                    js_template="ishtar/blocks/JQueryCorporationPerson.js", +                    new=True, +                ), +                validators=[valid_id(models.Organization)], +            )  class FileFormGeneralContractor(CustomForm, ManageOldType): @@ -251,62 +286,69 @@ class FileFormGeneralContractor(CustomForm, ManageOldType):      form_admin_name = _("Archaeological file - 030 - General contractor")      form_slug = "file-030-generalcontractor" -    associated_models = {'general_contractor': models.Person, -                         'corporation_general_contractor': models.Organization} +    associated_models = { +        "general_contractor": models.Person, +        "corporation_general_contractor": models.Organization, +    }      corporation_general_contractor = forms.IntegerField(          label=_("General contractor"),          widget=widgets.JQueryAutoComplete(              reverse_lazy( -                'autocomplete-organization', +                "autocomplete-organization",                  args=[ -                    organization_type_pks_lazy(['general_contractor']), -                ]), +                    organization_type_pks_lazy(["general_contractor"]), +                ], +            ),              limit={ -                'organization_type': [ -                    organization_type_pk_lazy('general_contractor') -                ] +                "organization_type": [organization_type_pk_lazy("general_contractor")]              },              tips=lazy(get_orga_general_contractor_label),              associated_model=models.Organization,              new=True,              detail=True, -            modify=True +            modify=True,          ), -        validators=[valid_id(models.Organization)]) +        validators=[valid_id(models.Organization)], +    )      general_contractor = forms.IntegerField(          label=_("In charge"),          required=False,          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-person', -                         args=[ -                             person_type_pks_lazy(['general_contractor']) -                             ]), +            reverse_lazy( +                "autocomplete-person", +                args=[person_type_pks_lazy(["general_contractor"])], +            ),              associated_model=Person, -            limit={'person_types': [ -                person_type_pk_lazy('general_contractor') -                ]}, +            limit={"person_types": [person_type_pk_lazy("general_contractor")]},              tips=lazy(get_general_contractor_label),              detail=True,              modify=True, -            new=True), -        validators=[valid_id(Person)] +            new=True, +        ), +        validators=[valid_id(Person)],      )      def clean(self):          general_contractor = self.cleaned_data["general_contractor"]          corporation_general_contractor = self.cleaned_data[ -            "corporation_general_contractor"] +            "corporation_general_contractor" +        ]          if general_contractor:              try:                  person = models.Person.objects.get(pk=general_contractor)              except models.Person.DoesNotExist:                  raise forms.ValidationError(_("Non existing person.")) -            if not person.attached_to or \ -                    person.attached_to.pk != corporation_general_contractor: -                raise forms.ValidationError(_( -                    "The organization of the person in charge differs from the " -                    "general contractor.")) +            if ( +                not person.attached_to +                or person.attached_to.pk != corporation_general_contractor +            ): +                raise forms.ValidationError( +                    _( +                        "The organization of the person in charge differs from the " +                        "general contractor." +                    ) +                )          return self.cleaned_data @@ -314,52 +356,56 @@ class FileFormPlanningService(CustomForm, IshtarForm):      form_label = _("Planning service")      form_admin_name = _("Archaeological file - 040 - Planning service")      form_slug = "file-040-planningservice" -    associated_models = {'responsible_town_planning_service': models.Person, -                         'planning_service': models.Organization} +    associated_models = { +        "responsible_town_planning_service": models.Person, +        "planning_service": models.Organization, +    }      planning_service = forms.IntegerField(          label=_("Planning service"),          required=False,          widget=widgets.JQueryAutoComplete(              reverse_lazy( -                'autocomplete-organization', -                args=[organization_type_pks_lazy(['planning_service'])]), +                "autocomplete-organization", +                args=[organization_type_pks_lazy(["planning_service"])], +            ),              associated_model=models.Organization,              limit={ -                'organization_type': -                [organization_type_pk_lazy(['planning_service'])], +                "organization_type": [organization_type_pk_lazy(["planning_service"])],              },              tips=lazy(get_orga_planning_service_label),              new=True,              detail=True,              modify=True,          ), -        validators=[valid_id(models.Organization)] +        validators=[valid_id(models.Organization)],      )      responsible_town_planning_service = forms.IntegerField(          label=_("In charge"),          required=False,          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-person', -                         args=[ -                             person_type_pks_lazy( -                                ['responsible_planning_service'])]), +            reverse_lazy( +                "autocomplete-person", +                args=[person_type_pks_lazy(["responsible_planning_service"])], +            ),              associated_model=Person, -            limit={'person_types': [ -                person_type_pk_lazy('responsible_planning_service') -            ]}, -            dynamic_limit=['planning_service'], +            limit={ +                "person_types": [person_type_pk_lazy("responsible_planning_service")] +            }, +            dynamic_limit=["planning_service"],              tips=lazy(get_responsible_planning_service_label),              detail=True,              modify=True, -            new=True), -        validators=[valid_id(Person)] +            new=True, +        ), +        validators=[valid_id(Person)], +    ) +    permit_reference = forms.CharField( +        label=_("File reference"), required=False, max_length=200      ) -    permit_reference = forms.CharField(label=_("File reference"), -                                       required=False, max_length=200)      planning_service_date = forms.DateField( -        label=_("Date of planning service file"), widget=DatePicker, -        required=False) +        label=_("Date of planning service file"), widget=DatePicker, required=False +    )      def clean(self):          responsible = self.cleaned_data["responsible_town_planning_service"] @@ -370,9 +416,12 @@ class FileFormPlanningService(CustomForm, IshtarForm):              except models.Person.DoesNotExist:                  raise forms.ValidationError(_("Non existing person."))              if not person.attached_to or person.attached_to.pk != orga: -                raise forms.ValidationError(_( -                    "The organization of the person in charge differs from the " -                    "planning service.")) +                raise forms.ValidationError( +                    _( +                        "The organization of the person in charge differs from the " +                        "planning service." +                    ) +                )          return self.cleaned_data @@ -380,83 +429,86 @@ class FileFormInstruction(CustomForm, IshtarForm):      form_label = _("Instruction")      form_admin_name = _("Archaeological file - 050 - Instruction")      form_slug = "file-050-instruction" -    associated_models = {'in_charge': models.Person, -                         'related_file': models.File} +    associated_models = {"in_charge": models.Person, "related_file": models.File}      in_charge = forms.IntegerField(          label=_("File managed by"),          widget=widgets.JQueryAutoComplete(              reverse_lazy( -                'autocomplete-person', -                args=[person_type_pks_lazy(["sra_agent"])]), -            limit={ -                'person_types': [ -                    person_type_pk_lazy('sra_agent')] -            }, +                "autocomplete-person", args=[person_type_pks_lazy(["sra_agent"])] +            ), +            limit={"person_types": [person_type_pk_lazy("sra_agent")]},              tips=lazy(get_sra_agent_label), -            associated_model=Person, new=True, +            associated_model=Person, +            new=True,          ), -        validators=[valid_id(Person)]) +        validators=[valid_id(Person)], +    )      related_file = forms.IntegerField( -        label=_("Related file"), required=False, -        widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-file'), -                                          associated_model=models.File), -        validators=[valid_id(models.File)]) -    comment = forms.CharField(label=_("Comment"), widget=forms.Textarea, -                              required=False) -    instruction_deadline = forms.DateField(widget=DatePicker, -                                           required=False) -    year = forms.IntegerField(label=_("Year"), -                              validators=[validators.MinValueValidator(1000), -                                          validators.MaxValueValidator(2100)]) -    numeric_reference = forms.IntegerField(label=_("Numeric reference"), -                                           required=False) +        label=_("Related file"), +        required=False, +        widget=widgets.JQueryAutoComplete( +            reverse_lazy("autocomplete-file"), associated_model=models.File +        ), +        validators=[valid_id(models.File)], +    ) +    comment = forms.CharField(label=_("Comment"), widget=forms.Textarea, required=False) +    instruction_deadline = forms.DateField(widget=DatePicker, required=False) +    year = forms.IntegerField( +        label=_("Year"), +        validators=[ +            validators.MinValueValidator(1000), +            validators.MaxValueValidator(2100), +        ], +    ) +    numeric_reference = forms.IntegerField(label=_("Numeric reference"), required=False)      numeric_reference_is_readonly = True      end_date = forms.DateField(widget=DatePicker, required=False)      def __init__(self, *args, **kwargs):          c_year = datetime.date.today().year -        if 'year' in kwargs: -            c_year = kwargs.pop('year') +        if "year" in kwargs: +            c_year = kwargs.pop("year")          saisine_type = None -        if 'saisine_type' in kwargs: -            saisine_type = kwargs.pop('saisine_type') +        if "saisine_type" in kwargs: +            saisine_type = kwargs.pop("saisine_type")          reception_date = None -        if 'reception_date' in kwargs: -            reception_date = kwargs.pop('reception_date') -        if 'data' in kwargs and kwargs['data']: -            kwargs['data'][kwargs.get('prefix', '') + '-year'] = c_year +        if "reception_date" in kwargs: +            reception_date = kwargs.pop("reception_date") +        if "data" in kwargs and kwargs["data"]: +            kwargs["data"][kwargs.get("prefix", "") + "-year"] = c_year          super(FileFormInstruction, self).__init__(*args, **kwargs) -        self.fields['year'].initial = c_year +        self.fields["year"].initial = c_year -        self.fields['year'].widget.attrs.update({'readonly': 'readonly'}) +        self.fields["year"].widget.attrs.update({"readonly": "readonly"})          c_num = 0 -        q = models.File.objects.filter(numeric_reference__isnull=False, -                                       year=c_year -                                       ).order_by('-numeric_reference') +        q = models.File.objects.filter( +            numeric_reference__isnull=False, year=c_year +        ).order_by("-numeric_reference")          if q.count():              c_num = q.all()[0].numeric_reference -        lbl = self.fields['numeric_reference'].label -        self.fields['numeric_reference'].label = mark_safe(lbl) -        self.fields['numeric_reference'].initial = c_num + 1 +        lbl = self.fields["numeric_reference"].label +        self.fields["numeric_reference"].label = mark_safe(lbl) +        self.fields["numeric_reference"].initial = c_num + 1          if self.numeric_reference_is_readonly: -            self.fields['numeric_reference'].widget.attrs['readonly'] = True +            self.fields["numeric_reference"].widget.attrs["readonly"] = True              if reception_date and saisine_type:                  if type(reception_date) == str:                      try:                          reception_date = datetime.datetime.strptime( -                            reception_date, '%d/%m/%Y') -                        self.fields['instruction_deadline'].initial = \ -                            (reception_date + datetime.timedelta( -                                days=saisine_type.delay or 0) -                             ).strftime('%Y-%m-%d') +                            reception_date, "%d/%m/%Y" +                        ) +                        self.fields["instruction_deadline"].initial = ( +                            reception_date +                            + datetime.timedelta(days=saisine_type.delay or 0) +                        ).strftime("%Y-%m-%d")                      except ValueError:                          pass          def clean_numeric_reference(self):              if self.numeric_reference_is_readonly: -                return self.fields['numeric_reference'].initial -            return self.cleaned_data['numeric_reference'] +                return self.fields["numeric_reference"].initial +            return self.cleaned_data["numeric_reference"]  class FileFormInstructionEdit(FileFormInstruction): | 
