diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-03-20 19:40:24 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-03-20 19:40:24 +0100 | 
| commit | e60666c795e1531fda90013a001ac6dbc58b5667 (patch) | |
| tree | d5fc7bd1cb9d8dab4c967fcad6dccba5e6b3517a /archaeological_files_pdl/forms.py | |
| parent | 3674706764068d37ad0aca120a49e37c1ed291ec (diff) | |
| download | Ishtar-e60666c795e1531fda90013a001ac6dbc58b5667.tar.bz2 Ishtar-e60666c795e1531fda90013a001ac6dbc58b5667.zip | |
Refactoring and many fixes on file module
Diffstat (limited to 'archaeological_files_pdl/forms.py')
| -rw-r--r-- | archaeological_files_pdl/forms.py | 199 | 
1 files changed, 84 insertions, 115 deletions
| diff --git a/archaeological_files_pdl/forms.py b/archaeological_files_pdl/forms.py index 7ade0b3f0..7ada27be8 100644 --- a/archaeological_files_pdl/forms.py +++ b/archaeological_files_pdl/forms.py @@ -26,11 +26,14 @@ from ishtar_common.utils import ugettext_lazy as _  from ishtar_common.models import Person, Town, Department, valid_id, \      person_type_pk_lazy, person_type_pks_lazy, organization_type_pks_lazy, \ -    organization_type_pk_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 archaeological_files import models  from ishtar_common.forms import get_now, reverse_lazy, ManageOldType, \ -    CustomForm, FieldType, IshtarForm +    CustomForm, FieldType, IshtarForm, FormHeader  from ishtar_common import widgets  from bootstrap_datepicker.widgets import DatePicker @@ -84,18 +87,22 @@ class FileFormPreventiveType(CustomForm, ManageOldType, forms.Form):          self.fields['permit_type'].help_text = models.PermitType.get_help() -class FileFormPlanning(CustomForm, forms.Form): +class FileFormPlanning(CustomForm, ManageOldType):      form_label = _(u"Planning")      form_admin_name = _(u"Archaeological file - 017 - Preventive - Planning")      form_slug = "file-017-preventiveplanning"      base_models = ['town', 'department']      associated_models = {'town': Town, 'department': Department} +    HEADERS = {} +    HEADERS['town'] = FormHeader(_("Localisation"))      name = forms.CharField(label=_(u"Planning name"), required=False,                             max_length=100)      town = widgets.Select2MultipleField(          model=Town, label=_("Towns"), required=False, remote=True)      department = widgets.Select2MultipleField( -        model=Department, label=_("Departments"), required=False) +        model=Department, label=_("Departments"), required=False, +        help_text=_("Only relevant when no town is provided.") +    )      locality = forms.CharField(label=_(u"Locality"), max_length=100,                                 required=False)      address = forms.CharField( @@ -104,6 +111,7 @@ class FileFormPlanning(CustomForm, forms.Form):          required=False)      postal_code = forms.CharField(label=_(u"Postal code"), max_length=10,                                    required=False) +    HEADERS['total_surface'] = FormHeader(_("Surfaces"))      total_surface = forms.FloatField(          required=False,          widget=widgets.AreaWidget, @@ -236,33 +244,36 @@ class PersonOrgaForm(forms.Form):                  validators=[valid_id(models.Organization)]) -class FileFormGeneralContractor(CustomForm, PersonOrgaForm): +class FileFormGeneralContractor(CustomForm, ManageOldType):      form_label = _(u"General contractor")      form_admin_name = _("Archaeological file - 030 - General contractor")      form_slug = "file-030-generalcontractor" +    extra_form_modals = ["person", "organization"]      associated_models = {'general_contractor': models.Person,                           'corporation_general_contractor': models.Organization} +      corporation_general_contractor = forms.IntegerField(          label=_("General contractor"), -        required=False, -        widget=widgets.JQueryPersonOrganization( -            reverse_lazy('autocomplete-organization', -                         args=[ -                             organization_type_pks_lazy(['general_contractor'])] -                         ), -            reverse_lazy('organization_create'), -            model=models.Organization, +        widget=widgets.JQueryAutoComplete( +            reverse_lazy( +                'autocomplete-organization', +                args=[ +                    organization_type_pks_lazy(['general_contractor']), +                ]),              limit={                  'organization_type': [                      organization_type_pk_lazy('general_contractor') -                ]}, -            js_template='ishtar/blocks/JQueryCorporationPerson.js', -            new=True), -        validators=[valid_id(models.Organization)] -    ) +                ] +            }, +            tips=get_orga_general_contractor_label, +            associated_model=models.Organization, new=True, +            detail=True, +            modify=True +        ), +        validators=[valid_id(models.Organization)])      general_contractor = forms.IntegerField( -        label=_(u"In charge"), +        label=_("In charge"),          required=False,          widget=widgets.JQueryAutoComplete(              reverse_lazy('autocomplete-person', @@ -271,118 +282,56 @@ class FileFormGeneralContractor(CustomForm, PersonOrgaForm):                               ]),              associated_model=Person,              limit={'person_types': [ -                person_type_pk_lazy(['general_contractor']) +                person_type_pk_lazy('general_contractor')                  ]}, -            dynamic_limit=['general_contractor'], -            url_new='new-person-noorga', +            tips=get_general_contractor_label, +            detail=True, +            modify=True,              new=True),          validators=[valid_id(Person)]      ) -    PERSON_FIELD = 'general_contractor' -    PERSON_TYPE_PK = person_type_pk_lazy('general_contractor') -    PERSON_LABEL = _(u"General contractor") -    ORGA_FIELD = 'corporation_general_contractor' -    ORGA_TYPE_PK = organization_type_pk_lazy('general_contractor') -    ORGA_LABEL = _(u"General contractor") - -    def __init__(self, *args, **kwargs): -        # get the status: natural person or corporation -        DEFAULT_STATUS = 'natural' -        current_status = '' -        if 'data' in kwargs: -            # the order is important: PERSON can have an ORGA -            for field in [self.PERSON_FIELD, self.ORGA_FIELD]: -                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' -                    except (model.DoesNotExist, ValueError): -                        pass -        initial = kwargs.get("initial", {}) -        if not current_status: -            # the order is important: PERSON can have an ORGA -            for field in [self.ORGA_FIELD, self.PERSON_FIELD]: -                value = initial.get(field) -                model = self.associated_models[field] -                try: -                    model.objects.get(pk=value) -                    current_status = 'natural' if field == self.PERSON_FIELD \ -                        else 'corporation' -                except (model.DoesNotExist, ValueError): -                    pass -        status = '' -        if 'status' in kwargs: -            status = kwargs.pop('status') -            if current_status != status: -                if kwargs.get('data'): -                    # status is different from the existing - clear fields -                    kwargs.pop('data') -        elif current_status: -            status = current_status -        else: -            status = DEFAULT_STATUS - -        self.status = status - -        if status not in ('natural', 'corporation'): -            status = DEFAULT_STATUS - -        user = None -        if 'user' in kwargs: -            user = kwargs.pop('user') - -        super(PersonOrgaForm, self).__init__(*args, **kwargs) - -        # distinct widget for natural and corporation -        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'), -                    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)]) -            self.fields.pop(self.ORGA_FIELD) - - -class FileFormPlanningService(CustomForm, forms.Form): -    form_label = _(u"Planning service") +    def clean(self): +        general_contractor = self.cleaned_data["general_contractor"] +        corporation_general_contractor = self.cleaned_data[ +            "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 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 + + +class FileFormPlanningService(CustomForm, IshtarForm): +    form_label = _("Planning service")      form_admin_name = _("Archaeological file - 040 - Planning service")      form_slug = "file-040-planningservice" +    extra_form_modals = ["person", "organization"]      associated_models = {'responsible_town_planning_service': models.Person,                           'planning_service': models.Organization} -    permit_reference = forms.CharField(label=_(u"File reference"), -                                       required=False, max_length=200)      planning_service = forms.IntegerField(          label=_("Planning service"),          required=False, -        widget=widgets.JQueryPersonOrganization( +        widget=widgets.JQueryAutoComplete(              reverse_lazy(                  'autocomplete-organization',                  args=[organization_type_pks_lazy(['planning_service'])]), -            reverse_lazy('organization_create'), -            model=models.Organization, +            associated_model=models.Organization,              limit={                  'organization_type':                  [organization_type_pk_lazy(['planning_service'])],              }, -            js_template='ishtar/blocks/JQueryCorporationPerson.js', -            new=True), +            tips=get_orga_planning_service_label, +            new=True, +            detail=True, +            modify=True, +        ),          validators=[valid_id(models.Organization)]      )      responsible_town_planning_service = forms.IntegerField( @@ -398,21 +347,39 @@ class FileFormPlanningService(CustomForm, forms.Form):                  person_type_pk_lazy('responsible_planning_service')              ]},              dynamic_limit=['planning_service'], -            url_new='new-person-noorga', +            tips=get_responsible_planning_service_label, +            detail=True, +            modify=True,              new=True),          validators=[valid_id(Person)]      ) +    permit_reference = forms.CharField(label=_(u"File reference"), +                                       required=False, max_length=200) + +    def clean(self): +        responsible = self.cleaned_data["responsible_town_planning_service"] +        orga = self.cleaned_data["planning_service"] +        if responsible: +            try: +                person = models.Person.objects.get(pk=responsible) +            except models.Person.DoesNotExist: +                raise forms.ValidationError(_("Non existing person.")) +            if person.attached_to.pk != orga: +                raise forms.ValidationError(_( +                    "The organization of the person in charge differs from the " +                    "planning service.")) +        return self.cleaned_data  class FileFormInstruction(CustomForm, IshtarForm): -    form_label = u"Instruction SRA" +    form_label = _("Instruction")      form_admin_name = _("Archaeological file - 050 - Instruction")      form_slug = "file-050-instruction"      extra_form_modals = ["person", "organization"]      associated_models = {'in_charge': models.Person,                           'related_file': models.File}      in_charge = forms.IntegerField( -        label=_("Person in charge"), +        label=_("File managed by"),          widget=widgets.JQueryAutoComplete(              reverse_lazy(                  'autocomplete-person', @@ -421,7 +388,9 @@ class FileFormInstruction(CustomForm, IshtarForm):                  'person_types': [                      person_type_pk_lazy('sra_agent')]              }, -            associated_model=Person, new=True), +            tips=get_sra_agent_label, +            associated_model=Person, new=True, +        ),          validators=[valid_id(Person)])      related_file = forms.IntegerField(          label=_("Related file"), required=False, | 
