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, |