diff options
| -rw-r--r-- | archaeological_files_pdl/forms.py | 442 | ||||
| -rw-r--r-- | archaeological_files_pdl/urls.py | 28 | ||||
| -rw-r--r-- | archaeological_files_pdl/views.py | 104 | ||||
| -rw-r--r-- | archaeological_files_pdl/wizards.py | 107 | 
4 files changed, 379 insertions, 302 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): diff --git a/archaeological_files_pdl/urls.py b/archaeological_files_pdl/urls.py index 6acb6129d..186135b93 100644 --- a/archaeological_files_pdl/urls.py +++ b/archaeological_files_pdl/urls.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3  # -*- coding: utf-8 -*-  # Copyright (C) 2014 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> @@ -22,14 +22,24 @@ from django.conf.urls import url  from archaeological_files_pdl import views  urlpatterns = [ -    url(r'file_creation/(?P<step>.+)?$', -        views.file_creation_wizard, name='file_creation'), -    url(r'file_modification/(?P<step>.+)?$', -        views.file_modification_wizard, name='file_modification'), -    url(r'townplanning-edit/$', +    url( +        r"file_creation/(?P<step>.+)?$", +        views.file_creation_wizard, +        name="file_creation", +    ), +    url( +        r"file_modification/(?P<step>.+)?$", +        views.file_modification_wizard, +        name="file_modification", +    ), +    url( +        r"townplanning-edit/$",          views.TownPlanningCreate.as_view(), -        name='townplanning_create'), -    url(r'townplanning-edit/(?P<pk>\d+)$', +        name="townplanning_create", +    ), +    url( +        r"townplanning-edit/(?P<pk>\d+)$",          views.TownPlanningEdit.as_view(), -        name='townplanning_edit'), +        name="townplanning_edit", +    ),  ] diff --git a/archaeological_files_pdl/views.py b/archaeological_files_pdl/views.py index a7d0dee02..a0c5720d1 100644 --- a/archaeological_files_pdl/views.py +++ b/archaeological_files_pdl/views.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3  # -*- coding: utf-8 -*-  # Copyright (C) 2015  Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> @@ -22,8 +22,7 @@ from ishtar_common.utils import ugettext_lazy as _  from archaeological_files_pdl.wizards import FileWizard, FileModificationWizard  from archaeological_operations.wizards import is_preventive, is_not_preventive -from ishtar_common.views import OrganizationPersonCreate, \ -    OrganizationPersonEdit +from ishtar_common.views import OrganizationPersonCreate, OrganizationPersonEdit  from archaeological_files_pdl import forms  from archaeological_files import forms as ref_forms @@ -32,60 +31,67 @@ from archaeological_files import models  file_creation_wizard_is_preventive = is_preventive( -    'general-file_creation', models.FileType, type_key='file_type') +    "general-file_creation", models.FileType, type_key="file_type" +)  file_creation_wizard_is_not_preventive = is_not_preventive( -    'general-file_creation', models.FileType, type_key='file_type') -file_creation_wizard = FileWizard.as_view([ -    ('general-file_creation', forms.FileFormGeneral), -    ('preventivetype-file_creation', forms.FileFormPreventiveType), -    ('preventiveplanning-file_creation', forms.FileFormPlanning), -    ('researchaddress-file_creation', forms.FileFormResearchAddress), -    ('parcelspdl-file_creation', ref_forms.ParcelFormset), -    ('generalcontractor-file_creation', forms.FileFormGeneralContractor), -    ('planningservice-file_creation', forms.FileFormPlanningService), -    ('research-file_creation', ref_forms.FileFormResearch), -    ('instruction-file_creation', forms.FileFormInstruction), -    ('final-file_creation', ref_forms.FinalForm)], +    "general-file_creation", models.FileType, type_key="file_type" +) +file_creation_wizard = FileWizard.as_view( +    [ +        ("general-file_creation", forms.FileFormGeneral), +        ("preventivetype-file_creation", forms.FileFormPreventiveType), +        ("preventiveplanning-file_creation", forms.FileFormPlanning), +        ("researchaddress-file_creation", forms.FileFormResearchAddress), +        ("parcelspdl-file_creation", ref_forms.ParcelFormset), +        ("generalcontractor-file_creation", forms.FileFormGeneralContractor), +        ("planningservice-file_creation", forms.FileFormPlanningService), +        ("research-file_creation", ref_forms.FileFormResearch), +        ("instruction-file_creation", forms.FileFormInstruction), +        ("final-file_creation", ref_forms.FinalForm), +    ],      label=_("New file"),      condition_dict={ -        'preventivetype-file_creation': file_creation_wizard_is_preventive, -        'preventiveplanning-file_creation': file_creation_wizard_is_preventive, -        'generalcontractor-file_creation': file_creation_wizard_is_preventive, -        'planningservice-file_creation': file_creation_wizard_is_preventive, -        'researchaddress-file_creation': -        file_creation_wizard_is_not_preventive, -        'research-file_creation': file_creation_wizard_is_not_preventive}, -    url_name='file_creation',) +        "preventivetype-file_creation": file_creation_wizard_is_preventive, +        "preventiveplanning-file_creation": file_creation_wizard_is_preventive, +        "generalcontractor-file_creation": file_creation_wizard_is_preventive, +        "planningservice-file_creation": file_creation_wizard_is_preventive, +        "researchaddress-file_creation": file_creation_wizard_is_not_preventive, +        "research-file_creation": file_creation_wizard_is_not_preventive, +    }, +    url_name="file_creation", +)  file_modification_wizard_is_preventive = is_preventive( -    'general-file_modification', models.FileType, type_key='file_type') +    "general-file_modification", models.FileType, type_key="file_type" +)  file_modification_wizard_is_not_preventive = is_not_preventive( -    'general-file_modification', models.FileType, type_key='file_type') -file_modification_wizard = FileModificationWizard.as_view([ -    ('selec-file_modification', ref_forms.FileFormSelection), -    ('general-file_modification', forms.FileFormGeneral), -    ('preventivetype-file_modification', forms.FileFormPreventiveType), -    ('preventiveplanning-file_modification', forms.FileFormPlanning), -    ('researchaddress-file_modification', forms.FileFormResearchAddress), -    ('parcelspdl-file_modification', ref_forms.ParcelFormset), -    ('generalcontractor-file_modification', forms.FileFormGeneralContractor), -    ('planningservice-file_modification', forms.FileFormPlanningService), -    ('research-file_modification', ref_forms.FileFormResearch), -    ('instruction-file_modification', forms.FileFormInstructionEdit), -    ('final-file_modification', ref_forms.FinalForm)], +    "general-file_modification", models.FileType, type_key="file_type" +) +file_modification_wizard = FileModificationWizard.as_view( +    [ +        ("selec-file_modification", ref_forms.FileFormSelection), +        ("general-file_modification", forms.FileFormGeneral), +        ("preventivetype-file_modification", forms.FileFormPreventiveType), +        ("preventiveplanning-file_modification", forms.FileFormPlanning), +        ("researchaddress-file_modification", forms.FileFormResearchAddress), +        ("parcelspdl-file_modification", ref_forms.ParcelFormset), +        ("generalcontractor-file_modification", forms.FileFormGeneralContractor), +        ("planningservice-file_modification", forms.FileFormPlanningService), +        ("research-file_modification", ref_forms.FileFormResearch), +        ("instruction-file_modification", forms.FileFormInstructionEdit), +        ("final-file_modification", ref_forms.FinalForm), +    ],      label=_("File modification"),      condition_dict={ -    'preventivetype-file_modification': file_modification_wizard_is_preventive, -    'preventiveplanning-file_modification': -    file_modification_wizard_is_preventive, -    'generalcontractor-file_modification': -    file_modification_wizard_is_preventive, -    'planningservice-file_modification': -    file_modification_wizard_is_preventive, -    'researchaddress-file_modification': -    file_modification_wizard_is_not_preventive, -    'research-file_modification': file_modification_wizard_is_not_preventive}, -    url_name='file_modification',) +        "preventivetype-file_modification": file_modification_wizard_is_preventive, +        "preventiveplanning-file_modification": file_modification_wizard_is_preventive, +        "generalcontractor-file_modification": file_modification_wizard_is_preventive, +        "planningservice-file_modification": file_modification_wizard_is_preventive, +        "researchaddress-file_modification": file_modification_wizard_is_not_preventive, +        "research-file_modification": file_modification_wizard_is_not_preventive, +    }, +    url_name="file_modification", +)  class TownPlanningEdit(OrganizationPersonEdit): diff --git a/archaeological_files_pdl/wizards.py b/archaeological_files_pdl/wizards.py index 988303937..211ea84f8 100644 --- a/archaeological_files_pdl/wizards.py +++ b/archaeological_files_pdl/wizards.py @@ -26,45 +26,44 @@ from ishtar_common.utils import ugettext_lazy as _  class FileWizard(BaseFileWizard): -    parcel_step_key = 'parcelspdl-' -    town_step_keys = ['preventiveplanning-', 'researchaddress-'] -    town_input_id = 'town' +    parcel_step_key = "parcelspdl-" +    town_step_keys = ["preventiveplanning-", "researchaddress-"] +    town_input_id = "town"      towns_formset = False      multi_towns = True      wizard_templates = {          #'generalcontractor-%(url_name)s':          #    'ishtar/wizard/wizard_generalcontractor.html', -        'planningservice-%(url_name)s': -            'ishtar/wizard/wizard_planningservice.html', -        'instruction-%(url_name)s': -            'ishtar/wizard/wizard_instruction.html', -        'preventiveplanning-%(url_name)s': -            'ishtar/wizard/wizard_preventiveplanning.html', +        "planningservice-%(url_name)s": "ishtar/wizard/wizard_planningservice.html", +        "instruction-%(url_name)s": "ishtar/wizard/wizard_instruction.html", +        "preventiveplanning-%(url_name)s": "ishtar/wizard/wizard_preventiveplanning.html",      } -    wizard_confirm = 'ishtar/wizard/file_confirm_wizard.html' +    wizard_confirm = "ishtar/wizard/file_confirm_wizard.html"      def get_current_year(self): -        general_form_key = 'general-' + self.url_name -        return self.session_get_value(general_form_key, 'year') +        general_form_key = "general-" + self.url_name +        return self.session_get_value(general_form_key, "year")      def get_form_kwargs(self, *args, **kwargs):          returned = super(FileWizard, self).get_form_kwargs(*args, **kwargs) -        if args and args[0].startswith('generalcontractor-'): -            if 'status' in self.request.GET: -                returned['status'] = self.request.GET['status'] -        if args and args[0].startswith('instruction-'): -            returned['year'] = self.get_current_year() -            returned['saisine_type'] = self.get_saisine_type() -            returned['reception_date'] = \ -                self.session_get_value( -                    'general-' + self.url_name, 'reception_date') +        if args and args[0].startswith("generalcontractor-"): +            if "status" in self.request.GET: +                returned["status"] = self.request.GET["status"] +        if args and args[0].startswith("instruction-"): +            returned["year"] = self.get_current_year() +            returned["saisine_type"] = self.get_saisine_type() +            returned["reception_date"] = self.session_get_value( +                "general-" + self.url_name, "reception_date" +            )          return returned      def get_saisine_type(self):          try:              idx = int(                  self.session_get_value( -                    'preventivetype-' + self.url_name, 'saisine_type')) +                    "preventivetype-" + self.url_name, "saisine_type" +                ) +            )              return models.SaisineType.objects.get(pk=idx)          except (TypeError, ValueError, models.PermitType.DoesNotExist):              pass @@ -78,53 +77,63 @@ class FileWizard(BaseFileWizard):              try:                  idx = int(                      self.session_get_value( -                        'preventivetype-' + self.url_name, 'permit_type')) +                        "preventivetype-" + self.url_name, "permit_type" +                    ) +                )                  permit_type = models.PermitType.objects.get(pk=idx) -                context['permit_type'] = str(permit_type) -                context['permit_type_code'] = str(permit_type.txt_idx) +                context["permit_type"] = str(permit_type) +                context["permit_type_code"] = str(permit_type.txt_idx)              except (TypeError, ValueError, models.PermitType.DoesNotExist):                  pass          elif self.steps.current == forminstruction:              saisine_type = self.get_saisine_type() -            context['FILE_PREFIX'] = settings.ISHTAR_FILE_PREFIX +            context["FILE_PREFIX"] = settings.ISHTAR_FILE_PREFIX              if saisine_type: -                context['saisine_type'] = str(saisine_type) -                context['saisine_type_message'] = str(saisine_type) +                context["saisine_type"] = str(saisine_type) +                context["saisine_type_message"] = str(saisine_type)                  if saisine_type.delay: -                    context['saisine_type_message'] += str(_( -                        ": delay of {} days")).format(saisine_type.delay) +                    context["saisine_type_message"] += str( +                        _(": delay of {} days") +                    ).format(saisine_type.delay)          elif self.steps.current == formfinal: -            if self.steps.current.endswith('creation'):  # creation only +            if self.steps.current.endswith("creation"):  # creation only                  parcels = []                  parcel_step_key = self.parcel_step_key + self.url_name -                parcel_numbers = self.session_get_value( -                    parcel_step_key, 'parcel_number', multi=True) or [] -                sections = self.session_get_value( -                    parcel_step_key, 'section', multi=True) or [] -                towns = self.session_get_value( -                    parcel_step_key, 'town', multi=True) or [] +                parcel_numbers = ( +                    self.session_get_value(parcel_step_key, "parcel_number", multi=True) +                    or [] +                ) +                sections = ( +                    self.session_get_value(parcel_step_key, "section", multi=True) or [] +                ) +                towns = ( +                    self.session_get_value(parcel_step_key, "town", multi=True) or [] +                )                  for idx, parcel_number in enumerate(parcel_numbers): -                    if not parcel_number or len(sections) <= idx \ -                            or len(towns) <= idx: +                    if not parcel_number or len(sections) <= idx or len(towns) <= idx:                          continue -                    parcels.append({ -                        'town': towns[idx], -                        'section': sections[idx], -                        'parcel_number': parcel_number}) -                context['similar_files'] = models.File.similar_files(parcels) +                    parcels.append( +                        { +                            "town": towns[idx], +                            "section": sections[idx], +                            "parcel_number": parcel_number, +                        } +                    ) +                context["similar_files"] = models.File.similar_files(parcels)              else:  # edition only                  try:                      numeric_reference = int(                          self.session_get_value( -                            'instruction-' + self.url_name, -                            'numeric_reference')) +                            "instruction-" + self.url_name, "numeric_reference" +                        ) +                    )                      q = models.File.objects.filter(                          numeric_reference=numeric_reference, -                        year=self.get_current_year()).exclude( -                        pk=self.get_current_object().pk) -                    context['numeric_reference_files'] = q.all() +                        year=self.get_current_year(), +                    ).exclude(pk=self.get_current_object().pk) +                    context["numeric_reference_files"] = q.all()                  except ValueError:                      pass  | 
