diff options
| -rw-r--r-- | archaeological_finds/forms.py | 191 | ||||
| -rw-r--r-- | archaeological_finds/migrations/0115_auto_20240209_1745.py (renamed from archaeological_finds/migrations/0115_auto_20240208_1636.py) | 11 | ||||
| -rw-r--r-- | archaeological_finds/models_finds.py | 10 | ||||
| -rw-r--r-- | ishtar_common/admin.py | 1 | ||||
| -rw-r--r-- | ishtar_common/migrations/0236_auto_20240209_1558.py (renamed from ishtar_common/migrations/0236_auto_20240208_1635.py) | 14 | ||||
| -rw-r--r-- | ishtar_common/models.py | 8 | 
6 files changed, 209 insertions, 26 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 381541614..27c306e30 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -94,17 +94,16 @@ 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, +    get_current_profile,      IshtarUser, +    OperationType, +    Organization,      Person,      person_type_pks_lazy, +    valid_id, +    valid_ids,  ) -from ishtar_common.utils import convert_coordinates_to_point  __all__ = [      "TreatmentSelect", @@ -230,16 +229,46 @@ class BasicFindForm(CustomForm, ManageOldType):          "material_type_quality": models.MaterialTypeQualityType,          "object_type_quality": models.ObjectTypeQualityType,          "checked_type": models.CheckedType, +        "museum_collection_entry_mode": models.CollectionEntryModeType, +        "museum_inventory_marking_presence": models.InventoryMarkingPresence, +        "museum_marking_type": models.MarkingType, +        "museum_collection": models.MuseumCollection, +        "museum_inventory_conformity": models.InventoryConformity, +        "museum_original_repro": models.OriginalReproduction,          #'collection': Warehouse,      }      field_order = [ +        "museum_id_prefix", +        "museum_id", +        "museum_id_suffix",          "label",          "denomination", +        "museum_id_comment",          "previous_id", -        "museum_id",          "laboratory_id",          "seal_number",          "mark", +        "museum_inventory_marking_presence", +        "museum_marking_type", +        "museum_marking_comment", +        "museum_owner_institution", +        "museum_custodian_institution", +        "museum_depositor_inventory_number", +        "museum_collection_entry_mode", +        "museum_entry_mode_comment", +        "museum_entry_date", +        "museum_entry_date_end", +        "museum_entry_date_comment", +        "museum_donor", +        "museum_collection", +        "museum_former_collection", +        "museum_inventory_entry_year", +        "museum_inventory_conformity", +        "museum_non_conformity_comment", +        "museum_inventory_transcript", +        "museum_original_repro", +        "museum_allocation_date", +        "museum_purchase_price",          "description",          "public_description",          "is_complete", @@ -276,26 +305,110 @@ class BasicFindForm(CustomForm, ManageOldType):          "checked_type",          "check_date",      ] +    PROFILE_FILTER = { +        "museum": [ +            "museum_id_prefix", +            "museum_id", +            "museum_id_suffix", +            "museum_id_comment", +            "museum_owner_institution", +            "museum_custodian_institution", +            "museum_depositor_inventory_number", +            "museum_collection_entry_mode", +            "museum_entry_mode_comment", +            "museum_entry_date", +            "museum_entry_date_end", +            "museum_entry_date_comment", +            "museum_donor", +            "museum_inventory_marking_presence", +            "museum_marking_type", +            "museum_marking_comment", +            "museum_collection", +            "museum_former_collection", +            "museum_inventory_entry_year", +            "museum_inventory_conformity", +            "museum_non_conformity_comment", +            "museum_inventory_transcript", +            "museum_original_repro", +            "museum_allocation_date", +            "museum_purchase_price", +        ], +    }      HEADERS = {} -    HEADERS["label"] = FormHeader(_("Identification")) - +    HEADERS["museum_id_prefix"] = FormHeader(_("Museum identification"))      label = forms.CharField(          label=_("Free ID"), validators=[validators.MaxLengthValidator(60)]      ) +    museum_id_prefix = forms.CharField(label=_("Museum ID prefix"), required=False) +    museum_id = forms.CharField(label=_("Museum ID"), required=False) +    museum_id_suffix = forms.CharField(label=_("Museum ID suffix"), required=False) +    museum_id_comment = forms.CharField(label=_("Comment on museum ID"), widget=forms.Textarea, required=False) +    HEADERS["label"] = FormHeader(_("Identification"))      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) +    museum_inventory_marking_presence = widgets.Select2MultipleField( +        label=_("Presence of inventory marking"), required=False +    ) +    museum_marking_type = widgets.Select2MultipleField( +        label=_("Type of marking"), required=False +    ) +    museum_marking_comment = forms.CharField( +        label=_("Comment on marking"), widget=forms.Textarea, required=False +    )      # 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["museum_owner_institution"] = FormHeader(_("Museum")) +    museum_owner_institution = widgets.ModelJQueryAutocompleteField( +        model=Organization, label=_("Owner institution"), new=True, required=False +    ) +    museum_custodian_institution = widgets.ModelJQueryAutocompleteField( +        model=Organization, label=_("Custodian institution"), new=True, required=False +    ) +    museum_depositor_inventory_number = forms.CharField(label=_("Depositor inventory number"), required=False) +    museum_collection_entry_mode = forms.ChoiceField( +        label=_("Collections entry mode"), required=False, choices=[] +    ) +    museum_entry_mode_comment = forms.CharField(label=_("Comment on museum entry mode"), widget=forms.Textarea, required=False) +    museum_entry_date = forms.DateField( +        label=_("Museum entry date (exact or start)"), widget=DatePicker, required=False +    ) +    museum_entry_date_end = forms.DateField( +        label=_("Museum entry date (end)"), widget=DatePicker, required=False +    ) +    museum_entry_date_comment = forms.CharField(label=_("Comment on museum entry date"), required=False) +    #museum_donor = +    museum_collection = forms.ChoiceField( +        label=_("Collection"), required=False, choices=[] +    ) +    # museum_former_collection = +    museum_inventory_entry_year = forms.IntegerField( +        label=_("Inventory entry year"), required=False, min_value=0, max_value=2100 +    ) +    museum_inventory_conformity = forms.ChoiceField( +        label=_("Conformity with inventory"), required=False, choices=[] +    ) +    museum_non_conformity_comment = forms.CharField( +        label=_("Comment of non-conformity"), widget=forms.Textarea, required=False +    ) +    museum_original_repro = forms.ChoiceField( +        label=_("Original/reproduction"), required=False, choices=[] +    ) +    museum_allocation_date = forms.DateField( +        label=_("Date of museum allocation"), widget=DatePicker, required=False +    ) +    museum_purchase_price = forms.CharField(label=_("Purchase price"), required=False) -    HEADERS["description"] = FormHeader(_("Description")) +    HEADERS["museum_inventory_transcript"] = FormHeader(_("Description")) +    museum_inventory_transcript = forms.CharField( +        label=_("Inventory transcript"), widget=forms.Textarea, required=False +    )      description = forms.CharField(          label=_("Description"), widget=forms.Textarea, required=False      ) @@ -431,6 +544,12 @@ class BasicFindForm(CustomForm, ManageOldType):          FieldType("technical_processe", models.TechnicalProcessType, is_multiple=True),          FieldType("communicabilitie", models.CommunicabilityType, is_multiple=True),          FieldType("checked_type", models.CheckedType, is_multiple=True), +        FieldType("museum_collection_entry_mode", models.CollectionEntryModeType), +        FieldType("museum_inventory_marking_presence", models.InventoryMarkingPresence, is_multiple=True), +        FieldType("museum_marking_type", models.MarkingType, is_multiple=True), +        FieldType("museum_collection", models.MuseumCollection), +        FieldType("museum_inventory_conformity", models.InventoryConformity), +        FieldType("museum_original_repro", models.OriginalReproduction),      ]      def __init__(self, *args, **kwargs): @@ -439,6 +558,17 @@ class BasicFindForm(CustomForm, ManageOldType):          if not context_record or not context_record.operation.operation_type.judiciary:              self._remove_fields(("seal_number",)) +    def get_headers(self): +        if self._headers: +            return self._headers +        self._headers = self.HEADERS.copy() +        profile = get_current_profile() +        if not profile.museum: +            if "museum_inventory_transcript" in self._headers: +                self._headers.pop("museum_inventory_transcript") +            self._headers["description"] = FormHeader(_("Description")) +        return self._headers +      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) @@ -467,14 +597,38 @@ class FindForm(BasicFindForm):          }      )      field_order = [ +        "museum_id_prefix", +        "museum_id", +        "museum_id_suffix", +        "museum_id_comment",          "label",          "denomination",          "previous_id",          "get_first_base_find__excavation_id", -        "museum_id",          "laboratory_id",          "seal_number",          "mark", +        "museum_inventory_marking_presence", +        "museum_marking_type", +        "museum_marking_comment", +        "museum_owner_institution", +        "museum_custodian_institution", +        "museum_depositor_inventory_number", +        "museum_collection_entry_mode", +        "museum_entry_mode_comment", +        "museum_entry_date", +        "museum_entry_date_end", +        "museum_entry_date_comment", +        "museum_donor", +        "museum_collection", +        "museum_former_collection", +        "museum_inventory_entry_year", +        "museum_inventory_conformity", +        "museum_non_conformity_comment", +        "museum_original_repro", +        "museum_allocation_date", +        "museum_purchase_price", +        "museum_inventory_transcript",          "description",          "public_description",          "get_first_base_find__discovery_date", @@ -753,7 +907,9 @@ class QAFindFormMulti(QAForm):          "qa_label",          "qa_previous_id",          "qa_get_first_base_find__excavation_id", +        "qa_museum_id_prefix",          "qa_museum_id", +        "qa_museum_id_suffix",          "qa_laboratory_id",          "qa_seal_number",          "qa_mark", @@ -777,7 +933,9 @@ class QAFindFormMulti(QAForm):      qa_get_first_base_find__excavation_id = forms.CharField(          label=_("Excavation ID"), required=False      ) +    qa_museum_id_prefix = forms.CharField(label=_("Museum ID prefix"), required=False)      qa_museum_id = forms.CharField(label=_("Museum inventory number"), required=False) +    qa_museum_id_suffix = forms.CharField(label=_("Museum ID suffix"), 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) @@ -1294,6 +1452,12 @@ class FindSelect(GeoItemSelect, PeriodSelect):              ),          ),      ] +    PROFILE_FILTER = { +        "museum": [ +            "museum_id", +            "cache_complete_museum_id", +        ], +    }      search_vector = forms.CharField(          label=_("Full text search"), @@ -1301,10 +1465,11 @@ class FindSelect(GeoItemSelect, PeriodSelect):      )      label = forms.CharField(label=_("Free ID"))      denomination = forms.CharField(label=_("Denomination")) +    museum_id = forms.CharField(label=_("Museum ID")) +    cache_complete_museum_id = forms.CharField(label=_("Complete museum ID"))      previous_id = forms.CharField(label=_("Previous ID"))      base_finds__excavation_id = forms.CharField(label=_("Excavation ID"))      seal_number = forms.CharField(label=_("Seal number")) -    museum_id = forms.CharField(label=_("Museum inventory number"))      laboratory_id = forms.CharField(label=_("Laboratory ID"))      mark = forms.CharField(label=_("Mark")) diff --git a/archaeological_finds/migrations/0115_auto_20240208_1636.py b/archaeological_finds/migrations/0115_auto_20240209_1745.py index 3c39093a6..4bb67727b 100644 --- a/archaeological_finds/migrations/0115_auto_20240208_1636.py +++ b/archaeological_finds/migrations/0115_auto_20240209_1745.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.24 on 2024-02-08 16:36 +# Generated by Django 2.2.24 on 2024-02-09 17:45  import django.core.validators  from django.db import migrations, models @@ -10,7 +10,7 @@ import re  class Migration(migrations.Migration):      dependencies = [ -        ('ishtar_common', '0236_auto_20240208_1635'), +        ('ishtar_common', '0236_auto_20240209_1558'),          ('archaeological_finds', '0114_auto_20231115_1617'),      ] @@ -148,7 +148,7 @@ class Migration(migrations.Migration):          migrations.AddField(              model_name='find',              name='museum_former_collection', -            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.BiographicalNote', verbose_name='Former collection'), +            field=models.ManyToManyField(blank=True, related_name='finds_former_collections', to='ishtar_common.BiographicalNote', verbose_name='Former collection'),          ),          migrations.AddField(              model_name='find', @@ -247,11 +247,6 @@ class Migration(migrations.Migration):          ),          migrations.AddField(              model_name='historicalfind', -            name='museum_former_collection', -            field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.BiographicalNote', verbose_name='Former collection'), -        ), -        migrations.AddField( -            model_name='historicalfind',              name='museum_id_comment',              field=models.TextField(blank=True, default='', verbose_name='Comment on museum ID'),          ), diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 371b5b64c..32003a9c2 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -1413,6 +1413,9 @@ class Find(          "museum_id": SearchAltName(              pgettext_lazy("key for text search", "museum-id"), "museum_id__iexact"          ), +        "cache_complete_museum_id": SearchAltName( +            pgettext_lazy("key for text search", "complete-museum-id"), "cache_complete_museum_id__iexact" +        ),          "laboratory_id": SearchAltName(              pgettext_lazy("key for text search", "laboratory-id"),              "laboratory_id__iexact", @@ -2046,8 +2049,9 @@ class Find(          related_name='current_collection_of',          verbose_name=_("Collection"),      ) -    museum_former_collection = models.ForeignKey( -        BiographicalNote, blank=True, null=True, on_delete=models.SET_NULL, +    museum_former_collection = models.ManyToManyField( +        BiographicalNote, blank=True, +        related_name="finds_former_collections",          verbose_name=_("Former collection"),      )      museum_inventory_entry_year = models.PositiveIntegerField( @@ -2812,7 +2816,7 @@ class Find(          return self.cache_complete_museum_id      def _generate_cache_complete_museum_id(self): -        return get_generated_id("find_complete_museum_id", self) or "" +        return get_generated_id("museum_complete_identifier", self) or ""      def _generate_cached_periods(self):          return " & ".join([dating.period.label for dating in self.datings.all()]) diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index e5cb1b67b..7cd336ebf 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -623,6 +623,7 @@ class IshtarSiteProfileAdmin(admin.ModelAdmin):                  "find_index",                  "find_custom_index",                  "find_cached_label", +                "museum_complete_identifier",                  "container_external_id",                  "container_complete_identifier",                  "container_custom_index", diff --git a/ishtar_common/migrations/0236_auto_20240208_1635.py b/ishtar_common/migrations/0236_auto_20240209_1558.py index 48b1060d6..6fd6014fe 100644 --- a/ishtar_common/migrations/0236_auto_20240208_1635.py +++ b/ishtar_common/migrations/0236_auto_20240209_1558.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.24 on 2024-02-08 16:35 +# Generated by Django 2.2.24 on 2024-02-09 15:58  import django.core.validators  from django.db import migrations, models @@ -27,7 +27,7 @@ class Migration(migrations.Migration):              options={                  'verbose_name': 'Shooting angle',                  'verbose_name_plural': 'Shooting angles', -                'ordering': ('label',), +                'ordering': ('order', 'label'),              },              bases=(ishtar_common.models_common.Cached, models.Model),          ), @@ -61,6 +61,16 @@ class Migration(migrations.Migration):              field=models.TextField(blank=True, default='', verbose_name='Museofile id'),          ),          migrations.AddField( +            model_name='ishtarsiteprofile', +            name='museum', +            field=models.BooleanField(default=False, help_text='Need finds module', verbose_name='Museum module'), +        ), +        migrations.AddField( +            model_name='ishtarsiteprofile', +            name='museum_complete_identifier', +            field=models.TextField(default='{{museum_id_prefix}}.{{museum_id}}.{{museum_id_suffix}}', help_text='Formula to manage cached label. If not set a default formula is used.', verbose_name='Find - Complete museum ID'), +        ), +        migrations.AddField(              model_name='licensetype',              name='order',              field=models.IntegerField(default=10, verbose_name='Order'), diff --git a/ishtar_common/models.py b/ishtar_common/models.py index ebba1c034..5858fdb78 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1130,6 +1130,7 @@ class IshtarSiteProfile(models.Model, Cached):      )      preservation = models.BooleanField(_("Preservation module"), default=False)      mapping = models.BooleanField(_("Mapping module"), default=False) +    museum = models.BooleanField(_("Museum module"), default=False, help_text=_("Need finds module"))      point_precision = models.IntegerField(          _("Point precision (search and sheets)"),          null=True, @@ -1382,6 +1383,13 @@ class IshtarSiteProfile(models.Model, Cached):              "Formula to manage cached label. If not set a default formula is used."          ),      ) +    museum_complete_identifier = models.TextField( +        _("Find - Complete museum ID"), +        default="{{museum_id_prefix}}.{{museum_id}}.{{museum_id_suffix}}", +        help_text=_( +            "Formula to manage cached label. If not set a default formula is used." +        ), +    )      container_external_id = models.TextField(          _("Container external id"),          default="{parent_external_id}-{container_type__txt_idx}-" "{reference}",  | 
