diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-02-09 18:22:04 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-04-16 16:41:50 +0200 |
commit | f6b2cf2702b405b77bf2642281cb38f5610409c4 (patch) | |
tree | 9334141185a75a457decbb8a831030fd3b0c33ce | |
parent | a6e806ddd867ef953715c5beed8015006f8a14c5 (diff) | |
download | Ishtar-f6b2cf2702b405b77bf2642281cb38f5610409c4.tar.bz2 Ishtar-f6b2cf2702b405b77bf2642281cb38f5610409c4.zip |
✨ museum fields: forms
-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}", |