diff options
Diffstat (limited to 'archaeological_finds')
| -rw-r--r-- | archaeological_finds/forms.py | 2061 | ||||
| -rw-r--r-- | archaeological_finds/models_finds.py | 6 | ||||
| -rw-r--r-- | archaeological_finds/tests.py | 29 | 
3 files changed, 1233 insertions, 863 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index da394c1ef..c95cef377 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -32,66 +32,142 @@ from ishtar_common.utils import ugettext_lazy as _  from . import models  from archaeological_operations.models import CulturalAttributionType -from archaeological_context_records.models import DatingType, DatingQuality, \ -    ContextRecord, RelationType as CRRelationType, Dating -from archaeological_finds.forms_treatments import TreatmentSelect, \ -    TreatmentFormSelection, BaseTreatmentForm, TreatmentModifyForm, \ -    AdministrativeActTreatmentForm, TreatmentFormFileChoice, \ -    TreatmentDeletionForm, TreatmentFileSelect, TreatmentFileFormSelection, \ -    TreatmentFileForm, TreatmentFileModifyForm, TreatmentFileDeletionForm, \ -    TreatmentFileFormSelectionMultiple, \ -    AdministrativeActTreatmentFormSelection, \ -    AdministrativeActTreatmentModifForm, \ -    AdministrativeActTreatmentFileForm, \ -    AdministrativeActTreatmentFileFormSelection, \ -    AdministrativeActTreatmentFileModifForm, \ -    DashboardForm as DashboardTreatmentForm, N1TreatmentForm,\ -    DashboardTreatmentFileForm, QAFindTreatmentForm, OneNTreatmentForm -from archaeological_operations.models import Period, ArchaeologicalSite, \ -    RelationType as OpeRelationType +from archaeological_context_records.models import ( +    DatingType, +    DatingQuality, +    ContextRecord, +    RelationType as CRRelationType, +    Dating, +) +from archaeological_finds.forms_treatments import ( +    TreatmentSelect, +    TreatmentFormSelection, +    BaseTreatmentForm, +    TreatmentModifyForm, +    AdministrativeActTreatmentForm, +    TreatmentFormFileChoice, +    TreatmentDeletionForm, +    TreatmentFileSelect, +    TreatmentFileFormSelection, +    TreatmentFileForm, +    TreatmentFileModifyForm, +    TreatmentFileDeletionForm, +    TreatmentFileFormSelectionMultiple, +    AdministrativeActTreatmentFormSelection, +    AdministrativeActTreatmentModifForm, +    AdministrativeActTreatmentFileForm, +    AdministrativeActTreatmentFileFormSelection, +    AdministrativeActTreatmentFileModifForm, +    DashboardForm as DashboardTreatmentForm, +    N1TreatmentForm, +    DashboardTreatmentFileForm, +    QAFindTreatmentForm, +    OneNTreatmentForm, +) +from archaeological_operations.models import ( +    Period, +    ArchaeologicalSite, +    RelationType as OpeRelationType, +)  from archaeological_operations.widgets import OAWidget  from archaeological_warehouse.models import Warehouse, Container  from bootstrap_datepicker.widgets import DatePicker  from ishtar_common import widgets -from ishtar_common.forms import CustomForm, CustomFormSearch, FormSet, \ -    FloatField, reverse_lazy, TableSelect, get_now, FinalForm, \ -    ManageOldType, FieldType, IshtarForm, FormHeader, QAForm, \ -    MultiSearchForm, LockForm, DocumentItemSelect +from ishtar_common.forms import ( +    CustomForm, +    CustomFormSearch, +    FormSet, +    FloatField, +    reverse_lazy, +    TableSelect, +    get_now, +    FinalForm, +    ManageOldType, +    FieldType, +    IshtarForm, +    FormHeader, +    QAForm, +    MultiSearchForm, +    LockForm, +    DocumentItemSelect, +)  from ishtar_common.forms_common import get_town_field  from archaeological_context_records.forms import PeriodSelect -from ishtar_common.models import valid_id, valid_ids, get_current_profile, \ -    SpatialReferenceSystem, Area, OperationType, IshtarUser, Person, person_type_pks_lazy +from ishtar_common.models import ( +    valid_id, +    valid_ids, +    get_current_profile, +    SpatialReferenceSystem, +    Area, +    OperationType, +    IshtarUser, +    Person, +    person_type_pks_lazy, +)  from ishtar_common.utils import convert_coordinates_to_point  __all__ = [ -    'TreatmentSelect', 'TreatmentFormSelection', 'BaseTreatmentForm', -    'TreatmentModifyForm', 'AdministrativeActTreatmentForm', -    'TreatmentFormFileChoice', 'TreatmentDeletionForm', -    'AdministrativeActTreatmentModifForm', 'TreatmentFileSelect', -    'TreatmentFileFormSelection', 'TreatmentFileForm', -    'TreatmentFileModifyForm', 'TreatmentFileDeletionForm', -    'AdministrativeActTreatmentFileForm', -    'AdministrativeActTreatmentFileFormSelection', -    'AdministrativeActTreatmentFormSelection', -    'AdministrativeActTreatmentFileModifForm', -    'DashboardTreatmentForm', 'DashboardTreatmentFileForm', -    'RecordFormSelection', 'FindForm', 'SimpleFindForm', 'DateForm', -    'DatingFormSet', 'PreservationForm', 'FindBasketFormSelection', -    'FindBasketForWriteFormSelection', -    'FindBasketForm', 'FindSelect', 'FindFormSelection', -    'FindFormSelectionWarehouseModule', 'MultipleFindFormSelection', -    'MultipleFindFormSelectionWarehouseModule', 'FindMultipleFormSelection', -    'check_form', 'check_exist', 'check_not_exist', -    'check_value', 'check_type_field', 'check_type_not_field', -    'check_treatment', 'ResultFindForm', 'ResultFindFormSet', -    'FindDeletionForm', 'UpstreamFindFormSelection', 'NewFindBasketForm', -    'SelectFindBasketForm', 'SelectFindBasketWriteForm', 'FindBasketAddItemForm', -    'QAFindFormSingle', 'QAFindFormMulti', 'QAFindBasketForm', -    'QAFindTreatmentForm', 'QAFindbasketDuplicateForm', -    'N1TreatmentForm', 'OneNTreatmentForm', 'ResultingFindForm', -    'ResultingFindsForm', 'SingleUpstreamFindFormSelection' +    "TreatmentSelect", +    "TreatmentFormSelection", +    "BaseTreatmentForm", +    "TreatmentModifyForm", +    "AdministrativeActTreatmentForm", +    "TreatmentFormFileChoice", +    "TreatmentDeletionForm", +    "AdministrativeActTreatmentModifForm", +    "TreatmentFileSelect", +    "TreatmentFileFormSelection", +    "TreatmentFileForm", +    "TreatmentFileModifyForm", +    "TreatmentFileDeletionForm", +    "AdministrativeActTreatmentFileForm", +    "AdministrativeActTreatmentFileFormSelection", +    "AdministrativeActTreatmentFormSelection", +    "AdministrativeActTreatmentFileModifForm", +    "DashboardTreatmentForm", +    "DashboardTreatmentFileForm", +    "RecordFormSelection", +    "FindForm", +    "SimpleFindForm", +    "DateForm", +    "DatingFormSet", +    "PreservationForm", +    "FindBasketFormSelection", +    "FindBasketForWriteFormSelection", +    "FindBasketForm", +    "FindSelect", +    "FindFormSelection", +    "FindFormSelectionWarehouseModule", +    "MultipleFindFormSelection", +    "MultipleFindFormSelectionWarehouseModule", +    "FindMultipleFormSelection", +    "check_form", +    "check_exist", +    "check_not_exist", +    "check_value", +    "check_type_field", +    "check_type_not_field", +    "check_treatment", +    "ResultFindForm", +    "ResultFindFormSet", +    "FindDeletionForm", +    "UpstreamFindFormSelection", +    "NewFindBasketForm", +    "SelectFindBasketForm", +    "SelectFindBasketWriteForm", +    "FindBasketAddItemForm", +    "QAFindFormSingle", +    "QAFindFormMulti", +    "QAFindBasketForm", +    "QAFindTreatmentForm", +    "QAFindbasketDuplicateForm", +    "N1TreatmentForm", +    "OneNTreatmentForm", +    "ResultingFindForm", +    "ResultingFindsForm", +    "SingleUpstreamFindFormSelection",  ]  logger = logging.getLogger(__name__) @@ -101,199 +177,263 @@ class RecordFormSelection(CustomForm, forms.Form):      form_label = _("Context record")      form_admin_name = _("Find - 010 - Context record choice")      form_slug = "find-010-contextrecord" -    base_models = ['get_first_base_find'] -    associated_models = {'get_first_base_find__context_record': ContextRecord} +    base_models = ["get_first_base_find"] +    associated_models = {"get_first_base_find__context_record": ContextRecord}      get_first_base_find__context_record = forms.IntegerField(          label=_("Context record"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-contextrecord'), -            associated_model=ContextRecord), -        validators=[valid_id(ContextRecord)]) +            reverse_lazy("autocomplete-contextrecord"), associated_model=ContextRecord +        ), +        validators=[valid_id(ContextRecord)], +    )      def __init__(self, *args, **kwargs):          super(RecordFormSelection, self).__init__(*args, **kwargs)          # get the current operation and restrict search to it          cr_pk = None -        if 'data' in kwargs and kwargs['data']: -            cr_pk = kwargs['data'].get( -                'get_first_base_find__context_record') -        if not cr_pk and 'initial' in kwargs and kwargs['initial']: -            cr_pk = kwargs['initial'].get( -                'get_first_base_find__context_record') +        if "data" in kwargs and kwargs["data"]: +            cr_pk = kwargs["data"].get("get_first_base_find__context_record") +        if not cr_pk and "initial" in kwargs and kwargs["initial"]: +            cr_pk = kwargs["initial"].get("get_first_base_find__context_record")          if not cr_pk:              return          try:              cr = ContextRecord.objects.get(pk=cr_pk)          except ContextRecord.DoesNotExist:              return -        widget = self.fields['get_first_base_find__context_record'].widget -        widget.source = str(widget.source) + "?operation__pk={}".format( -            cr.operation.pk) +        widget = self.fields["get_first_base_find__context_record"].widget +        widget.source = str(widget.source) + "?operation__pk={}".format(cr.operation.pk)  class BasicFindForm(CustomForm, ManageOldType):      """      Basic find form with no field related to base_find      """ +      file_upload = True      form_label = _("Find")      form_admin_name = _("Simple find - 020 - General")      form_slug = "simplefind-020-general" -    base_models = ['object_type', 'material_type', 'communicabilitie', -                   'cultural_attribution', 'functional_area'] +    base_models = [ +        "object_type", +        "material_type", +        "communicabilitie", +        "cultural_attribution", +        "functional_area", +    ]      associated_models = { -        'material_type': models.MaterialType, -        'cultural_attribution': CulturalAttributionType, -        'object_type': models.ObjectType, -        'functional_area': models.FunctionalArea, -        'communicabilitie': models.CommunicabilityType, -        'material_type_quality': models.MaterialTypeQualityType, -        'object_type_quality': models.ObjectTypeQualityType, -        'checked_type': models.CheckedType, +        "material_type": models.MaterialType, +        "cultural_attribution": CulturalAttributionType, +        "object_type": models.ObjectType, +        "functional_area": models.FunctionalArea, +        "communicabilitie": models.CommunicabilityType, +        "material_type_quality": models.MaterialTypeQualityType, +        "object_type_quality": models.ObjectTypeQualityType, +        "checked_type": models.CheckedType,          #'collection': Warehouse,      }      field_order = [ -        'label', 'denomination', 'previous_id', 'museum_id', 'laboratory_id', -        'seal_number', 'mark', 'description', 'public_description', -        'is_complete', 'material_type', 'material_type_quality', -        'material_comment', 'object_type', 'object_type_quality', -        'functional_area', 'find_number', -        'min_number_of_individuals', 'inscription', 'decoration', -        'manufacturing_place', 'communicabilitie', 'comment', -        'cultural_attribution', 'dating_comment', -        'length', 'width', 'height', 'thickness', 'diameter', 'circumference', -        'volume', 'weight', 'clutter_long_side', 'clutter_short_side', -        'clutter_height', 'dimensions_comment', 'checked_type', 'check_date' +        "label", +        "denomination", +        "previous_id", +        "museum_id", +        "laboratory_id", +        "seal_number", +        "mark", +        "description", +        "public_description", +        "is_complete", +        "material_type", +        "material_type_quality", +        "material_comment", +        "object_type", +        "object_type_quality", +        "functional_area", +        "find_number", +        "min_number_of_individuals", +        "inscription", +        "decoration", +        "manufacturing_place", +        "communicabilitie", +        "comment", +        "cultural_attribution", +        "dating_comment", +        "length", +        "width", +        "height", +        "thickness", +        "diameter", +        "circumference", +        "volume", +        "weight", +        "clutter_long_side", +        "clutter_short_side", +        "clutter_height", +        "dimensions_comment", +        "checked_type", +        "check_date",      ]      HEADERS = {} -    HEADERS['label'] = FormHeader(_("Identification")) +    HEADERS["label"] = FormHeader(_("Identification"))      label = forms.CharField( -        label=_("Free ID"), -        validators=[validators.MaxLengthValidator(60)]) +        label=_("Free ID"), validators=[validators.MaxLengthValidator(60)] +    )      denomination = forms.CharField(label=_("Denomination"), required=False)      previous_id = forms.CharField(label=_("Previous ID"), required=False)      museum_id = forms.CharField(label=_("Museum ID"), required=False)      laboratory_id = forms.CharField(label=_("Laboratory ID"), required=False)      seal_number = forms.CharField(label=_("Seal number"), required=False)      mark = forms.CharField(label=_("Mark"), required=False) -    #collection = forms.IntegerField( +    # collection = forms.IntegerField(      #    label=_("Collection (warehouse)"),      #    widget=widgets.JQueryAutoComplete(      #        reverse_lazy('autocomplete-warehouse'),      #        associated_model=Warehouse, new=True),      #    validators=[valid_id(Warehouse)], required=False) -    HEADERS['description'] = FormHeader(_("Description")) -    description = forms.CharField(label=_("Description"), -                                  widget=forms.Textarea, required=False) +    HEADERS["description"] = FormHeader(_("Description")) +    description = forms.CharField( +        label=_("Description"), widget=forms.Textarea, required=False +    )      public_description = forms.CharField( -        label=_("Public description"), widget=forms.Textarea, required=False) -    is_complete = forms.NullBooleanField(label=_("Is complete?"), -                                         required=False) +        label=_("Public description"), widget=forms.Textarea, required=False +    ) +    is_complete = forms.NullBooleanField(label=_("Is complete?"), required=False)      material_type = widgets.Select2MultipleField(          label=_("Material types"), required=False      )      material_type_quality = forms.ChoiceField( -        label=_("Material type quality"), required=False, choices=[]) +        label=_("Material type quality"), required=False, choices=[] +    )      material_comment = forms.CharField( -        label=_("Comment on the material"), required=False, -        widget=forms.Textarea) +        label=_("Comment on the material"), required=False, widget=forms.Textarea +    )      object_type = widgets.Select2MultipleField( -        label=_("Object types"), required=False, +        label=_("Object types"), +        required=False,      )      object_type_quality = forms.ChoiceField( -        label=_("Object type quality"), required=False, choices=[]) +        label=_("Object type quality"), required=False, choices=[] +    )      functional_area = widgets.Select2MultipleField( -        label=_("Functional areas"), required=False, +        label=_("Functional areas"), +        required=False,      )      find_number = forms.IntegerField(label=_("Find number"), required=False)      min_number_of_individuals = forms.IntegerField( -        label=_("Minimum number of individuals (MNI)"), required=False) +        label=_("Minimum number of individuals (MNI)"), required=False +    ) -    decoration = forms.CharField(label=_("Decoration"), widget=forms.Textarea, -                                 required=False) -    inscription = forms.CharField(label=_("Inscription"), -                                  widget=forms.Textarea, required=False) +    decoration = forms.CharField( +        label=_("Decoration"), widget=forms.Textarea, required=False +    ) +    inscription = forms.CharField( +        label=_("Inscription"), widget=forms.Textarea, required=False +    )      manufacturing_place = forms.CharField( -        label=_("Manufacturing place"), required=False) +        label=_("Manufacturing place"), required=False +    )      communicabilitie = widgets.Select2MultipleField(          label=_("Communicability"), required=False      ) -    comment = forms.CharField(label=_("Comment"), required=False, -                              widget=forms.Textarea) +    comment = forms.CharField(label=_("Comment"), required=False, widget=forms.Textarea)      cultural_attribution = widgets.Select2MultipleField( -        label=_("Cultural attribution"), required=False, +        label=_("Cultural attribution"), +        required=False,      )      dating_comment = forms.CharField( -        label=_("Comment on dating"), required=False, widget=forms.Textarea) - -    HEADERS['length'] = FormHeader(_("Dimensions")) -    length = FloatField(label=_("Length (cm)"), -                        widget=widgets.CentimeterMeterWidget, required=False) -    width = FloatField(label=_("Width (cm)"), required=False, -                       widget=widgets.CentimeterMeterWidget) -    height = FloatField(label=_("Height (cm)"), -                        widget=widgets.CentimeterMeterWidget, required=False) -    thickness = FloatField(label=_("Thickness (cm)"), -                           widget=widgets.CentimeterMeterWidget, required=False) -    diameter = FloatField(label=_("Diameter (cm)"), -                          widget=widgets.CentimeterMeterWidget, required=False) +        label=_("Comment on dating"), required=False, widget=forms.Textarea +    ) + +    HEADERS["length"] = FormHeader(_("Dimensions")) +    length = FloatField( +        label=_("Length (cm)"), widget=widgets.CentimeterMeterWidget, required=False +    ) +    width = FloatField( +        label=_("Width (cm)"), required=False, widget=widgets.CentimeterMeterWidget +    ) +    height = FloatField( +        label=_("Height (cm)"), widget=widgets.CentimeterMeterWidget, required=False +    ) +    thickness = FloatField( +        label=_("Thickness (cm)"), widget=widgets.CentimeterMeterWidget, required=False +    ) +    diameter = FloatField( +        label=_("Diameter (cm)"), widget=widgets.CentimeterMeterWidget, required=False +    )      circumference = FloatField( -        label=_("Circumference (cm)"), widget=widgets.CentimeterMeterWidget, -        required=False) +        label=_("Circumference (cm)"), +        widget=widgets.CentimeterMeterWidget, +        required=False, +    )      volume = FloatField(label=_("Volume (l)"), required=False) -    weight = FloatField(label=_("Weight (g)"), -                        widget=widgets.GramKilogramWidget, required=False) +    weight = FloatField( +        label=_("Weight (g)"), widget=widgets.GramKilogramWidget, required=False +    )      clutter_long_side = FloatField(          label=_("Clutter long side (cm)"), -        widget=widgets.CentimeterMeterWidget, required=False) +        widget=widgets.CentimeterMeterWidget, +        required=False, +    )      clutter_short_side = FloatField(          label=_("Clutter short side (cm)"), -        widget=widgets.CentimeterMeterWidget, required=False) +        widget=widgets.CentimeterMeterWidget, +        required=False, +    )      clutter_height = FloatField(          label=_("Clutter height (cm)"), -        widget=widgets.CentimeterMeterWidget, required=False) +        widget=widgets.CentimeterMeterWidget, +        required=False, +    )      dimensions_comment = forms.CharField( -        label=_("Dimensions comment"), required=False, widget=forms.Textarea) +        label=_("Dimensions comment"), required=False, widget=forms.Textarea +    ) -    HEADERS['checked_type'] = FormHeader(_("Sheet")) +    HEADERS["checked_type"] = FormHeader(_("Sheet"))      checked_type = forms.ChoiceField(label=_("Check"), required=False)      check_date = forms.DateField( -        initial=get_now, label=_("Check date"), widget=DatePicker) +        initial=get_now, label=_("Check date"), widget=DatePicker +    )      TYPES = [ -        FieldType('material_type', models.MaterialType, is_multiple=True, -                  extra_args={"full_hierarchy": True}), -        FieldType('cultural_attribution', CulturalAttributionType, -                  is_multiple=True), -        FieldType('material_type_quality', models.MaterialTypeQualityType), -        FieldType('object_type', models.ObjectType, is_multiple=True, -                  extra_args={"full_hierarchy": True}), -        FieldType('object_type_quality', models.ObjectTypeQualityType), -        FieldType('functional_area', models.FunctionalArea, is_multiple=True), -        FieldType('communicabilitie', models.CommunicabilityType, -                  is_multiple=True), -        FieldType('checked_type', models.CheckedType, is_multiple=True), +        FieldType( +            "material_type", +            models.MaterialType, +            is_multiple=True, +            extra_args={"full_hierarchy": True}, +        ), +        FieldType("cultural_attribution", CulturalAttributionType, is_multiple=True), +        FieldType("material_type_quality", models.MaterialTypeQualityType), +        FieldType( +            "object_type", +            models.ObjectType, +            is_multiple=True, +            extra_args={"full_hierarchy": True}, +        ), +        FieldType("object_type_quality", models.ObjectTypeQualityType), +        FieldType("functional_area", models.FunctionalArea, is_multiple=True), +        FieldType("communicabilitie", models.CommunicabilityType, is_multiple=True), +        FieldType("checked_type", models.CheckedType, is_multiple=True),      ]      def __init__(self, *args, **kwargs): -        context_record = kwargs.pop('context_record') +        context_record = kwargs.pop("context_record")          super(BasicFindForm, self).__init__(*args, **kwargs) -        if not context_record or \ -                not context_record.operation.operation_type.judiciary: -            self.fields.pop('seal_number') +        if not context_record or not context_record.operation.operation_type.judiciary: +            self.fields.pop("seal_number")      def clean(self): -        clutter_long_side = self.cleaned_data.get('clutter_long_side', None) -        clutter_short_side = self.cleaned_data.get('clutter_short_side', None) - -        if clutter_long_side and clutter_short_side and \ -                clutter_short_side > clutter_long_side: +        clutter_long_side = self.cleaned_data.get("clutter_long_side", None) +        clutter_short_side = self.cleaned_data.get("clutter_short_side", None) + +        if ( +            clutter_long_side +            and clutter_short_side +            and clutter_short_side > clutter_long_side +        ):              raise forms.ValidationError( -                str(_( -                    "Clutter: short side cannot be bigger than the long side." -                )) +                str(_("Clutter: short side cannot be bigger than the long side."))              )          return self.cleaned_data @@ -303,106 +443,147 @@ class FindForm(BasicFindForm):      form_label = _("Find")      form_admin_name = _("Find - 020 - General")      form_slug = "find-020-general" -    base_models = ['get_first_base_find'] + BasicFindForm.base_models +    base_models = ["get_first_base_find"] + BasicFindForm.base_models      associated_models = BasicFindForm.associated_models.copy() -    associated_models.update({ -        'get_first_base_find__batch': models.BatchType, -        'get_first_base_find__spatial_reference_system': SpatialReferenceSystem, -    }) +    associated_models.update( +        { +            "get_first_base_find__batch": models.BatchType, +            "get_first_base_find__spatial_reference_system": SpatialReferenceSystem, +        } +    )      field_order = [ -        'label', 'denomination', 'previous_id', -        'get_first_base_find__excavation_id', 'museum_id', 'laboratory_id', -        'seal_number', 'mark', 'description', -        'public_description', 'get_first_base_find__discovery_date', -        'get_first_base_find__discovery_date_taq', 'get_first_base_find__batch', -        'is_complete', 'material_type', 'material_type_quality', -        'material_comment', 'object_type', 'object_type_quality', -        'functional_area', 'find_number', 'min_number_of_individuals', -        'inscription', 'manufacturing_place', 'communicabilitie', 'comment', -        'cultural_attribution', -        'dating_comment', 'length', 'width', 'height', 'thickness', 'diameter', -        'circumference', -        'volume', 'weight', 'clutter_long_side', 'clutter_short_side', -        'clutter_height', 'dimensions_comment', 'get_first_base_find__x', -        'get_first_base_find__estimated_error_x', 'get_first_base_find__y', -        'get_first_base_find__estimated_error_y', 'get_first_base_find__z', -        'get_first_base_find__estimated_error_z', -        'get_first_base_find__spatial_reference_system', -        'get_first_base_find__topographic_localisation', 'checked_type', -        'check_date', +        "label", +        "denomination", +        "previous_id", +        "get_first_base_find__excavation_id", +        "museum_id", +        "laboratory_id", +        "seal_number", +        "mark", +        "description", +        "public_description", +        "get_first_base_find__discovery_date", +        "get_first_base_find__discovery_date_taq", +        "get_first_base_find__batch", +        "is_complete", +        "material_type", +        "material_type_quality", +        "material_comment", +        "object_type", +        "object_type_quality", +        "functional_area", +        "find_number", +        "min_number_of_individuals", +        "inscription", +        "manufacturing_place", +        "communicabilitie", +        "comment", +        "cultural_attribution", +        "dating_comment", +        "length", +        "width", +        "height", +        "thickness", +        "diameter", +        "circumference", +        "volume", +        "weight", +        "clutter_long_side", +        "clutter_short_side", +        "clutter_height", +        "dimensions_comment", +        "get_first_base_find__x", +        "get_first_base_find__estimated_error_x", +        "get_first_base_find__y", +        "get_first_base_find__estimated_error_y", +        "get_first_base_find__z", +        "get_first_base_find__estimated_error_z", +        "get_first_base_find__spatial_reference_system", +        "get_first_base_find__topographic_localisation", +        "checked_type", +        "check_date",      ]      HEADERS = BasicFindForm.HEADERS.copy()      get_first_base_find__excavation_id = forms.CharField( -        label=_("Excavation ID"), required=False) +        label=_("Excavation ID"), required=False +    )      get_first_base_find__discovery_date = forms.DateField( -        label=_("Discovery date (exact or TPQ)"), widget=DatePicker, -        required=False) +        label=_("Discovery date (exact or TPQ)"), widget=DatePicker, required=False +    )      get_first_base_find__discovery_date_taq = forms.DateField( -        label=_("Discovery date (TAQ)"), widget=DatePicker, required=False) +        label=_("Discovery date (TAQ)"), widget=DatePicker, required=False +    )      get_first_base_find__batch = forms.ChoiceField( -        label=_("Batch/object"), choices=[], -        required=False) +        label=_("Batch/object"), choices=[], required=False +    ) -    HEADERS['get_first_base_find__x'] = FormHeader(_("Coordinates")) +    HEADERS["get_first_base_find__x"] = FormHeader(_("Coordinates"))      get_first_base_find__x = forms.FloatField(label=_("X"), required=False) -    get_first_base_find__estimated_error_x = \ -        forms.FloatField(label=_("Estimated error for X"), required=False) +    get_first_base_find__estimated_error_x = forms.FloatField( +        label=_("Estimated error for X"), required=False +    )      get_first_base_find__y = forms.FloatField(label=_("Y"), required=False) -    get_first_base_find__estimated_error_y = \ -        forms.FloatField(label=_("Estimated error for Y"), required=False) +    get_first_base_find__estimated_error_y = forms.FloatField( +        label=_("Estimated error for Y"), required=False +    )      get_first_base_find__z = forms.FloatField(label=_("Z"), required=False) -    get_first_base_find__estimated_error_z = \ -        forms.FloatField(label=_("Estimated error for Z"), required=False) -    get_first_base_find__spatial_reference_system = \ -        forms.ChoiceField(label=_("Spatial Reference System"), required=False, -                          choices=[]) +    get_first_base_find__estimated_error_z = forms.FloatField( +        label=_("Estimated error for Z"), required=False +    ) +    get_first_base_find__spatial_reference_system = forms.ChoiceField( +        label=_("Spatial Reference System"), required=False, choices=[] +    )      get_first_base_find__topographic_localisation = forms.CharField( -        label=_("Point of topographic reference"), -        required=False, max_length=120 +        label=_("Point of topographic reference"), required=False, max_length=120      )      TYPES = BasicFindForm.TYPES + [ -        FieldType('get_first_base_find__batch', models.BatchType), -        FieldType('get_first_base_find__spatial_reference_system', -                  SpatialReferenceSystem), +        FieldType("get_first_base_find__batch", models.BatchType), +        FieldType( +            "get_first_base_find__spatial_reference_system", SpatialReferenceSystem +        ),      ]      PROFILE_FILTER = { -        'mapping': [ -            'get_first_base_find__x', 'get_first_base_find__y', -            'get_first_base_find__z', 'get_first_base_find__estimated_error_x', -            'get_first_base_find__estimated_error_y', -            'get_first_base_find__estimated_error_z', -            'get_first_base_find__spatial_reference_system' +        "mapping": [ +            "get_first_base_find__x", +            "get_first_base_find__y", +            "get_first_base_find__z", +            "get_first_base_find__estimated_error_x", +            "get_first_base_find__estimated_error_y", +            "get_first_base_find__estimated_error_z", +            "get_first_base_find__spatial_reference_system",          ],          #'warehouse': [          #    'collection' -        #] +        # ]      }      def clean(self):          self.cleaned_data = super(FindForm, self).clean() -        taq = self.cleaned_data.get('get_first_base_find__discovery_date_taq', -                                    None) -        tpq = self.cleaned_data.get('get_first_base_find__discovery_date', -                                    None) +        taq = self.cleaned_data.get("get_first_base_find__discovery_date_taq", None) +        tpq = self.cleaned_data.get("get_first_base_find__discovery_date", None)          if taq and not tpq:              raise forms.ValidationError( -                str(_( -                    "Discovery date: if a TAQ date is provided a TPQ date has " -                    "to be informed. If you have a precise date fill only the " -                    "TPQ - discovery date field.")) +                str( +                    _( +                        "Discovery date: if a TAQ date is provided a TPQ date has " +                        "to be informed. If you have a precise date fill only the " +                        "TPQ - discovery date field." +                    ) +                )              )          elif tpq and taq and taq < tpq:              raise forms.ValidationError( -                str(_("Discovery date: TAQ date must be older than TPQ date."))) +                str(_("Discovery date: TAQ date must be older than TPQ date.")) +            )          if not get_current_profile().mapping:              return self.cleaned_data -        x = self.cleaned_data.get('get_first_base_find__x', None) -        y = self.cleaned_data.get('get_first_base_find__y', None) -        s = 'get_first_base_find__spatial_reference_system' +        x = self.cleaned_data.get("get_first_base_find__x", None) +        y = self.cleaned_data.get("get_first_base_find__y", None) +        s = "get_first_base_find__spatial_reference_system"          srs = self.cleaned_data.get(s, None)          if srs:              try: @@ -411,23 +592,34 @@ class FindForm(BasicFindForm):                  srs = None          if x and y and not srs:              raise forms.ValidationError( -                _("You should at least provide X, Y and the spatial " -                  "reference system used.")) +                _( +                    "You should at least provide X, Y and the spatial " +                    "reference system used." +                ) +            )          if x and y and srs:              try:                  convert_coordinates_to_point( -                    x, y, self.cleaned_data.get('get_first_base_find__z', None), -                    srs.srid) +                    x, +                    y, +                    self.cleaned_data.get("get_first_base_find__z", None), +                    srs.srid, +                )              except forms.ValidationError as e:                  raise forms.ValidationError( -                    str(_("Coordinates are not relevant for the spatial " -                          "reference system used: {}.")).format(e)) +                    str( +                        _( +                            "Coordinates are not relevant for the spatial " +                            "reference system used: {}." +                        ) +                    ).format(e) +                )          return self.cleaned_data  class SimpleFindForm(BasicFindForm):      def __init__(self, *args, **kwargs): -        self.base_finds = kwargs.pop('base_finds') +        self.base_finds = kwargs.pop("base_finds")          super(SimpleFindForm, self).__init__(*args, **kwargs) @@ -438,94 +630,102 @@ class ResultingFindForm(CustomForm, ManageOldType):      form_slug = "treatmentn1-030-resulting-find"      associated_models = { -        'resulting_material_type': models.MaterialType, -        'resulting_object_type': models.ObjectType, -        'resulting_communicabilitie': models.CommunicabilityType, -        'resulting_material_type_quality': models.MaterialTypeQualityType, -        'resulting_object_type_quality': models.ObjectTypeQualityType, -        'resulting_checked_type': models.CheckedType, +        "resulting_material_type": models.MaterialType, +        "resulting_object_type": models.ObjectType, +        "resulting_communicabilitie": models.CommunicabilityType, +        "resulting_material_type_quality": models.MaterialTypeQualityType, +        "resulting_object_type_quality": models.ObjectTypeQualityType, +        "resulting_checked_type": models.CheckedType,      }      HEADERS = {} -    HEADERS['resulting_label'] = FormHeader(_("Identification")) +    HEADERS["resulting_label"] = FormHeader(_("Identification"))      resulting_label = forms.CharField( -        label=_("Free ID"), -        validators=[validators.MaxLengthValidator(60)]) -    resulting_denomination = forms.CharField(label=_("Denomination"), -                                             required=False) +        label=_("Free ID"), validators=[validators.MaxLengthValidator(60)] +    ) +    resulting_denomination = forms.CharField(label=_("Denomination"), required=False) -    HEADERS['resulting_description'] = FormHeader(_("Description")) +    HEADERS["resulting_description"] = FormHeader(_("Description"))      resulting_description = forms.CharField( -        label=_("Description"), widget=forms.Textarea, required=False) +        label=_("Description"), widget=forms.Textarea, required=False +    )      resulting_is_complete = forms.NullBooleanField( -        label=_("Is complete?"), required=False) +        label=_("Is complete?"), required=False +    )      resulting_material_type = widgets.Select2MultipleField(          label=_("Material types"), required=False      )      resulting_material_type_quality = forms.ChoiceField( -        label=_("Material type quality"), required=False, choices=[]) +        label=_("Material type quality"), required=False, choices=[] +    )      resulting_object_type = widgets.Select2MultipleField( -        label=_("Object types"), required=False, +        label=_("Object types"), +        required=False,      )      resulting_object_type_quality = forms.ChoiceField( -        label=_("Object type quality"), required=False, choices=[]) -    resulting_find_number = forms.IntegerField( -        label=_("Find number"), required=False) +        label=_("Object type quality"), required=False, choices=[] +    ) +    resulting_find_number = forms.IntegerField(label=_("Find number"), required=False)      resulting_min_number_of_individuals = forms.IntegerField( -        label=_("Minimum number of individuals (MNI)"), required=False) +        label=_("Minimum number of individuals (MNI)"), required=False +    )      resulting_decoration = forms.CharField( -        label=_("Decoration"), widget=forms.Textarea, required=False) +        label=_("Decoration"), widget=forms.Textarea, required=False +    )      resulting_inscription = forms.CharField( -        label=_("Inscription"), widget=forms.Textarea, required=False) +        label=_("Inscription"), widget=forms.Textarea, required=False +    )      resulting_manufacturing_place = forms.CharField( -        label=_("Manufacturing place"), required=False) +        label=_("Manufacturing place"), required=False +    )      resulting_communicabilitie = widgets.Select2MultipleField(          label=_("Communicability"), required=False      ) -    resulting_comment = forms.CharField(label=_("Comment"), required=False, -                                        widget=forms.Textarea) +    resulting_comment = forms.CharField( +        label=_("Comment"), required=False, widget=forms.Textarea +    )      resulting_dating_comment = forms.CharField( -        label=_("Comment on dating"), required=False, widget=forms.Textarea) +        label=_("Comment on dating"), required=False, widget=forms.Textarea +    ) -    HEADERS['resulting_length'] = FormHeader(_("Dimensions")) +    HEADERS["resulting_length"] = FormHeader(_("Dimensions"))      resulting_length = FloatField(label=_("Length (cm)"), required=False)      resulting_width = FloatField(label=_("Width (cm)"), required=False)      resulting_height = FloatField(label=_("Height (cm)"), required=False)      resulting_diameter = FloatField(label=_("Diameter (cm)"), required=False) -    resulting_circumference = FloatField(label=_("Circumference (cm)"), -                                         required=False) +    resulting_circumference = FloatField(label=_("Circumference (cm)"), required=False)      resulting_thickness = FloatField(label=_("Thickness (cm)"), required=False)      resulting_volume = FloatField(label=_("Volume (l)"), required=False)      resulting_weight = FloatField(label=_("Weight (g)"), required=False)      resulting_clutter_long_side = FloatField( -        label=_("Clutter long side (cm)"), required=False) +        label=_("Clutter long side (cm)"), required=False +    )      resulting_clutter_short_side = FloatField( -        label=_("Clutter short side (cm)"), required=False) +        label=_("Clutter short side (cm)"), required=False +    )      resulting_clutter_height = FloatField( -        label=_("Clutter height (cm)"), required=False) +        label=_("Clutter height (cm)"), required=False +    )      resulting_dimensions_comment = forms.CharField( -        label=_("Dimensions comment"), required=False, widget=forms.Textarea) +        label=_("Dimensions comment"), required=False, widget=forms.Textarea +    ) -    HEADERS['resulting_checked_type'] = FormHeader(_("Sheet")) -    resulting_checked_type = forms.ChoiceField(label=_("Check"), -                                               required=False) +    HEADERS["resulting_checked_type"] = FormHeader(_("Sheet")) +    resulting_checked_type = forms.ChoiceField(label=_("Check"), required=False)      resulting_check_date = forms.DateField( -        initial=get_now, label=_("Check date"), widget=DatePicker) +        initial=get_now, label=_("Check date"), widget=DatePicker +    )      TYPES = [ -        FieldType('resulting_material_type', models.MaterialType, -                  is_multiple=True), -        FieldType('resulting_material_type_quality', -                  models.MaterialTypeQualityType), -        FieldType('resulting_object_type', models.ObjectType, -                  is_multiple=True), -        FieldType('resulting_object_type_quality', -                  models.ObjectTypeQualityType), -        FieldType('resulting_communicabilitie', models.CommunicabilityType, -                  is_multiple=True), -        FieldType('resulting_checked_type', models.CheckedType, -                  is_multiple=True), +        FieldType("resulting_material_type", models.MaterialType, is_multiple=True), +        FieldType("resulting_material_type_quality", models.MaterialTypeQualityType), +        FieldType("resulting_object_type", models.ObjectType, is_multiple=True), +        FieldType("resulting_object_type_quality", models.ObjectTypeQualityType), +        FieldType( +            "resulting_communicabilitie", models.CommunicabilityType, is_multiple=True +        ), +        FieldType("resulting_checked_type", models.CheckedType, is_multiple=True),      ] @@ -536,29 +736,28 @@ class ResultingFindsForm(CustomForm, ManageOldType):      associated_models = {}      resultings_number = forms.IntegerField( -        label=_("Number of resulting finds"), -        min_value=1 +        label=_("Number of resulting finds"), min_value=1      )      resultings_label = forms.CharField(          label=_("Prefix label for resulting finds"),          validators=[validators.MaxLengthValidator(200)],          help_text=_(              'E.g.: with a prefix "item-", each resulting item will be named ' -            '"item-1", "item-2", "item-3"') +            '"item-1", "item-2", "item-3"' +        ),      )      resultings_start_number = forms.IntegerField(          label=_("Numbering starting from"), initial=1, min_value=0      )      resultings_basket_name = forms.CharField( -        label=_("Name of the new basket containing the resulting items"), -        max_length=200 +        label=_("Name of the new basket containing the resulting items"), max_length=200      )      def __init__(self, *args, **kwargs):          self.user = None -        if 'user' in kwargs: -            self.user = kwargs.pop('user') -            if hasattr(self.user, 'ishtaruser'): +        if "user" in kwargs: +            self.user = kwargs.pop("user") +            if hasattr(self.user, "ishtaruser"):                  self.user = self.user.ishtaruser          super(ResultingFindsForm, self).__init__(*args, **kwargs)          if not self.user: @@ -566,73 +765,94 @@ class ResultingFindsForm(CustomForm, ManageOldType):      def clean(self):          q = models.FindBasket.objects.filter( -            user=self.user, label=self.cleaned_data['resultings_basket_name']) +            user=self.user, label=self.cleaned_data["resultings_basket_name"] +        )          if q.count(): -            raise forms.ValidationError(_("A basket with this label already " -                                          "exists.")) +            raise forms.ValidationError( +                _("A basket with this label already " "exists.") +            )          return self.cleaned_data  class QAFindFormMulti(QAForm):      form_admin_name = _("Find - Quick action - Modify")      form_slug = "find-quickaction-modify" -    base_models = ['get_first_base_find', 'qa_object_types', -                   'qa_functional_areas', -                   'qa_material_types', 'qa_communicabilities', -                   'qa_alterations', 'qa_alteration_causes'] +    base_models = [ +        "get_first_base_find", +        "qa_object_types", +        "qa_functional_areas", +        "qa_material_types", +        "qa_communicabilities", +        "qa_alterations", +        "qa_alteration_causes", +    ]      associated_models = { -        'qa_material_types': models.MaterialType, -        'qa_object_types': models.ObjectType, -        'qa_functional_areas': models.FunctionalArea, -        'qa_communicabilities': models.CommunicabilityType, -        'qa_alterations': models.AlterationType, -        'qa_alteration_causes': models.AlterationCauseType, -        'qa_checked_type': models.CheckedType, -        'qa_period': Period, +        "qa_material_types": models.MaterialType, +        "qa_object_types": models.ObjectType, +        "qa_functional_areas": models.FunctionalArea, +        "qa_communicabilities": models.CommunicabilityType, +        "qa_alterations": models.AlterationType, +        "qa_alteration_causes": models.AlterationCauseType, +        "qa_checked_type": models.CheckedType, +        "qa_period": Period,          "qa_conservatory_state": models.ConservatoryState,          "qa_treatment_emergency": models.TreatmentEmergencyType,      }      MULTI = True      REPLACE_FIELDS = [ -        'qa_denomination', 'qa_ue', 'qa_manufacturing_place', 'qa_checked_type', -        'qa_check_date', 'qa_conservatory_state', 'qa_treatment_emergency', -        'qa_appraisal_date', "qa_insurance_value",  # 'qa_collection', +        "qa_denomination", +        "qa_ue", +        "qa_manufacturing_place", +        "qa_checked_type", +        "qa_check_date", +        "qa_conservatory_state", +        "qa_treatment_emergency", +        "qa_appraisal_date", +        "qa_insurance_value",  # 'qa_collection',      ]      HEADERS = { -        'qa_ue': FormHeader(_("Context record")), -        'qa_denomination': FormHeader(_("Identification")), -        'qa_description': FormHeader(_("Description")), -        'qa_checked_type': FormHeader(_("Sheet")), -        'qa_period': FormHeader(_("Datation")), +        "qa_ue": FormHeader(_("Context record")), +        "qa_denomination": FormHeader(_("Identification")), +        "qa_description": FormHeader(_("Description")), +        "qa_checked_type": FormHeader(_("Sheet")), +        "qa_period": FormHeader(_("Datation")),      }      SINGLE_FIELDS = [ -        'qa_label', 'qa_previous_id', -        'qa_get_first_base_find__excavation_id', 'qa_museum_id', -        'qa_laboratory_id', 'qa_seal_number', 'qa_mark', +        "qa_label", +        "qa_previous_id", +        "qa_get_first_base_find__excavation_id", +        "qa_museum_id", +        "qa_laboratory_id", +        "qa_seal_number", +        "qa_mark",      ]      qa_ue = forms.IntegerField(          label=_("Context record"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-contextrecord'), -            associated_model=ContextRecord), -        validators=[valid_id(ContextRecord)], required=False) +            reverse_lazy("autocomplete-contextrecord"), associated_model=ContextRecord +        ), +        validators=[valid_id(ContextRecord)], +        required=False, +    )      qa_label = forms.CharField(          label=_("Free ID"), -        validators=[validators.MaxLengthValidator(60)], required=False) +        validators=[validators.MaxLengthValidator(60)], +        required=False, +    )      qa_denomination = forms.CharField(label=_("Denomination"), required=False)      qa_previous_id = forms.CharField(label=_("Previous ID"), required=False)      qa_get_first_base_find__excavation_id = forms.CharField( -        label=_("Excavation ID"), required=False) +        label=_("Excavation ID"), required=False +    )      qa_museum_id = forms.CharField(label=_("Museum ID"), required=False) -    qa_laboratory_id = forms.CharField(label=_("Laboratory ID"), -                                       required=False) +    qa_laboratory_id = forms.CharField(label=_("Laboratory ID"), required=False)      qa_seal_number = forms.CharField(label=_("Seal number"), required=False)      qa_mark = forms.CharField(label=_("Mark"), required=False) -    #qa_collection = forms.IntegerField( +    # qa_collection = forms.IntegerField(      #    label=_("Collection"),      #    widget=widgets.JQueryAutoComplete(      #        reverse_lazy('autocomplete-warehouse'), @@ -640,74 +860,79 @@ class QAFindFormMulti(QAForm):      #    validators=[valid_id(Warehouse)], required=False)      qa_description = forms.CharField( -        label=_("Description"), widget=forms.Textarea, required=False) +        label=_("Description"), widget=forms.Textarea, required=False +    )      qa_material_types = widgets.Select2MultipleField(          label=_("Material types"), required=False      )      qa_object_types = widgets.Select2MultipleField( -        label=_("Object types"), required=False, +        label=_("Object types"), +        required=False,      )      qa_functional_areas = widgets.Select2MultipleField( -        label=_("Functional areas"), required=False, +        label=_("Functional areas"), +        required=False,      )      qa_manufacturing_place = forms.CharField( -        label=_("Manufacturing place"), required=False) +        label=_("Manufacturing place"), required=False +    )      qa_communicabilities = widgets.Select2MultipleField(          label=_("Communicability"), required=False      ) -    qa_alterations = widgets.Select2MultipleField( -        label=_("Alteration"), required=False -    ) +    qa_alterations = widgets.Select2MultipleField(label=_("Alteration"), required=False)      qa_alteration_causes = widgets.Select2MultipleField(          label=_("Alteration cause"), required=False      ) -    qa_conservatory_state = forms.ChoiceField(label=_("Conservatory state"), -                                              required=False, choices=[]) -    qa_treatment_emergency = forms.ChoiceField(label=_("Treatment emergency"), -                                               choices=[], required=False) +    qa_conservatory_state = forms.ChoiceField( +        label=_("Conservatory state"), required=False, choices=[] +    ) +    qa_treatment_emergency = forms.ChoiceField( +        label=_("Treatment emergency"), choices=[], required=False +    )      qa_remarkabilities = widgets.Select2MultipleField( -        label=_("Remarkability"), required=False) +        label=_("Remarkability"), required=False +    )      qa_comment = forms.CharField( -        label=_("Comment"), required=False, -        widget=forms.Textarea) +        label=_("Comment"), required=False, widget=forms.Textarea +    )      qa_checked_type = forms.ChoiceField(label=_("Check"), required=False)      qa_check_date = forms.DateField( -        label=_("Check date"), widget=DatePicker, required=False) +        label=_("Check date"), widget=DatePicker, required=False +    )      qa_appraisal_date = forms.DateField( -        label=_("Appraisal date"), widget=DatePicker, required=False) -    qa_insurance_value = forms.FloatField( -        label=_("Insurance value"), required=False) +        label=_("Appraisal date"), widget=DatePicker, required=False +    ) +    qa_insurance_value = forms.FloatField(label=_("Insurance value"), required=False)      qa_period = widgets.Select2MultipleField( -        label=_("Period"), choices=[], required=False) +        label=_("Period"), choices=[], required=False +    )      qa_dating_comment = forms.CharField( -        label=_("Comment on dating"), required=False, -        widget=forms.Textarea) +        label=_("Comment on dating"), required=False, widget=forms.Textarea +    )      TYPES = [ -        FieldType('qa_material_types', models.MaterialType, is_multiple=True), -        FieldType('qa_object_types', models.ObjectType, is_multiple=True), -        FieldType('qa_functional_areas', models.FunctionalArea, is_multiple=True), -        FieldType('qa_communicabilities', models.CommunicabilityType, -                  is_multiple=True), -        FieldType('qa_alterations', models.AlterationType, is_multiple=True), -        FieldType('qa_alteration_causes', models.AlterationCauseType, -                  is_multiple=True), -        FieldType('qa_remarkabilities', models.RemarkabilityType, -                  is_multiple=True), -        FieldType('qa_checked_type', models.CheckedType), -        FieldType('qa_conservatory_state', models.ConservatoryState), -        FieldType('qa_treatment_emergency', models.TreatmentEmergencyType), -        FieldType('qa_period', Period, is_multiple=True), +        FieldType("qa_material_types", models.MaterialType, is_multiple=True), +        FieldType("qa_object_types", models.ObjectType, is_multiple=True), +        FieldType("qa_functional_areas", models.FunctionalArea, is_multiple=True), +        FieldType("qa_communicabilities", models.CommunicabilityType, is_multiple=True), +        FieldType("qa_alterations", models.AlterationType, is_multiple=True), +        FieldType("qa_alteration_causes", models.AlterationCauseType, is_multiple=True), +        FieldType("qa_remarkabilities", models.RemarkabilityType, is_multiple=True), +        FieldType("qa_checked_type", models.CheckedType), +        FieldType("qa_conservatory_state", models.ConservatoryState), +        FieldType("qa_treatment_emergency", models.TreatmentEmergencyType), +        FieldType("qa_period", Period, is_multiple=True),      ]      def __init__(self, *args, **kwargs):          super(QAFindFormMulti, self).__init__(*args, **kwargs) -        if 'qa_insurance_value' in self.fields: -            self.fields['qa_insurance_value'].label = "{} ({})".format( -                str(self.fields['qa_insurance_value'].label), -                get_current_profile().currency) +        if "qa_insurance_value" in self.fields: +            self.fields["qa_insurance_value"].label = "{} ({})".format( +                str(self.fields["qa_insurance_value"].label), +                get_current_profile().currency, +            )      def _get_qa_ue(self, value):          try: @@ -716,7 +941,7 @@ class QAFindFormMulti(QAForm):              return ""          return value -    #def _get_qa_collection(self, value): +    # def _get_qa_collection(self, value):      #    try:      #        value = Warehouse.objects.get(pk=value).name      #    except Warehouse.DoesNotExist: @@ -724,7 +949,7 @@ class QAFindFormMulti(QAForm):      #    return value      def _set_qa_ue(self, item, user): -        ue = self.cleaned_data['qa_ue'] +        ue = self.cleaned_data["qa_ue"]          if not ue:              return          cr = ContextRecord.objects.get(pk=ue) @@ -734,7 +959,7 @@ class QAFindFormMulti(QAForm):          bf.save()      def _set_qa_period(self, item, user): -        periods = self.cleaned_data['qa_period'] +        periods = self.cleaned_data["qa_period"]          if not periods:              return          for period in periods: @@ -751,91 +976,104 @@ class QAFindFormSingle(QAFindFormMulti):      def __init__(self, *args, **kwargs):          super(QAFindFormSingle, self).__init__(*args, **kwargs) -        if not self.items or \ -                not self.items[0].get_first_base_find( -                ).context_record.operation.operation_type.judiciary: -            self.fields.pop('qa_seal_number') +        if ( +            not self.items +            or not self.items[0] +            .get_first_base_find() +            .context_record.operation.operation_type.judiciary +        ): +            self.fields.pop("qa_seal_number")  class QAFindBasketForm(IshtarForm):      qa_bf_create_or_update = forms.ChoiceField( -        choices=(('create', _("Create")), -                 ('update', _("Update"))), initial='create') +        choices=(("create", _("Create")), ("update", _("Update"))), initial="create" +    )      qa_bf_label = forms.CharField(label="", max_length=None, required=False)      qa_bf_basket = forms.IntegerField(          label=_("Basket"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-findbasket-write'), -            associated_model=models.FindBasket), -        validators=[valid_id(models.FindBasket)], required=False) +            reverse_lazy("autocomplete-findbasket-write"), +            associated_model=models.FindBasket, +        ), +        validators=[valid_id(models.FindBasket)], +        required=False, +    )      def __init__(self, *args, **kwargs):          self.user = None -        if 'user' in kwargs: -            self.user = kwargs.pop('user') -            if hasattr(self.user, 'ishtaruser'): +        if "user" in kwargs: +            self.user = kwargs.pop("user") +            if hasattr(self.user, "ishtaruser"):                  self.user = self.user.ishtaruser -        self.items = kwargs.pop('items') +        self.items = kwargs.pop("items")          super(QAFindBasketForm, self).__init__(*args, **kwargs)      def clean(self): -        if self.cleaned_data['qa_bf_create_or_update'] == 'update': -            if not self.cleaned_data['qa_bf_basket']: +        if self.cleaned_data["qa_bf_create_or_update"] == "update": +            if not self.cleaned_data["qa_bf_basket"]:                  raise forms.ValidationError( -                    _("On update, you have to select a basket.")) +                    _("On update, you have to select a basket.") +                )              q = Q(user=self.user) | Q(shared_write_with__pk=self.user.pk)              q = models.FindBasket.objects.filter(q).filter( -                pk=self.cleaned_data['qa_bf_basket']) +                pk=self.cleaned_data["qa_bf_basket"] +            )              if not q.count(): -                raise forms.ValidationError( -                    _("You cannot update the selected basket.")) +                raise forms.ValidationError(_("You cannot update the selected basket."))              return self.cleaned_data -        label = self.cleaned_data['qa_bf_label'].strip() +        label = self.cleaned_data["qa_bf_label"].strip()          if not label:              raise forms.ValidationError(_("A label is required.")) -        if models.FindBasket.objects.filter(user=self.user, -                                            label=label).count(): -            raise forms.ValidationError(_("A basket with this label already " -                                          "exists.")) +        if models.FindBasket.objects.filter(user=self.user, label=label).count(): +            raise forms.ValidationError( +                _("A basket with this label already " "exists.") +            )          return self.cleaned_data      def save(self, items): -        if self.cleaned_data['qa_bf_create_or_update'] == 'update': +        if self.cleaned_data["qa_bf_create_or_update"] == "update":              q = Q(user=self.user) | Q(shared_write_with__pk=self.user.pk) -            basket = models.FindBasket.objects.filter(q).distinct().get( -                pk=self.cleaned_data['qa_bf_basket']) +            basket = ( +                models.FindBasket.objects.filter(q) +                .distinct() +                .get(pk=self.cleaned_data["qa_bf_basket"]) +            )          else: -            label = self.cleaned_data['qa_bf_label'].strip() -            basket = models.FindBasket.objects.create( -                user=self.user, label=label) +            label = self.cleaned_data["qa_bf_label"].strip() +            basket = models.FindBasket.objects.create(user=self.user, label=label)          for item in items:              basket.items.add(item)  class QAFindDuplicateForm(IshtarForm):      label = forms.CharField(label=_("Free ID"), max_length=None, required=True) -    denomination = forms.CharField(label=_("Denomination"), max_length=None, -                                   required=False) +    denomination = forms.CharField( +        label=_("Denomination"), max_length=None, required=False +    )      # modify = forms.BooleanField(label=_("Edit the new find"), required=False)      def __init__(self, *args, **kwargs):          self.user = None -        if 'user' in kwargs: -            self.user = kwargs.pop('user') -            if hasattr(self.user, 'ishtaruser'): +        if "user" in kwargs: +            self.user = kwargs.pop("user") +            if hasattr(self.user, "ishtaruser"):                  self.user = self.user.ishtaruser -        self.find = kwargs.pop('items')[0] +        self.find = kwargs.pop("items")[0]          super(QAFindDuplicateForm, self).__init__(*args, **kwargs) -        self.fields['label'].initial = self.find.label + str( -            _(" - duplicate")) -        self.fields['denomination'].initial = self.find.denomination or "" +        self.fields["label"].initial = self.find.label + str(_(" - duplicate")) +        self.fields["denomination"].initial = self.find.denomination or ""      def save(self):          return self.find.duplicate( -            self.user, duplicate_for_treatment=False, -            data={"label": self.cleaned_data["label"], -                  "denomination": self.cleaned_data["denomination"]}) +            self.user, +            duplicate_for_treatment=False, +            data={ +                "label": self.cleaned_data["label"], +                "denomination": self.cleaned_data["denomination"], +            }, +        )  class QAFindbasketDuplicateForm(IshtarForm): @@ -843,119 +1081,139 @@ class QAFindbasketDuplicateForm(IshtarForm):      def __init__(self, *args, **kwargs):          self.user = None -        if 'user' in kwargs: -            self.user = kwargs.pop('user') -            if hasattr(self.user, 'ishtaruser'): +        if "user" in kwargs: +            self.user = kwargs.pop("user") +            if hasattr(self.user, "ishtaruser"):                  self.user = self.user.ishtaruser -        self.basket = kwargs.pop('items')[0] +        self.basket = kwargs.pop("items")[0]          super(QAFindbasketDuplicateForm, self).__init__(*args, **kwargs) -        self.fields['label'].initial = self.basket.label + str( -            _(" - duplicate")) +        self.fields["label"].initial = self.basket.label + str(_(" - duplicate"))      def clean(self): -        label = self.cleaned_data['label'].strip() +        label = self.cleaned_data["label"].strip()          if not label:              raise forms.ValidationError(_("A label is required.")) -        if models.FindBasket.objects.filter(user=self.user, -                                            label=label).count(): -            raise forms.ValidationError(_("A basket with this label already " -                                          "exists.")) +        if models.FindBasket.objects.filter(user=self.user, label=label).count(): +            raise forms.ValidationError( +                _("A basket with this label already " "exists.") +            )          return self.cleaned_data      def save(self): -        self.basket.duplicate(label=self.cleaned_data['label'], -                              ishtaruser=self.user) +        self.basket.duplicate(label=self.cleaned_data["label"], ishtaruser=self.user)  class PreservationForm(CustomForm, ManageOldType):      form_label = _("Preservation")      form_admin_name = _("Find - 030 - Preservation")      form_slug = "find-030-preservation" -    base_models = ['alteration', 'alteration_cause', -                   'preservation_to_consider', 'integritie', 'remarkabilitie'] +    base_models = [ +        "alteration", +        "alteration_cause", +        "preservation_to_consider", +        "integritie", +        "remarkabilitie", +    ]      associated_models = { -        'alteration': models.AlterationType, -        'alteration_cause': models.AlterationCauseType, -        'treatment_emergency': models.TreatmentEmergencyType, -        'conservatory_state': models.ConservatoryState, -        'preservation_to_consider': models.TreatmentType, -        'remarkabilitie': models.RemarkabilityType, -        'integritie': models.IntegrityType, +        "alteration": models.AlterationType, +        "alteration_cause": models.AlterationCauseType, +        "treatment_emergency": models.TreatmentEmergencyType, +        "conservatory_state": models.ConservatoryState, +        "preservation_to_consider": models.TreatmentType, +        "remarkabilitie": models.RemarkabilityType, +        "integritie": models.IntegrityType,      }      integritie = forms.MultipleChoiceField( -        label=_("Integrity / interest"), choices=[], -        widget=widgets.Select2Multiple, required=False) +        label=_("Integrity / interest"), +        choices=[], +        widget=widgets.Select2Multiple, +        required=False, +    )      remarkabilitie = forms.MultipleChoiceField( -        label=_("Remarkability"), choices=[], -        widget=widgets.Select2Multiple, required=False) -    conservatory_state = forms.ChoiceField(label=_("Conservatory state"), -                                           choices=[], required=False) +        label=_("Remarkability"), +        choices=[], +        widget=widgets.Select2Multiple, +        required=False, +    ) +    conservatory_state = forms.ChoiceField( +        label=_("Conservatory state"), choices=[], required=False +    )      alteration = forms.MultipleChoiceField( -        label=_("Alteration"), choices=[], -        widget=widgets.Select2Multiple, required=False) +        label=_("Alteration"), +        choices=[], +        widget=widgets.Select2Multiple, +        required=False, +    )      alteration_cause = forms.MultipleChoiceField( -        label=_("Alteration cause"), choices=[], -        widget=widgets.Select2Multiple, required=False) +        label=_("Alteration cause"), +        choices=[], +        widget=widgets.Select2Multiple, +        required=False, +    )      preservation_to_consider = forms.MultipleChoiceField( -        label=_("Recommended treatments"), choices=[], -        widget=widgets.Select2Multiple, required=False) -    treatment_emergency = forms.ChoiceField(label=_("Treatment emergency"), -                                            choices=[], required=False) +        label=_("Recommended treatments"), +        choices=[], +        widget=widgets.Select2Multiple, +        required=False, +    ) +    treatment_emergency = forms.ChoiceField( +        label=_("Treatment emergency"), choices=[], required=False +    )      estimated_value = FloatField(label=_("Estimated value"), required=False)      insurance_value = FloatField(label=_("Insurance value"), required=False)      appraisal_date = forms.DateField( -        label=_("Appraisal date"), widget=DatePicker, required=False) +        label=_("Appraisal date"), widget=DatePicker, required=False +    )      conservatory_comment = forms.CharField( -        label=_("Conservatory comment"), required=False, -        widget=forms.Textarea) +        label=_("Conservatory comment"), required=False, widget=forms.Textarea +    )      TYPES = [ -        FieldType('conservatory_state', models.ConservatoryState), -        FieldType('treatment_emergency', models.TreatmentEmergencyType), -        FieldType('preservation_to_consider', models.TreatmentType, True), -        FieldType('alteration', models.AlterationType, True), -        FieldType('alteration_cause', models.AlterationCauseType, True), -        FieldType('integritie', models.IntegrityType, is_multiple=True), -        FieldType('remarkabilitie', models.RemarkabilityType, is_multiple=True) +        FieldType("conservatory_state", models.ConservatoryState), +        FieldType("treatment_emergency", models.TreatmentEmergencyType), +        FieldType("preservation_to_consider", models.TreatmentType, True), +        FieldType("alteration", models.AlterationType, True), +        FieldType("alteration_cause", models.AlterationCauseType, True), +        FieldType("integritie", models.IntegrityType, is_multiple=True), +        FieldType("remarkabilitie", models.RemarkabilityType, is_multiple=True),      ]      def __init__(self, *args, **kwargs):          super(PreservationForm, self).__init__(*args, **kwargs) -        if 'insurance_value' in self.fields: -            self.fields['insurance_value'].label = "{} ({})".format( -                str(self.fields['insurance_value'].label), -                get_current_profile().currency) -        if 'estimated_value' in self.fields: -            self.fields['estimated_value'].label = "{} ({})".format( -                str(self.fields['estimated_value'].label), -                get_current_profile().currency) +        if "insurance_value" in self.fields: +            self.fields["insurance_value"].label = "{} ({})".format( +                str(self.fields["insurance_value"].label), +                get_current_profile().currency, +            ) +        if "estimated_value" in self.fields: +            self.fields["estimated_value"].label = "{} ({})".format( +                str(self.fields["estimated_value"].label), +                get_current_profile().currency, +            )  class DateForm(ManageOldType, forms.Form):      form_label = _("Dating") -    base_model = 'dating' -    associated_models = {'dating_type': DatingType, -                         'quality': DatingQuality, -                         'period': Period} +    base_model = "dating" +    associated_models = { +        "dating_type": DatingType, +        "quality": DatingQuality, +        "period": Period, +    }      period = forms.ChoiceField(label=_("Period"), choices=[]) -    start_date = forms.IntegerField(label=_("Start date"), -                                    required=False) +    start_date = forms.IntegerField(label=_("Start date"), required=False)      end_date = forms.IntegerField(label=_("End date"), required=False) -    quality = forms.ChoiceField(label=_("Quality"), required=False, -                                choices=[]) -    dating_type = forms.ChoiceField(label=_("Dating type"), -                                    required=False, choices=[]) -    precise_dating = forms.CharField(label=_("Precise dating"), -                                     required=False) +    quality = forms.ChoiceField(label=_("Quality"), required=False, choices=[]) +    dating_type = forms.ChoiceField(label=_("Dating type"), required=False, choices=[]) +    precise_dating = forms.CharField(label=_("Precise dating"), required=False)      TYPES = [ -        FieldType('dating_type', DatingType), -        FieldType('period', Period), -        FieldType('quality', DatingQuality), +        FieldType("dating_type", DatingType), +        FieldType("period", Period), +        FieldType("quality", DatingQuality),      ] -DatingFormSet = formset_factory(DateForm, can_delete=True, -                                formset=FormSet) +DatingFormSet = formset_factory(DateForm, can_delete=True, formset=FormSet)  DatingFormSet.form_label = _("Dating")  DatingFormSet.form_admin_name = _("Find - 040 - Dating")  DatingFormSet.form_slug = "find-040-dating" @@ -966,56 +1224,86 @@ class FindSelect(DocumentItemSelect, PeriodSelect):      form_admin_name = _("Find - 001 - Search")      form_slug = "find-001-search"      FORM_FILTERS = [ -        (_("Find origin"), [ -            "base_finds__cache_short_id", -            "base_finds__cache_complete_id", -            "base_finds__context_record__town", -            "base_finds__context_record__operation__year", -            "base_finds__context_record__operation__operation_code", -            "base_finds__context_record__operation__code_patriarche", -            "base_finds__context_record__operation__operation_type", -            "base_finds__context_record__operation__person_in_charge", -            "base_finds__context_record__operation__common_name" -            "base_finds__context_record__operation__operator", -            "base_finds__context_record__operation__address", -            "base_finds__context_record__town__areas", -            "archaeological_sites", -            "archaeological_sites_context_record", -            "base_finds__context_record", -            "ope_relation_types", -            "cr_relation_types", -        ]), -        (_("Discovery date"), [ -            "base_finds__discovery_date__before", -            "base_finds__discovery_date__after", -            "base_finds__discovery_date_tpq__before", -            "base_finds__discovery_date_tpq__after", -            "base_finds__discovery_date_taq__before", -            "base_finds__discovery_date_taq__after" -        ]), -        (_("Dimensions"), [ -            "length__higher", "width__higher", "height__higher", -            "thickness__higher", "diameter__higher", "circumference__higher", -            "volume__higher", "weight__higher", "clutter_long_side__higher", -            "clutter_short_side__higher", "clutter_height__higher", -            "length__lower", "width__lower", "height__lower", -            "thickness__lower", "diameter__lower", "circumference__lower", -            "volume__lower", "weight__lower", "clutter_long_side__lower", -            "clutter_short_side__lower", "clutter_height__lower", -            "dimensions_comment", -        ]), -        (_("Preservation"), ( -            "integrities", "remarkabilities", "conservatory_state", -            "conservatory_comment", -            "alterations", "alteration_causes", "preservation_to_considers", -            "treatment_emergency") -         ) +        ( +            _("Find origin"), +            [ +                "base_finds__cache_short_id", +                "base_finds__cache_complete_id", +                "base_finds__context_record__town", +                "base_finds__context_record__operation__year", +                "base_finds__context_record__operation__operation_code", +                "base_finds__context_record__operation__code_patriarche", +                "base_finds__context_record__operation__operation_type", +                "base_finds__context_record__operation__person_in_charge", +                "base_finds__context_record__operation__common_name" +                "base_finds__context_record__operation__operator", +                "base_finds__context_record__operation__address", +                "base_finds__context_record__town__areas", +                "archaeological_sites", +                "archaeological_sites_context_record", +                "base_finds__context_record", +                "ope_relation_types", +                "cr_relation_types", +            ], +        ), +        ( +            _("Discovery date"), +            [ +                "base_finds__discovery_date__before", +                "base_finds__discovery_date__after", +                "base_finds__discovery_date_tpq__before", +                "base_finds__discovery_date_tpq__after", +                "base_finds__discovery_date_taq__before", +                "base_finds__discovery_date_taq__after", +            ], +        ), +        ( +            _("Dimensions"), +            [ +                "length__higher", +                "width__higher", +                "height__higher", +                "thickness__higher", +                "diameter__higher", +                "circumference__higher", +                "volume__higher", +                "weight__higher", +                "clutter_long_side__higher", +                "clutter_short_side__higher", +                "clutter_height__higher", +                "length__lower", +                "width__lower", +                "height__lower", +                "thickness__lower", +                "diameter__lower", +                "circumference__lower", +                "volume__lower", +                "weight__lower", +                "clutter_long_side__lower", +                "clutter_short_side__lower", +                "clutter_height__lower", +                "dimensions_comment", +            ], +        ), +        ( +            _("Preservation"), +            ( +                "integrities", +                "remarkabilities", +                "conservatory_state", +                "conservatory_comment", +                "alterations", +                "alteration_causes", +                "preservation_to_considers", +                "treatment_emergency", +            ), +        ),      ]      search_vector = forms.CharField( -        label=_("Full text search"), widget=widgets.SearchWidget( -            'archaeological-finds', 'find' -        )) +        label=_("Full text search"), +        widget=widgets.SearchWidget("archaeological-finds", "find"), +    )      label = forms.CharField(label=_("Free ID"))      denomination = forms.CharField(label=_("Denomination"))      previous_id = forms.CharField(label=_("Previous ID")) @@ -1025,42 +1313,39 @@ class FindSelect(DocumentItemSelect, PeriodSelect):      laboratory_id = forms.CharField(label=_("Laboratory ID"))      mark = forms.CharField(label=_("Mark")) -    base_finds__cache_short_id = forms.CharField( -        label=_("Base find - Short ID")) -    base_finds__cache_complete_id = forms.CharField( -        label=_("Base find - Complete ID")) +    base_finds__cache_short_id = forms.CharField(label=_("Base find - Short ID")) +    base_finds__cache_complete_id = forms.CharField(label=_("Base find - Complete ID"))      base_finds__context_record__town = get_town_field() -    base_finds__context_record__operation__year = forms.IntegerField( -        label=_("Year")) +    base_finds__context_record__operation__year = forms.IntegerField(label=_("Year"))      base_finds__context_record__operation__operation_code = forms.IntegerField( -        label=_("Operation's number (index by year)")) -    base_finds__context_record__operation__code_patriarche = \ -        forms.IntegerField( -            label=_("Code PATRIARCHE"), -            widget=OAWidget -        ) +        label=_("Operation's number (index by year)") +    ) +    base_finds__context_record__operation__code_patriarche = forms.IntegerField( +        label=_("Code PATRIARCHE"), widget=OAWidget +    )      base_finds__context_record__operation__operation_type = forms.ChoiceField(          label=_("Operation type"), choices=[]      ) -    base_finds__context_record__operation__address = forms.CharField(label=_("Operation - Address / Locality")) +    base_finds__context_record__operation__address = forms.CharField( +        label=_("Operation - Address / Locality") +    )      base_finds__context_record__operation__in_charge = forms.IntegerField(          label=_("Operation - In charge"), -        widget=widgets.JQueryAutoComplete( -            reverse_lazy("autocomplete-person") -        ) +        widget=widgets.JQueryAutoComplete(reverse_lazy("autocomplete-person")),      )      base_finds__context_record__operation__scientist = forms.IntegerField(          widget=widgets.JQueryAutoComplete(              reverse_lazy( -                'autocomplete-person-permissive', -                args=[person_type_pks_lazy(['sra_agent', 'head_scientist'])]), -            associated_model=Person), -        label=_("Operation - Scientist in charge")) +                "autocomplete-person-permissive", +                args=[person_type_pks_lazy(["sra_agent", "head_scientist"])], +            ), +            associated_model=Person, +        ), +        label=_("Operation - Scientist in charge"), +    )      base_finds__context_record__operation__operator = forms.IntegerField(          label=_("Operation - Operator"), -        widget=widgets.JQueryAutoComplete( -            reverse_lazy("autocomplete-organization") -        ) +        widget=widgets.JQueryAutoComplete(reverse_lazy("autocomplete-organization")),      )      base_finds__context_record__operation__common_name = forms.CharField(          label=_("Operation - Name"), @@ -1071,38 +1356,46 @@ class FindSelect(DocumentItemSelect, PeriodSelect):      archaeological_sites = forms.IntegerField(          label=_("Archaeological site (attached to the operation)"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-archaeologicalsite'), -            associated_model=ArchaeologicalSite), -        validators=[valid_id(ArchaeologicalSite)]) +            reverse_lazy("autocomplete-archaeologicalsite"), +            associated_model=ArchaeologicalSite, +        ), +        validators=[valid_id(ArchaeologicalSite)], +    )      archaeological_sites_name = forms.CharField(          label=_("Archaeological site name (attached to the operation)")      )      archaeological_sites_context_record = forms.IntegerField(          label=_("Archaeological site (attached to the context record)"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-archaeologicalsite'), -            associated_model=ArchaeologicalSite), -        validators=[valid_id(ArchaeologicalSite)]) +            reverse_lazy("autocomplete-archaeologicalsite"), +            associated_model=ArchaeologicalSite, +        ), +        validators=[valid_id(ArchaeologicalSite)], +    )      archaeological_sites_context_record_name = forms.CharField(          label=_("Archaeological site name (attached to the context record)")      )      base_finds__context_record = forms.IntegerField(          label=_("Context record"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-contextrecord'), -            associated_model=ContextRecord), -        validators=[valid_id(ContextRecord)]) +            reverse_lazy("autocomplete-contextrecord"), associated_model=ContextRecord +        ), +        validators=[valid_id(ContextRecord)], +    )      ope_relation_types = forms.ChoiceField( -        label=_("Search within related operations"), choices=[]) +        label=_("Search within related operations"), choices=[] +    )      cr_relation_types = forms.ChoiceField( -        label=_("Search within related context records"), choices=[]) +        label=_("Search within related context records"), choices=[] +    )      basket = forms.IntegerField(          label=_("Basket"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-findbasket'), -            associated_model=models.FindBasket), -        validators=[valid_id(models.FindBasket)]) +            reverse_lazy("autocomplete-findbasket"), associated_model=models.FindBasket +        ), +        validators=[valid_id(models.FindBasket)], +    )      description = forms.CharField(label=_("Description"))      base_finds__discovery_date__after = forms.DateField( @@ -1128,30 +1421,33 @@ class FindSelect(DocumentItemSelect, PeriodSelect):      material_types = forms.IntegerField(          label=_("Material type"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-materialtype'), -            associated_model=models.MaterialType), +            reverse_lazy("autocomplete-materialtype"), +            associated_model=models.MaterialType, +        ), +    ) +    material_type_quality = forms.ChoiceField( +        label=_("Material type quality"), choices=[]      ) -    material_type_quality = forms.ChoiceField(label=_("Material type quality"), -                                              choices=[])      material_comment = forms.CharField(label=_("Comment on the material"))      object_types = forms.IntegerField(          label=_("Object type"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-objecttype'), -            associated_model=models.ObjectType), +            reverse_lazy("autocomplete-objecttype"), associated_model=models.ObjectType +        ),      ) -    object_type_quality = forms.ChoiceField( -        label=_("Object type quality"), choices=[]) +    object_type_quality = forms.ChoiceField(label=_("Object type quality"), choices=[])      functional_areas = forms.IntegerField(          label=_("Functional areas"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-functionalarea'), -            associated_model=models.FunctionalArea), +            reverse_lazy("autocomplete-functionalarea"), +            associated_model=models.FunctionalArea, +        ),      )      find_number = forms.IntegerField(label=_("Find number"))      min_number_of_individuals = forms.IntegerField( -        label=_("Minimum number of individuals (MNI)")) +        label=_("Minimum number of individuals (MNI)") +    )      manufacturing_place = forms.CharField(label=_("Manufacturing place"))      decoration = forms.CharField(label=_("Decoration")) @@ -1161,111 +1457,110 @@ class FindSelect(DocumentItemSelect, PeriodSelect):      comment = forms.CharField(label=_("Comment"))      cultural_attributions = forms.ChoiceField( -        label=_("Cultural attribution"), choices=[], required=False) +        label=_("Cultural attribution"), choices=[], required=False +    )      dating_comment = forms.CharField(label=_("Comment on dating")) -    length__higher = FloatField(label=_("Length - higher than (cm)"), -                                widget=widgets.CentimeterMeterWidget) -    length__lower = FloatField(label=_("Length - lower than (cm)"), -                               widget=widgets.CentimeterMeterWidget) +    length__higher = FloatField( +        label=_("Length - higher than (cm)"), widget=widgets.CentimeterMeterWidget +    ) +    length__lower = FloatField( +        label=_("Length - lower than (cm)"), widget=widgets.CentimeterMeterWidget +    )      width__lower = FloatField( -        label=_("Width - lower than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        label=_("Width - lower than (cm)"), widget=widgets.CentimeterMeterWidget +    )      width__higher = FloatField( -        label=_("Width - higher than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        label=_("Width - higher than (cm)"), widget=widgets.CentimeterMeterWidget +    )      height__lower = FloatField( -        label=_("Height - lower than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        label=_("Height - lower than (cm)"), widget=widgets.CentimeterMeterWidget +    )      height__higher = FloatField( -        label=_("Height - higher than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        label=_("Height - higher than (cm)"), widget=widgets.CentimeterMeterWidget +    )      thickness__lower = FloatField( -        label=_("Thickness - lower than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        label=_("Thickness - lower than (cm)"), widget=widgets.CentimeterMeterWidget +    )      thickness__higher = FloatField( -        label=_("Thickness - higher than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        label=_("Thickness - higher than (cm)"), widget=widgets.CentimeterMeterWidget +    )      diameter__lower = FloatField( -        label=_("Diameter - lower than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        label=_("Diameter - lower than (cm)"), widget=widgets.CentimeterMeterWidget +    )      diameter__higher = FloatField( -        label=_("Diameter - higher than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        label=_("Diameter - higher than (cm)"), widget=widgets.CentimeterMeterWidget +    )      circumference__lower = FloatField( -        label=_("Circumference - lower than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        label=_("Circumference - lower than (cm)"), widget=widgets.CentimeterMeterWidget +    )      circumference__higher = FloatField(          label=_("Circumference - higher than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        widget=widgets.CentimeterMeterWidget, +    )      volume__lower = FloatField(label=_("Volume - lower than (l)"))      volume__higher = FloatField(label=_("Volume - higher than (l)"))      weight__lower = FloatField( -        label=_("Weight - lower than (g)"), -        widget=widgets.GramKilogramWidget) +        label=_("Weight - lower than (g)"), widget=widgets.GramKilogramWidget +    )      weight__higher = FloatField( -        label=_("Weight - higher than (g)"), -        widget=widgets.GramKilogramWidget) +        label=_("Weight - higher than (g)"), widget=widgets.GramKilogramWidget +    )      clutter_long_side__lower = FloatField(          label=_("Clutter long side - lower than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        widget=widgets.CentimeterMeterWidget, +    )      clutter_long_side__higher = FloatField(          label=_("Clutter long side - higher than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        widget=widgets.CentimeterMeterWidget, +    )      clutter_short_side__lower = FloatField(          label=_("Clutter short side - lower than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        widget=widgets.CentimeterMeterWidget, +    )      clutter_short_side__higher = FloatField(          label=_("Clutter short side - higher than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        widget=widgets.CentimeterMeterWidget, +    )      clutter_height__lower = FloatField(          label=_("Clutter height - lower than (cm)"), -        widget=widgets.CentimeterMeterWidget) +        widget=widgets.CentimeterMeterWidget, +    )      clutter_height__higher = FloatField(          label=_("Clutter height - higher than (cm)"), -        widget=widgets.CentimeterMeterWidget) -    dimensions_comment = forms.CharField( -        label=_("Dimensions comment")) +        widget=widgets.CentimeterMeterWidget, +    ) +    dimensions_comment = forms.CharField(label=_("Dimensions comment"))      base_finds__topographic_localisation = forms.CharField(          label=_("Point of topographic reference"),      )      checked_type = forms.ChoiceField(label=_("Check")) -    check_date__after = forms.DateField( -        label=_("Check date after"), widget=DatePicker -    ) +    check_date__after = forms.DateField(label=_("Check date after"), widget=DatePicker)      check_date__before = forms.DateField(          label=_("Check date before"), widget=DatePicker      ) -    integrities = forms.ChoiceField(label=_("Integrity / interest"), -                                    choices=[]) -    remarkabilities = forms.ChoiceField(label=_("Remarkability"), -                                        choices=[]) -    conservatory_state = forms.ChoiceField(label=_("Conservatory state"), -                                           choices=[]) +    integrities = forms.ChoiceField(label=_("Integrity / interest"), choices=[]) +    remarkabilities = forms.ChoiceField(label=_("Remarkability"), choices=[]) +    conservatory_state = forms.ChoiceField(label=_("Conservatory state"), choices=[])      conservatory_comment = forms.CharField(label=_("Conservatory comment")) -    alterations = forms.ChoiceField( -        label=_("Alteration"), choices=[]) -    alteration_causes = forms.ChoiceField( -        label=_("Alteration cause"), choices=[]) +    alterations = forms.ChoiceField(label=_("Alteration"), choices=[]) +    alteration_causes = forms.ChoiceField(label=_("Alteration cause"), choices=[])      preservation_to_considers = forms.ChoiceField( -        choices=[], label=_("Recommended treatments")) -    treatment_emergency = forms.ChoiceField( -        choices=[], label=_("Treatment emergency") +        choices=[], label=_("Recommended treatments")      ) +    treatment_emergency = forms.ChoiceField(choices=[], label=_("Treatment emergency")) -    estimated_value__higher = FloatField( -        label=_("Estimated value - higher than")) -    estimated_value__lower = FloatField( -        label=_("Estimated value - lower than")) -    insurance_value__higher = FloatField( -        label=_("Insurance value - higher than")) -    insurance_value__lower = FloatField( -        label=_("Insurance value - lower than")) +    estimated_value__higher = FloatField(label=_("Estimated value - higher than")) +    estimated_value__lower = FloatField(label=_("Estimated value - lower than")) +    insurance_value__higher = FloatField(label=_("Insurance value - higher than")) +    insurance_value__lower = FloatField(label=_("Insurance value - lower than"))      appraisal_date__after = forms.DateField( -        label=_("Appraisal date after"), widget=DatePicker) +        label=_("Appraisal date after"), widget=DatePicker +    )      appraisal_date__before = forms.DateField( -        label=_("Appraisal date before"), widget=DatePicker) +        label=_("Appraisal date before"), widget=DatePicker +    )      loan = forms.NullBooleanField(label=_("Loan?"))      treatments_file_end_date = forms.DateField( @@ -1276,22 +1571,23 @@ class FindSelect(DocumentItemSelect, PeriodSelect):      )      TYPES = PeriodSelect.TYPES + [ -        FieldType('conservatory_state', models.ConservatoryState), -        FieldType('base_finds__batch', models.BatchType), -        FieldType('preservation_to_considers', models.TreatmentType), -        FieldType('integrities', models.IntegrityType), -        FieldType('remarkabilities', models.RemarkabilityType), -        FieldType('base_finds__context_record__town__areas', Area), -        FieldType('base_finds__context_record__operation__operation_type', -                  OperationType), -        FieldType('checked_type', models.CheckedType), -        FieldType('material_type_quality', models.MaterialTypeQualityType), -        FieldType('object_type_quality', models.ObjectTypeQualityType), -        FieldType('communicabilities', models.CommunicabilityType), -        FieldType('alterations', models.AlterationType), -        FieldType('alteration_causes', models.AlterationCauseType), -        FieldType('treatment_emergency', models.TreatmentEmergencyType), -        FieldType('cultural_attributions', CulturalAttributionType), +        FieldType("conservatory_state", models.ConservatoryState), +        FieldType("base_finds__batch", models.BatchType), +        FieldType("preservation_to_considers", models.TreatmentType), +        FieldType("integrities", models.IntegrityType), +        FieldType("remarkabilities", models.RemarkabilityType), +        FieldType("base_finds__context_record__town__areas", Area), +        FieldType( +            "base_finds__context_record__operation__operation_type", OperationType +        ), +        FieldType("checked_type", models.CheckedType), +        FieldType("material_type_quality", models.MaterialTypeQualityType), +        FieldType("object_type_quality", models.ObjectTypeQualityType), +        FieldType("communicabilities", models.CommunicabilityType), +        FieldType("alterations", models.AlterationType), +        FieldType("alteration_causes", models.AlterationCauseType), +        FieldType("treatment_emergency", models.TreatmentEmergencyType), +        FieldType("cultural_attributions", CulturalAttributionType),      ]      SITE_KEYS = {          "archaeological_sites": "attached-to-operation", @@ -1302,29 +1598,27 @@ class FindSelect(DocumentItemSelect, PeriodSelect):      def __init__(self, *args, **kwargs):          super(FindSelect, self).__init__(*args, **kwargs) -        if 'ope_relation_types' in self.fields: -            self.fields['ope_relation_types'].choices = \ -                OpeRelationType.get_types() -        if 'cr_relation_types' in self.fields: -            self.fields['cr_relation_types'].choices = CRRelationType.get_types( -                ) +        if "ope_relation_types" in self.fields: +            self.fields["ope_relation_types"].choices = OpeRelationType.get_types() +        if "cr_relation_types" in self.fields: +            self.fields["cr_relation_types"].choices = CRRelationType.get_types()          self._reorder_period_fields("cultural_attributions")      def get_input_ids(self):          ids = super(FindSelect, self).get_input_ids() -        if 'ope_relation_types' in ids: -            ids.pop(ids.index('ope_relation_types')) -            for idx, c in enumerate(self.fields['ope_relation_types'].choices): -                ids.append('ope_relation_types_{}'.format(idx)) -        if 'cr_relation_types' in ids: -            ids.pop(ids.index('cr_relation_types')) -            for idx, c in enumerate(self.fields['cr_relation_types'].choices): -                ids.append('cr_relation_types_{}'.format(idx)) +        if "ope_relation_types" in ids: +            ids.pop(ids.index("ope_relation_types")) +            for idx, c in enumerate(self.fields["ope_relation_types"].choices): +                ids.append("ope_relation_types_{}".format(idx)) +        if "cr_relation_types" in ids: +            ids.pop(ids.index("cr_relation_types")) +            for idx, c in enumerate(self.fields["cr_relation_types"].choices): +                ids.append("cr_relation_types_{}".format(idx))          return ids  class FindSelectWarehouseModule(FindSelect): -    #collection = forms.IntegerField( +    # collection = forms.IntegerField(      #    label=_("Collection (warehouse)"),      #    widget=widgets.JQueryAutoComplete(      #        reverse_lazy('autocomplete-warehouse'), @@ -1333,15 +1627,17 @@ class FindSelectWarehouseModule(FindSelect):      container_ref = forms.IntegerField(          label=_("Reference container"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-container'), -            associated_model=Container), -        validators=[valid_id(Container)]) +            reverse_lazy("autocomplete-container"), associated_model=Container +        ), +        validators=[valid_id(Container)], +    )      container_ref__location = forms.IntegerField(          label=_("Reference container - Warehouse (location)"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-warehouse'), -            associated_model=Warehouse), -        validators=[valid_id(Warehouse)]) +            reverse_lazy("autocomplete-warehouse"), associated_model=Warehouse +        ), +        validators=[valid_id(Warehouse)], +    )      """      container_ref__responsible = forms.IntegerField(          label=_("Reference container - Warehouse (responsible)"), @@ -1357,15 +1653,17 @@ class FindSelectWarehouseModule(FindSelect):      container = forms.IntegerField(          label=_("Current container"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-container'), -            associated_model=Container), -        validators=[valid_id(Container)]) +            reverse_lazy("autocomplete-container"), associated_model=Container +        ), +        validators=[valid_id(Container)], +    )      container__location = forms.IntegerField(          label=_("Current container - Warehouse (location)"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-warehouse'), -            associated_model=Warehouse), -        validators=[valid_id(Warehouse)]) +            reverse_lazy("autocomplete-warehouse"), associated_model=Warehouse +        ), +        validators=[valid_id(Warehouse)], +    )      """      container__responsible = forms.IntegerField(          label=_("Current container - Warehouse (responsible)"), @@ -1381,119 +1679,159 @@ class FindSelectWarehouseModule(FindSelect):  class FindFormSelection(LockForm, CustomFormSearch):      SEARCH_AND_SELECT = True      form_label = _("Find search") -    associated_models = {'pk': models.Find} -    currents = {'pk': models.Find} -    pk_key = 'pk' +    associated_models = {"pk": models.Find} +    currents = {"pk": models.Find} +    pk_key = "pk"      pk = forms.IntegerField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-find'), -            FindSelect, models.Find, -            gallery=True, map=True, -            source_full=reverse_lazy('get-find-full')), -        validators=[valid_id(models.Find)]) +            reverse_lazy("get-find"), +            FindSelect, +            models.Find, +            gallery=True, +            map=True, +            source_full=reverse_lazy("get-find-full"), +        ), +        validators=[valid_id(models.Find)], +    )  class FindFormMultiSelection(LockForm, MultiSearchForm):      form_label = _("Find search") -    associated_models = {'pks': models.Find} -    pk_key = 'pks' +    associated_models = {"pks": models.Find} +    pk_key = "pks"      pk = forms.CharField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-find'), -            FindSelect, models.Find, -            gallery=True, map=True, +            reverse_lazy("get-find"), +            FindSelect, +            models.Find, +            gallery=True, +            map=True,              multiple_select=True, -            source_full=reverse_lazy('get-find-full')), -        validators=[valid_ids(models.Find)]) +            source_full=reverse_lazy("get-find-full"), +        ), +        validators=[valid_ids(models.Find)], +    )  class FindFormSelectionWarehouseModule(FindFormSelection):      pk = forms.IntegerField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-find'), -            FindSelectWarehouseModule, models.Find, -            gallery=True, map=True, -            source_full=reverse_lazy('get-find-full')), -        validators=[valid_id(models.Find)]) +            reverse_lazy("get-find"), +            FindSelectWarehouseModule, +            models.Find, +            gallery=True, +            map=True, +            source_full=reverse_lazy("get-find-full"), +        ), +        validators=[valid_id(models.Find)], +    )  class FindFormMultiSelectionWarehouseModule(FindFormMultiSelection):      pk = forms.CharField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-find'), -            FindSelectWarehouseModule, models.Find, -            gallery=True, map=True, +            reverse_lazy("get-find"), +            FindSelectWarehouseModule, +            models.Find, +            gallery=True, +            map=True,              multiple_select=True, -            source_full=reverse_lazy('get-find-full')), -        validators=[valid_ids(models.Find)]) +            source_full=reverse_lazy("get-find-full"), +        ), +        validators=[valid_ids(models.Find)], +    )  class MultipleFindFormSelection(forms.Form):      # used for basket management      # TODO: could probably use FindFormMultiSelection      form_label = _("Find search") -    associated_models = {'pk': models.Find} -    currents = {'pk': models.Find} +    associated_models = {"pk": models.Find} +    currents = {"pk": models.Find}      pk = forms.IntegerField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-find'), -            FindSelect, models.Find, -            gallery=True, map=True, +            reverse_lazy("get-find"), +            FindSelect, +            models.Find, +            gallery=True, +            map=True,              multiple_select=True, -            source_full=reverse_lazy('get-find-full')), -        validators=[valid_id(models.Find)]) +            source_full=reverse_lazy("get-find-full"), +        ), +        validators=[valid_id(models.Find)], +    )  class MultipleFindFormSelectionWarehouseModule(MultipleFindFormSelection):      # used for basket management      # TODO: could probably use FindFormMultiSelectionWarehouse      pk = forms.IntegerField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-find'), -            FindSelectWarehouseModule, models.Find, -            gallery=True, map=True, +            reverse_lazy("get-find"), +            FindSelectWarehouseModule, +            models.Find, +            gallery=True, +            map=True,              multiple_select=True, -            source_full=reverse_lazy('get-find-full')), -        validators=[valid_id(models.Find)]) +            source_full=reverse_lazy("get-find-full"), +        ), +        validators=[valid_id(models.Find)], +    )  class FindMultipleFormSelection(forms.Form):      form_label = _("Upstream finds") -    associated_models = {'finds': models.Find} -    associated_labels = {'finds': _("Finds")} +    associated_models = {"finds": models.Find} +    associated_labels = {"finds": _("Finds")}      # using FindSelectWarehouseModule because this form is only used with      # the warehouse module activated      finds = forms.CharField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-find'), FindSelectWarehouseModule, models.Find, -            gallery=True, map=True, -            multiple=True, multiple_cols=[2, 3, 4]), -        validators=[valid_ids(models.Find)]) +            reverse_lazy("get-find"), +            FindSelectWarehouseModule, +            models.Find, +            gallery=True, +            map=True, +            multiple=True, +            multiple_cols=[2, 3, 4], +        ), +        validators=[valid_ids(models.Find)], +    )      def clean(self): -        if 'finds' not in self.cleaned_data or not self.cleaned_data['finds']: -            raise forms.ValidationError(_("You should at least select one " -                                          "archaeological find.")) +        if "finds" not in self.cleaned_data or not self.cleaned_data["finds"]: +            raise forms.ValidationError( +                _("You should at least select one " "archaeological find.") +            )          return self.cleaned_data  def check_form(wizard, form_name, key):      request = wizard.request      storage = wizard.storage -    if storage.prefix not in request.session or \ -            'step_data' not in request.session[storage.prefix] or \ -            form_name not in request.session[storage.prefix]['step_data'] or \ -                            form_name + '-' + key not in \ -            request.session[storage.prefix]['step_data'][form_name]: +    if ( +        storage.prefix not in request.session +        or "step_data" not in request.session[storage.prefix] +        or form_name not in request.session[storage.prefix]["step_data"] +        or form_name + "-" + key +        not in request.session[storage.prefix]["step_data"][form_name] +    ):          return False      return True @@ -1505,19 +1843,22 @@ def check_exist(form_name, key):          if not check_form(self, form_name, key):              return False          try: -            val = request.session[storage.prefix][ -                'step_data'][form_name][form_name + '-' + key] +            val = request.session[storage.prefix]["step_data"][form_name][ +                form_name + "-" + key +            ]              if val and len(val) > 0:                  val = val[0]              return bool(val)          except ValueError:              return False +      return func  def check_not_exist(form_name, key):      def func(self):          return not check_exist(form_name, key)(self) +      return func @@ -1528,13 +1869,15 @@ def check_value(form_name, key, value):          if not check_form(self, form_name, key):              return False          try: -            val = request.session[storage.prefix][ -                'step_data'][form_name][form_name + '-' + key] +            val = request.session[storage.prefix]["step_data"][form_name][ +                form_name + "-" + key +            ]              if val and len(val) > 0:                  val = val[0]              return str(val) == str(value)          except ValueError:              return False +      return func @@ -1545,25 +1888,30 @@ def check_type_field(form_name, key, model, field):          if not check_form(self, form_name, key):              return False          try: -            val = model.objects.get(pk=request.session[storage.prefix][ -                'step_data'][form_name][form_name + '-' + key][0]) +            val = model.objects.get( +                pk=request.session[storage.prefix]["step_data"][form_name][ +                    form_name + "-" + key +                ][0] +            )              return bool(getattr(val, field))          except (ValueError, model.DoesNotExist):              return False +      return func  def check_type_not_field(form_name, key, model, field):      def func(self):          return not check_type_field(form_name, key, model, field)(self) +      return func  def check_treatment(form_name, type_key, type_list=[], not_type_list=[]): -    type_list = [models.TreatmentType.objects.get(txt_idx=tpe).pk -                 for tpe in type_list] -    not_type_list = [models.TreatmentType.objects.get(txt_idx=tpe).pk -                     for tpe in not_type_list] +    type_list = [models.TreatmentType.objects.get(txt_idx=tpe).pk for tpe in type_list] +    not_type_list = [ +        models.TreatmentType.objects.get(txt_idx=tpe).pk for tpe in not_type_list +    ]      def func(self):          request = self.request @@ -1571,38 +1919,35 @@ def check_treatment(form_name, type_key, type_list=[], not_type_list=[]):          if not check_form(self, form_name, type_key):              return False          try: -            tpe = request.session[storage.prefix][ -                'step_data'][form_name][form_name + '-' + type_key] +            tpe = request.session[storage.prefix]["step_data"][form_name][ +                form_name + "-" + type_key +            ]              if not tpe:                  return False              type = int(tpe[0]) -            return (not type_list or type in type_list) \ -                and type not in not_type_list +            return (not type_list or type in type_list) and type not in not_type_list          except ValueError:              return False +      return func  class ResultFindForm(ManageOldType, forms.Form):      form_label = _("Resulting find") -    associated_models = {'material_type': models.MaterialType} +    associated_models = {"material_type": models.MaterialType}      label = forms.CharField( -        label=_("Free ID"), -        validators=[validators.MaxLengthValidator(60)]) -    description = forms.CharField(label=_("Precise description"), -                                  widget=forms.Textarea) +        label=_("Free ID"), validators=[validators.MaxLengthValidator(60)] +    ) +    description = forms.CharField(label=_("Precise description"), widget=forms.Textarea)      material_type = forms.ChoiceField(label=_("Material type"), choices=[])      volume = forms.IntegerField(label=_("Volume (l)"))      weight = forms.IntegerField(label=_("Weight (g)"))      find_number = forms.IntegerField(label=_("Find number")) -    TYPES = [ -        FieldType('material_type', models.MaterialType) -    ] +    TYPES = [FieldType("material_type", models.MaterialType)] -ResultFindFormSet = formset_factory(ResultFindForm, can_delete=True, -                                    formset=FormSet) +ResultFindFormSet = formset_factory(ResultFindForm, can_delete=True, formset=FormSet)  ResultFindFormSet.form_label = _("Resulting finds") @@ -1614,30 +1959,38 @@ class FindDeletionForm(FinalForm):  class UpstreamFindFormSelection(MultiSearchForm, FindFormSelection):      form_label = _("Upstream finds")      current_model = models.Find -    pk_key = 'resulting_pk' +    pk_key = "resulting_pk"      associated_models = {"resulting_pk": models.Find}      pk = forms.CharField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-find'), -            FindSelect, current_model, +            reverse_lazy("get-find"), +            FindSelect, +            current_model,              gallery=True,              multiple_select=True, -            source_full=reverse_lazy('get-find-full')), -        validators=[valid_ids(current_model)]) +            source_full=reverse_lazy("get-find-full"), +        ), +        validators=[valid_ids(current_model)], +    )  class SingleUpstreamFindFormSelection(UpstreamFindFormSelection):      current_model = models.Find      pk = forms.CharField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-find'), -            FindSelect, current_model, +            reverse_lazy("get-find"), +            FindSelect, +            current_model,              gallery=True, -            source_full=reverse_lazy('get-find-full')), -        validators=[valid_ids(current_model)]) +            source_full=reverse_lazy("get-find-full"), +        ), +        validators=[valid_ids(current_model)], +    )  class FindBasketSelect(CustomForm, TableSelect): @@ -1646,9 +1999,9 @@ class FindBasketSelect(CustomForm, TableSelect):      form_admin_name = _("Find basket - 001 - Search")      form_slug = "findbasket-001-search"      search_vector = forms.CharField( -        label=_("Full text search"), widget=widgets.SearchWidget( -            'archaeological-finds', 'findbasket' -        )) +        label=_("Full text search"), +        widget=widgets.SearchWidget("archaeological-finds", "findbasket"), +    )      label = forms.CharField(label=_("Denomination")) @@ -1656,53 +2009,61 @@ class FindBasketSelect(CustomForm, TableSelect):  class FindBasketFormSelection(CustomFormSearch):      SEARCH_AND_SELECT = True      form_label = _("Basket search") -    associated_models = {'pk': models.FindBasket} -    currents = {'pk': models.FindBasket} +    associated_models = {"pk": models.FindBasket} +    currents = {"pk": models.FindBasket}      pk = forms.IntegerField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-findbasket'), -            FindBasketSelect, models.FindBasket, +            reverse_lazy("get-findbasket"), +            FindBasketSelect, +            models.FindBasket,          ), -        validators=[valid_id(models.FindBasket)]) +        validators=[valid_id(models.FindBasket)], +    )  class FindBasketForWriteFormSelection(CustomFormSearch):      SEARCH_AND_SELECT = True      form_label = _("Basket search") -    associated_models = {'pk': models.FindBasket} -    currents = {'pk': models.FindBasket} +    associated_models = {"pk": models.FindBasket} +    currents = {"pk": models.FindBasket}      pk = forms.IntegerField( -        label="", required=False, +        label="", +        required=False,          widget=widgets.DataTable( -            reverse_lazy('get-findbasket-write'), -            FindBasketSelect, models.FindBasket, +            reverse_lazy("get-findbasket-write"), +            FindBasketSelect, +            models.FindBasket,          ), -        validators=[valid_id(models.FindBasket)]) +        validators=[valid_id(models.FindBasket)], +    )  class FindBasketForm(IshtarForm):      form_label = _("Find basket") -    associated_models = {"shared_with": IshtarUser, -                         "shared_write_with": IshtarUser} +    associated_models = {"shared_with": IshtarUser, "shared_write_with": IshtarUser}      label = forms.CharField( -        label=_("Label"), -        validators=[validators.MaxLengthValidator(1000)]) +        label=_("Label"), validators=[validators.MaxLengthValidator(1000)] +    )      slug = forms.SlugField(label=_("Slug"), required=False)      public = forms.BooleanField(label=_("Is public"), required=False) -    comment = forms.CharField(label=_("Comment"), -                              widget=forms.Textarea, required=False) +    comment = forms.CharField(label=_("Comment"), widget=forms.Textarea, required=False)      shared_with = widgets.Select2MultipleField( -        model=IshtarUser, remote=True, +        model=IshtarUser, +        remote=True,          label=_("Shared (read) with"), -        required=False, long_widget=True +        required=False, +        long_widget=True,      )      shared_write_with = widgets.Select2MultipleField( -        model=IshtarUser, remote=True, +        model=IshtarUser, +        remote=True,          label=_("Shared (read/edit) with"), -        required=False, long_widget=True +        required=False, +        long_widget=True,      )      def __init__(self, *args, **kwargs): @@ -1719,33 +2080,47 @@ class FindBasketForm(IshtarForm):              self.fields.pop("public")      def clean(self): -        slug = self.cleaned_data.get('slug', None) -        if slug and slug.strip() and models.FindBasket.objects.filter( -                slug=slug.strip()).exclude(pk=self.basket_pk).count(): -            raise forms.ValidationError(_("A basket with this slug already " -                                          "exists.")) +        slug = self.cleaned_data.get("slug", None) +        if ( +            slug +            and slug.strip() +            and models.FindBasket.objects.filter(slug=slug.strip()) +            .exclude(pk=self.basket_pk) +            .count() +        ): +            raise forms.ValidationError(_("A basket with this slug already " "exists."))          return self.cleaned_data  class NewFindBasketForm(forms.ModelForm, IshtarForm):      shared_with = widgets.Select2MultipleField( -        model=IshtarUser, remote=True, +        model=IshtarUser, +        remote=True,          label=_("Shared (read) with"), -        required=False, long_widget=True +        required=False, +        long_widget=True,      )      shared_write_with = widgets.Select2MultipleField( -        model=IshtarUser, remote=True, +        model=IshtarUser, +        remote=True,          label=_("Shared (read/edit) with"), -        required=False, long_widget=True +        required=False, +        long_widget=True,      )      class Meta:          model = models.FindBasket -        fields = ('label', 'slug', 'public', 'comment', 'shared_with', -                  'shared_write_with') +        fields = ( +            "label", +            "slug", +            "public", +            "comment", +            "shared_with", +            "shared_write_with", +        )      def __init__(self, *args, **kwargs): -        self.user = kwargs.pop('user') +        self.user = kwargs.pop("user")          self.is_admin = False          if getattr(self.user, "user_ptr", None):              self.is_admin = getattr(self.user.user_ptr, "is_superuser", None) @@ -1755,16 +2130,20 @@ class NewFindBasketForm(forms.ModelForm, IshtarForm):              self.fields.pop("public")      def clean(self): -        q = models.FindBasket.objects.filter(user=self.user, -                                             label=self.cleaned_data['label']) +        q = models.FindBasket.objects.filter( +            user=self.user, label=self.cleaned_data["label"] +        )          if q.count(): -            raise forms.ValidationError(_("Another basket already exists with " -                                          "this name.")) -        slug = self.cleaned_data.get('slug', None) -        if slug and slug.strip() and models.FindBasket.objects.filter( -                slug=slug.strip()).count(): -            raise forms.ValidationError(_("A basket with this slug already " -                                          "exists.")) +            raise forms.ValidationError( +                _("Another basket already exists with " "this name.") +            ) +        slug = self.cleaned_data.get("slug", None) +        if ( +            slug +            and slug.strip() +            and models.FindBasket.objects.filter(slug=slug.strip()).count() +        ): +            raise forms.ValidationError(_("A basket with this slug already " "exists."))          return self.cleaned_data      def save(self, commit=True): @@ -1774,42 +2153,45 @@ class NewFindBasketForm(forms.ModelForm, IshtarForm):  class SelectFindBasketForm(IshtarForm):      form_label = _("Basket") -    associated_models = {'basket': models.FindBasket} +    associated_models = {"basket": models.FindBasket}      need_user_for_initialization = True      basket = forms.IntegerField(          label=_("Basket"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-findbasket'), -            associated_model=models.FindBasket), -        validators=[valid_id(models.FindBasket)]) +            reverse_lazy("autocomplete-findbasket"), associated_model=models.FindBasket +        ), +        validators=[valid_id(models.FindBasket)], +    )      def __init__(self, *args, **kwargs):          self.user = None -        if 'user' in kwargs: -            self.user = kwargs.pop('user') -            if hasattr(self.user, 'ishtaruser'): +        if "user" in kwargs: +            self.user = kwargs.pop("user") +            if hasattr(self.user, "ishtaruser"):                  self.user = self.user.ishtaruser          super(SelectFindBasketForm, self).__init__(*args, **kwargs)  class SelectFindBasketWriteForm(IshtarForm):      form_label = _("Basket") -    associated_models = {'basket': models.FindBasket} +    associated_models = {"basket": models.FindBasket}      need_user_for_initialization = True      basket = forms.IntegerField(          label=_("Basket"),          widget=widgets.JQueryAutoComplete( -            reverse_lazy('autocomplete-findbasket-write'), -            associated_model=models.FindBasket), -        validators=[valid_id(models.FindBasket)]) +            reverse_lazy("autocomplete-findbasket-write"), +            associated_model=models.FindBasket, +        ), +        validators=[valid_id(models.FindBasket)], +    )      def __init__(self, *args, **kwargs):          self.user = None -        if 'user' in kwargs: -            self.user = kwargs.pop('user') -            if hasattr(self.user, 'ishtaruser'): +        if "user" in kwargs: +            self.user = kwargs.pop("user") +            if hasattr(self.user, "ishtaruser"):                  self.user = self.user.ishtaruser          super(SelectFindBasketWriteForm, self).__init__(*args, **kwargs) @@ -1820,20 +2202,23 @@ class FindBasketAddItemForm(forms.Form):      def save(self, user):          try: -            basket = models.FindBasket.objects.filter( -                Q(user=user) | Q(shared_with=user) | Q(shared_write_with=user) -            ).distinct().get(pk=self.cleaned_data['basket_id']) -            item = models.Find.objects.get( -                pk=self.cleaned_data['item_id']) -        except models.FindBasket.DoesNotExist or\ -                models.Find.DoesNotExist: +            basket = ( +                models.FindBasket.objects.filter( +                    Q(user=user) | Q(shared_with=user) | Q(shared_write_with=user) +                ) +                .distinct() +                .get(pk=self.cleaned_data["basket_id"]) +            ) +            item = models.Find.objects.get(pk=self.cleaned_data["item_id"]) +        except models.FindBasket.DoesNotExist or models.Find.DoesNotExist:              # something strange... TODO: log it              raise PermissionDenied          # check rights -        if not user.user_ptr.is_superuser and \ -                not user.has_right('view_find') and \ -                not (user.has_right('view_own_find') -                     and item.is_own(user)): +        if ( +            not user.user_ptr.is_superuser +            and not user.has_right("view_find") +            and not (user.has_right("view_own_find") and item.is_own(user)) +        ):              raise PermissionDenied          basket.items.add(item)          return basket diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index b909720eb..aded3d3f0 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -1843,8 +1843,10 @@ class Find(          null=True,      )      functional_areas = models.ManyToManyField( -        FunctionalArea, verbose_name=_("Functional area"), related_name="find", -        blank=True +        FunctionalArea, +        verbose_name=_("Functional area"), +        related_name="find", +        blank=True,      )      integrities = models.ManyToManyField(          IntegrityType, diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index 1c42c28ba..d198d93ee 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -1281,8 +1281,7 @@ class FindSearchTest(FindInit, TestCase, SearchText):      def test_operator_search(self):          operation = self.operations[0]          operator = Organization.objects.create( -            name="My Orga", -            organization_type=OrganizationType.objects.all()[0] +            name="My Orga", organization_type=OrganizationType.objects.all()[0]          )          operation.operator = operator          operation.save() @@ -1291,12 +1290,9 @@ class FindSearchTest(FindInit, TestCase, SearchText):          c.login(username=self.username, password=self.password)          key = str(pgettext_lazy("key for text search", "operator")) -        result = [ -            ('{}="{}"'.format(key, "My Orga"), 1) -        ] +        result = [('{}="{}"'.format(key, "My Orga"), 1)]          self._test_search(c, result, context="Text operator search") -      def test_common_name_operation_search(self):          operation = self.operations[0]          operation.common_name = "Operation Common Name" @@ -1306,12 +1302,9 @@ class FindSearchTest(FindInit, TestCase, SearchText):          c.login(username=self.username, password=self.password)          key = str(pgettext_lazy("key for text search", "operation-name")) -        result = [ -            ('{}="{}"'.format(key, "Operation Common Name"), 1) -        ] +        result = [('{}="{}"'.format(key, "Operation Common Name"), 1)]          self._test_search(c, result, context="Text Operation Common Name Search") -      def test_address_operation_search(self):          operation = self.operations[0]          operation.address = "Street somewhere 29478 NOWHERE" @@ -1321,30 +1314,21 @@ class FindSearchTest(FindInit, TestCase, SearchText):          c.login(username=self.username, password=self.password)          key = str(pgettext_lazy("key for text search", "operation-address")) -        result = [ -            ('{}="{}"'.format(key, "Street somewhere 29478 NOWHERE"), 1) -        ] +        result = [('{}="{}"'.format(key, "Street somewhere 29478 NOWHERE"), 1)]          self._test_search(c, result, context="Text Operation Address Search") -      def test_person_in_charge_search(self):          operation = self.operations[0] -        operation.in_charge = Person.objects.create( -            name="HISNAME", -            surname="Michel" -        ) +        operation.in_charge = Person.objects.create(name="HISNAME", surname="Michel")          operation.save()          c = Client()          c.login(username=self.username, password=self.password)          key = str(pgettext_lazy("key for text search", "in-charge")) -        result = [ -            ('{}="{}"'.format(key, "HISNAME Michel"), 1) -        ] +        result = [('{}="{}"'.format(key, "HISNAME Michel"), 1)]          self._test_search(c, result, context="Text Person In Charge Search") -      def test_conservatory_state_hierarchic_search(self):          find = self.finds[0]          c = Client() @@ -2623,7 +2607,6 @@ class GeomaticTest(FindInit, TestCase):              self.assertEqual(dic["get_pts"], json.loads(response.content)) -  class AutocompleteTest(AutocompleteTestBase, TestCase):      fixtures = FIND_FIXTURES      models = [  | 
