From cca4d80f6aaeaf056f6d63b5a369c3cc38a69978 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 9 Feb 2024 18:22:04 +0100 Subject: ✨ museum fields: forms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- archaeological_finds/forms.py | 191 ++++++++- .../migrations/0115_auto_20240208_1636.py | 432 --------------------- .../migrations/0115_auto_20240209_1745.py | 427 ++++++++++++++++++++ archaeological_finds/models_finds.py | 10 +- ishtar_common/admin.py | 1 + .../migrations/0236_auto_20240208_1635.py | 112 ------ .../migrations/0236_auto_20240209_1558.py | 122 ++++++ ishtar_common/models.py | 8 + 8 files changed, 743 insertions(+), 560 deletions(-) delete mode 100644 archaeological_finds/migrations/0115_auto_20240208_1636.py create mode 100644 archaeological_finds/migrations/0115_auto_20240209_1745.py delete mode 100644 ishtar_common/migrations/0236_auto_20240208_1635.py create mode 100644 ishtar_common/migrations/0236_auto_20240209_1558.py 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_20240208_1636.py deleted file mode 100644 index 3c39093a6..000000000 --- a/archaeological_finds/migrations/0115_auto_20240208_1636.py +++ /dev/null @@ -1,432 +0,0 @@ -# Generated by Django 2.2.24 on 2024-02-08 16:36 - -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion -import ishtar_common.models_common -import re - - -class Migration(migrations.Migration): - - dependencies = [ - ('ishtar_common', '0236_auto_20240208_1635'), - ('archaeological_finds', '0114_auto_20231115_1617'), - ] - - operations = [ - migrations.CreateModel( - name='InventoryConformity', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.TextField(verbose_name='Label')), - ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), - ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('available', models.BooleanField(default=True, verbose_name='Available')), - ('order', models.IntegerField(default=10, verbose_name='Order')), - ], - options={ - 'verbose_name': 'Inventory conformity type', - 'verbose_name_plural': 'Inventory conformity types', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='InventoryMarkingPresence', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.TextField(verbose_name='Label')), - ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), - ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('available', models.BooleanField(default=True, verbose_name='Available')), - ('order', models.IntegerField(default=10, verbose_name='Order')), - ], - options={ - 'verbose_name': 'Presence of inventory marking type', - 'verbose_name_plural': 'Presence of inventory marking types', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='MarkingType', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.TextField(verbose_name='Label')), - ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), - ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('available', models.BooleanField(default=True, verbose_name='Available')), - ('order', models.IntegerField(default=10, verbose_name='Order')), - ], - options={ - 'verbose_name': 'Marking type', - 'verbose_name_plural': 'Marking types', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='MuseumCollection', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.TextField(verbose_name='Label')), - ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), - ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('available', models.BooleanField(default=True, verbose_name='Available')), - ('order', models.IntegerField(default=10, verbose_name='Order')), - ], - options={ - 'verbose_name': 'Museum collection', - 'verbose_name_plural': 'Museum collections', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='OriginalReproduction', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.TextField(verbose_name='Label')), - ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), - ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('available', models.BooleanField(default=True, verbose_name='Available')), - ('order', models.IntegerField(default=10, verbose_name='Order')), - ], - options={ - 'verbose_name': 'Original/reproduction type', - 'verbose_name_plural': 'Original/reproduction types', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.AddField( - model_name='find', - name='cache_complete_museum_id', - field=models.TextField(blank=True, db_index=True, default='', help_text='Cached value - do not edit', verbose_name='Complete museum ID'), - ), - migrations.AddField( - model_name='find', - name='museum_allocation_date', - field=models.DateField(blank=True, null=True, verbose_name='Date of museum allocation'), - ), - migrations.AddField( - model_name='find', - name='museum_custodian_institution', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='deposited', to='ishtar_common.Organization', verbose_name='Custodian institution'), - ), - migrations.AddField( - model_name='find', - name='museum_depositor_inventory_number', - field=models.TextField(blank=True, default='', verbose_name='Depositor inventory number'), - ), - migrations.AddField( - model_name='find', - name='museum_donor', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='has_provided', to='ishtar_common.BiographicalNote', verbose_name='Donor, testator or vendor'), - ), - migrations.AddField( - model_name='find', - name='museum_entry_date', - field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (exact or start)'), - ), - migrations.AddField( - model_name='find', - name='museum_entry_date_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry date'), - ), - migrations.AddField( - model_name='find', - name='museum_entry_date_end', - field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (end)'), - ), - migrations.AddField( - model_name='find', - name='museum_entry_mode_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry mode'), - ), - 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'), - ), - migrations.AddField( - model_name='find', - name='museum_id_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum ID'), - ), - migrations.AddField( - model_name='find', - name='museum_id_prefix', - field=models.TextField(blank=True, default='', verbose_name='Museum ID prefix'), - ), - migrations.AddField( - model_name='find', - name='museum_id_suffix', - field=models.TextField(blank=True, default='', verbose_name='Museum ID suffix'), - ), - migrations.AddField( - model_name='find', - name='museum_inventory_entry_year', - field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Inventory entry year'), - ), - migrations.AddField( - model_name='find', - name='museum_inventory_transcript', - field=models.TextField(blank=True, default='', verbose_name='Inventory transcript'), - ), - migrations.AddField( - model_name='find', - name='museum_marking_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on marking'), - ), - migrations.AddField( - model_name='find', - name='museum_non_conformity_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment of non-conformity'), - ), - migrations.AddField( - model_name='find', - name='museum_owner_institution', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owns', to='ishtar_common.Organization', verbose_name='Owner institution'), - ), - migrations.AddField( - model_name='find', - name='museum_purchase_price', - field=models.TextField(blank=True, default='', verbose_name='Purchase price'), - ), - migrations.AddField( - model_name='find', - name='quantity_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on quantity'), - ), - migrations.AddField( - model_name='historicalfind', - name='cache_complete_museum_id', - field=models.TextField(blank=True, db_index=True, default='', help_text='Cached value - do not edit', verbose_name='Complete museum ID'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_allocation_date', - field=models.DateField(blank=True, null=True, verbose_name='Date of museum allocation'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_custodian_institution', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Custodian institution'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_depositor_inventory_number', - field=models.TextField(blank=True, default='', verbose_name='Depositor inventory number'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_donor', - 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='Donor, testator or vendor'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_entry_date', - field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (exact or start)'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_entry_date_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry date'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_entry_date_end', - field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (end)'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_entry_mode_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry mode'), - ), - 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'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_id_prefix', - field=models.TextField(blank=True, default='', verbose_name='Museum ID prefix'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_id_suffix', - field=models.TextField(blank=True, default='', verbose_name='Museum ID suffix'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_inventory_entry_year', - field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Inventory entry year'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_inventory_transcript', - field=models.TextField(blank=True, default='', verbose_name='Inventory transcript'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_marking_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on marking'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_non_conformity_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment of non-conformity'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_owner_institution', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Owner institution'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_purchase_price', - field=models.TextField(blank=True, default='', verbose_name='Purchase price'), - ), - migrations.AddField( - model_name='historicalfind', - name='quantity_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on quantity'), - ), - migrations.AlterField( - model_name='find', - name='functional_areas', - field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.FunctionalArea', verbose_name='Functional areas'), - ), - migrations.AlterField( - model_name='find', - name='museum_id', - field=models.TextField(blank=True, default='', verbose_name='Museum ID'), - ), - migrations.AlterField( - model_name='historicalfind', - name='museum_id', - field=models.TextField(blank=True, default='', verbose_name='Museum ID'), - ), - migrations.CreateModel( - name='TechnicalProcessType', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.TextField(verbose_name='Label')), - ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), - ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('available', models.BooleanField(default=True, verbose_name='Available')), - ('order', models.IntegerField(default=10, verbose_name='Order')), - ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.TechnicalProcessType', verbose_name='Parent')), - ], - options={ - 'verbose_name': 'Technical process type', - 'verbose_name_plural': 'Technical process types', - 'ordering': ('order', 'parent__label', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='TechnicalAreaType', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.TextField(verbose_name='Label')), - ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), - ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('available', models.BooleanField(default=True, verbose_name='Available')), - ('order', models.IntegerField(default=10, verbose_name='Order')), - ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.TechnicalAreaType', verbose_name='Parent')), - ], - options={ - 'verbose_name': 'Technical area type', - 'verbose_name_plural': 'Technical area types', - 'ordering': ('order', 'parent__label', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='CollectionEntryModeType', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.TextField(verbose_name='Label')), - ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), - ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('available', models.BooleanField(default=True, verbose_name='Available')), - ('order', models.IntegerField(default=10, verbose_name='Order')), - ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.CollectionEntryModeType', verbose_name='Parent')), - ], - options={ - 'verbose_name': 'Collection entry mode type', - 'verbose_name_plural': 'Collection entry mode types', - 'ordering': ('order', 'parent__label', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.AddField( - model_name='find', - name='museum_collection', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='current_collection_of', to='archaeological_finds.MuseumCollection', verbose_name='Collection'), - ), - migrations.AddField( - model_name='find', - name='museum_collection_entry_mode', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.CollectionEntryModeType', verbose_name='Collections entry mode'), - ), - migrations.AddField( - model_name='find', - name='museum_inventory_conformity', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.InventoryConformity', verbose_name='Conformity with inventory'), - ), - migrations.AddField( - model_name='find', - name='museum_inventory_marking_presence', - field=models.ManyToManyField(blank=True, related_name='finds', to='archaeological_finds.InventoryMarkingPresence', verbose_name='Presence of inventory marking'), - ), - migrations.AddField( - model_name='find', - name='museum_marking_type', - field=models.ManyToManyField(blank=True, related_name='finds', to='archaeological_finds.MarkingType', verbose_name='Type of marking'), - ), - migrations.AddField( - model_name='find', - name='museum_original_repro', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.OriginalReproduction', verbose_name='Original/reproduction'), - ), - migrations.AddField( - model_name='find', - name='technical_areas', - field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.TechnicalAreaType', verbose_name='Technical areas'), - ), - migrations.AddField( - model_name='find', - name='technical_processes', - field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.TechnicalProcessType', verbose_name='Technical processes'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_collection', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.MuseumCollection', verbose_name='Collection'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_collection_entry_mode', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.CollectionEntryModeType', verbose_name='Collections entry mode'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_inventory_conformity', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.InventoryConformity', verbose_name='Conformity with inventory'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_original_repro', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.OriginalReproduction', verbose_name='Original/reproduction'), - ), - ] diff --git a/archaeological_finds/migrations/0115_auto_20240209_1745.py b/archaeological_finds/migrations/0115_auto_20240209_1745.py new file mode 100644 index 000000000..4bb67727b --- /dev/null +++ b/archaeological_finds/migrations/0115_auto_20240209_1745.py @@ -0,0 +1,427 @@ +# Generated by Django 2.2.24 on 2024-02-09 17:45 + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import ishtar_common.models_common +import re + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0236_auto_20240209_1558'), + ('archaeological_finds', '0114_auto_20231115_1617'), + ] + + operations = [ + migrations.CreateModel( + name='InventoryConformity', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ], + options={ + 'verbose_name': 'Inventory conformity type', + 'verbose_name_plural': 'Inventory conformity types', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='InventoryMarkingPresence', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ], + options={ + 'verbose_name': 'Presence of inventory marking type', + 'verbose_name_plural': 'Presence of inventory marking types', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='MarkingType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ], + options={ + 'verbose_name': 'Marking type', + 'verbose_name_plural': 'Marking types', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='MuseumCollection', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ], + options={ + 'verbose_name': 'Museum collection', + 'verbose_name_plural': 'Museum collections', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='OriginalReproduction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ], + options={ + 'verbose_name': 'Original/reproduction type', + 'verbose_name_plural': 'Original/reproduction types', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.AddField( + model_name='find', + name='cache_complete_museum_id', + field=models.TextField(blank=True, db_index=True, default='', help_text='Cached value - do not edit', verbose_name='Complete museum ID'), + ), + migrations.AddField( + model_name='find', + name='museum_allocation_date', + field=models.DateField(blank=True, null=True, verbose_name='Date of museum allocation'), + ), + migrations.AddField( + model_name='find', + name='museum_custodian_institution', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='deposited', to='ishtar_common.Organization', verbose_name='Custodian institution'), + ), + migrations.AddField( + model_name='find', + name='museum_depositor_inventory_number', + field=models.TextField(blank=True, default='', verbose_name='Depositor inventory number'), + ), + migrations.AddField( + model_name='find', + name='museum_donor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='has_provided', to='ishtar_common.BiographicalNote', verbose_name='Donor, testator or vendor'), + ), + migrations.AddField( + model_name='find', + name='museum_entry_date', + field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (exact or start)'), + ), + migrations.AddField( + model_name='find', + name='museum_entry_date_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry date'), + ), + migrations.AddField( + model_name='find', + name='museum_entry_date_end', + field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (end)'), + ), + migrations.AddField( + model_name='find', + name='museum_entry_mode_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry mode'), + ), + migrations.AddField( + model_name='find', + name='museum_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', + name='museum_id_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum ID'), + ), + migrations.AddField( + model_name='find', + name='museum_id_prefix', + field=models.TextField(blank=True, default='', verbose_name='Museum ID prefix'), + ), + migrations.AddField( + model_name='find', + name='museum_id_suffix', + field=models.TextField(blank=True, default='', verbose_name='Museum ID suffix'), + ), + migrations.AddField( + model_name='find', + name='museum_inventory_entry_year', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Inventory entry year'), + ), + migrations.AddField( + model_name='find', + name='museum_inventory_transcript', + field=models.TextField(blank=True, default='', verbose_name='Inventory transcript'), + ), + migrations.AddField( + model_name='find', + name='museum_marking_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on marking'), + ), + migrations.AddField( + model_name='find', + name='museum_non_conformity_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment of non-conformity'), + ), + migrations.AddField( + model_name='find', + name='museum_owner_institution', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owns', to='ishtar_common.Organization', verbose_name='Owner institution'), + ), + migrations.AddField( + model_name='find', + name='museum_purchase_price', + field=models.TextField(blank=True, default='', verbose_name='Purchase price'), + ), + migrations.AddField( + model_name='find', + name='quantity_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on quantity'), + ), + migrations.AddField( + model_name='historicalfind', + name='cache_complete_museum_id', + field=models.TextField(blank=True, db_index=True, default='', help_text='Cached value - do not edit', verbose_name='Complete museum ID'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_allocation_date', + field=models.DateField(blank=True, null=True, verbose_name='Date of museum allocation'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_custodian_institution', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Custodian institution'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_depositor_inventory_number', + field=models.TextField(blank=True, default='', verbose_name='Depositor inventory number'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_donor', + 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='Donor, testator or vendor'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_entry_date', + field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (exact or start)'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_entry_date_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry date'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_entry_date_end', + field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (end)'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_entry_mode_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry mode'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_id_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum ID'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_id_prefix', + field=models.TextField(blank=True, default='', verbose_name='Museum ID prefix'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_id_suffix', + field=models.TextField(blank=True, default='', verbose_name='Museum ID suffix'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_inventory_entry_year', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Inventory entry year'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_inventory_transcript', + field=models.TextField(blank=True, default='', verbose_name='Inventory transcript'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_marking_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on marking'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_non_conformity_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment of non-conformity'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_owner_institution', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Owner institution'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_purchase_price', + field=models.TextField(blank=True, default='', verbose_name='Purchase price'), + ), + migrations.AddField( + model_name='historicalfind', + name='quantity_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on quantity'), + ), + migrations.AlterField( + model_name='find', + name='functional_areas', + field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.FunctionalArea', verbose_name='Functional areas'), + ), + migrations.AlterField( + model_name='find', + name='museum_id', + field=models.TextField(blank=True, default='', verbose_name='Museum ID'), + ), + migrations.AlterField( + model_name='historicalfind', + name='museum_id', + field=models.TextField(blank=True, default='', verbose_name='Museum ID'), + ), + migrations.CreateModel( + name='TechnicalProcessType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.TechnicalProcessType', verbose_name='Parent')), + ], + options={ + 'verbose_name': 'Technical process type', + 'verbose_name_plural': 'Technical process types', + 'ordering': ('order', 'parent__label', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='TechnicalAreaType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.TechnicalAreaType', verbose_name='Parent')), + ], + options={ + 'verbose_name': 'Technical area type', + 'verbose_name_plural': 'Technical area types', + 'ordering': ('order', 'parent__label', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='CollectionEntryModeType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.CollectionEntryModeType', verbose_name='Parent')), + ], + options={ + 'verbose_name': 'Collection entry mode type', + 'verbose_name_plural': 'Collection entry mode types', + 'ordering': ('order', 'parent__label', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.AddField( + model_name='find', + name='museum_collection', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='current_collection_of', to='archaeological_finds.MuseumCollection', verbose_name='Collection'), + ), + migrations.AddField( + model_name='find', + name='museum_collection_entry_mode', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.CollectionEntryModeType', verbose_name='Collections entry mode'), + ), + migrations.AddField( + model_name='find', + name='museum_inventory_conformity', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.InventoryConformity', verbose_name='Conformity with inventory'), + ), + migrations.AddField( + model_name='find', + name='museum_inventory_marking_presence', + field=models.ManyToManyField(blank=True, related_name='finds', to='archaeological_finds.InventoryMarkingPresence', verbose_name='Presence of inventory marking'), + ), + migrations.AddField( + model_name='find', + name='museum_marking_type', + field=models.ManyToManyField(blank=True, related_name='finds', to='archaeological_finds.MarkingType', verbose_name='Type of marking'), + ), + migrations.AddField( + model_name='find', + name='museum_original_repro', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.OriginalReproduction', verbose_name='Original/reproduction'), + ), + migrations.AddField( + model_name='find', + name='technical_areas', + field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.TechnicalAreaType', verbose_name='Technical areas'), + ), + migrations.AddField( + model_name='find', + name='technical_processes', + field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.TechnicalProcessType', verbose_name='Technical processes'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_collection', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.MuseumCollection', verbose_name='Collection'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_collection_entry_mode', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.CollectionEntryModeType', verbose_name='Collections entry mode'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_inventory_conformity', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.InventoryConformity', verbose_name='Conformity with inventory'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_original_repro', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.OriginalReproduction', verbose_name='Original/reproduction'), + ), + ] diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 929e4374c..fe43120ae 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", @@ -2045,8 +2048,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( @@ -2811,7 +2815,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_20240208_1635.py deleted file mode 100644 index 48b1060d6..000000000 --- a/ishtar_common/migrations/0236_auto_20240208_1635.py +++ /dev/null @@ -1,112 +0,0 @@ -# Generated by Django 2.2.24 on 2024-02-08 16:35 - -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion -import ishtar_common.models_common -import re - - -class Migration(migrations.Migration): - - dependencies = [ - ('ishtar_common', '0235_default_geo_types'), - ] - - operations = [ - migrations.CreateModel( - name='ShootingAngle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.TextField(verbose_name='Label')), - ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), - ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('available', models.BooleanField(default=True, verbose_name='Available')), - ('order', models.IntegerField(default=10, verbose_name='Order')), - ], - options={ - 'verbose_name': 'Shooting angle', - 'verbose_name_plural': 'Shooting angles', - 'ordering': ('label',), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.AlterModelOptions( - name='licensetype', - options={'ordering': ('parent__label', 'order', 'label'), 'verbose_name': 'License type', 'verbose_name_plural': 'License types'}, - ), - migrations.AddField( - model_name='document', - name='copyright', - field=models.TextField(blank=True, default='', verbose_name='Copyright'), - ), - migrations.AddField( - model_name='document', - name='rights_owner', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Organization', verbose_name='Rights owner'), - ), - migrations.AddField( - model_name='historicaldocument', - name='copyright', - field=models.TextField(blank=True, default='', verbose_name='Copyright'), - ), - migrations.AddField( - model_name='historicaldocument', - name='rights_owner', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Rights owner'), - ), - migrations.AddField( - model_name='historicalorganization', - name='museum_museofile_id', - field=models.TextField(blank=True, default='', verbose_name='Museofile id'), - ), - migrations.AddField( - model_name='licensetype', - name='order', - field=models.IntegerField(default=10, verbose_name='Order'), - ), - migrations.AddField( - model_name='licensetype', - name='parent', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.LicenseType', verbose_name='Parent'), - ), - migrations.AddField( - model_name='organization', - name='museum_museofile_id', - field=models.TextField(blank=True, default='', verbose_name='Museofile id'), - ), - migrations.AlterField( - model_name='document', - name='licenses', - field=models.ManyToManyField(blank=True, to='ishtar_common.LicenseType', verbose_name='Rights of use / license'), - ), - migrations.AlterField( - model_name='gdprlog', - name='activity', - field=models.CharField(choices=[('DC', 'Directory consultation'), ('DE', 'Directory export'), ('PV', "Viewing a person's notice"), ('PE', "Exporting a person's notice"), ('PC', 'Person creation'), ('PM', 'Person modification'), ('Pm', 'Person merge'), ('PD', 'Person deletion'), ('AC', 'Admin - Directory consultation'), ('AV', 'Admin - Person view'), ('AM', 'Admin - Person modification'), ('AD', 'Admin - Person deletion')], max_length=2, verbose_name='Activity'), - ), - migrations.CreateModel( - name='BiographicalNote', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('denomination', models.TextField(verbose_name='Denomination')), - ('last_name', models.TextField(blank=True, default='', verbose_name='Last name')), - ('first_name', models.TextField(blank=True, default='', verbose_name='First name')), - ('birth_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='Year of birth')), - ('death_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='Year of death')), - ('biography', models.TextField(blank=True, default='', verbose_name='Biography')), - ('biography_format', models.CharField(blank=True, choices=[('NO', 'None'), ('MD', 'Markdown'), ('HT', 'HTML')], default='NO', max_length=2, verbose_name='Biography format')), - ('person', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Person', verbose_name='Person')), - ], - ), - migrations.AddField( - model_name='document', - name='shooting_angle', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.ShootingAngle', verbose_name='Shooting angle'), - ), - migrations.AddField( - model_name='historicaldocument', - name='shooting_angle', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.ShootingAngle', verbose_name='Shooting angle'), - ), - ] diff --git a/ishtar_common/migrations/0236_auto_20240209_1558.py b/ishtar_common/migrations/0236_auto_20240209_1558.py new file mode 100644 index 000000000..6fd6014fe --- /dev/null +++ b/ishtar_common/migrations/0236_auto_20240209_1558.py @@ -0,0 +1,122 @@ +# Generated by Django 2.2.24 on 2024-02-09 15:58 + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import ishtar_common.models_common +import re + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0235_default_geo_types'), + ] + + operations = [ + migrations.CreateModel( + name='ShootingAngle', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ], + options={ + 'verbose_name': 'Shooting angle', + 'verbose_name_plural': 'Shooting angles', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.AlterModelOptions( + name='licensetype', + options={'ordering': ('parent__label', 'order', 'label'), 'verbose_name': 'License type', 'verbose_name_plural': 'License types'}, + ), + migrations.AddField( + model_name='document', + name='copyright', + field=models.TextField(blank=True, default='', verbose_name='Copyright'), + ), + migrations.AddField( + model_name='document', + name='rights_owner', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Organization', verbose_name='Rights owner'), + ), + migrations.AddField( + model_name='historicaldocument', + name='copyright', + field=models.TextField(blank=True, default='', verbose_name='Copyright'), + ), + migrations.AddField( + model_name='historicaldocument', + name='rights_owner', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Rights owner'), + ), + migrations.AddField( + model_name='historicalorganization', + name='museum_museofile_id', + 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'), + ), + migrations.AddField( + model_name='licensetype', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.LicenseType', verbose_name='Parent'), + ), + migrations.AddField( + model_name='organization', + name='museum_museofile_id', + field=models.TextField(blank=True, default='', verbose_name='Museofile id'), + ), + migrations.AlterField( + model_name='document', + name='licenses', + field=models.ManyToManyField(blank=True, to='ishtar_common.LicenseType', verbose_name='Rights of use / license'), + ), + migrations.AlterField( + model_name='gdprlog', + name='activity', + field=models.CharField(choices=[('DC', 'Directory consultation'), ('DE', 'Directory export'), ('PV', "Viewing a person's notice"), ('PE', "Exporting a person's notice"), ('PC', 'Person creation'), ('PM', 'Person modification'), ('Pm', 'Person merge'), ('PD', 'Person deletion'), ('AC', 'Admin - Directory consultation'), ('AV', 'Admin - Person view'), ('AM', 'Admin - Person modification'), ('AD', 'Admin - Person deletion')], max_length=2, verbose_name='Activity'), + ), + migrations.CreateModel( + name='BiographicalNote', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('denomination', models.TextField(verbose_name='Denomination')), + ('last_name', models.TextField(blank=True, default='', verbose_name='Last name')), + ('first_name', models.TextField(blank=True, default='', verbose_name='First name')), + ('birth_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='Year of birth')), + ('death_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='Year of death')), + ('biography', models.TextField(blank=True, default='', verbose_name='Biography')), + ('biography_format', models.CharField(blank=True, choices=[('NO', 'None'), ('MD', 'Markdown'), ('HT', 'HTML')], default='NO', max_length=2, verbose_name='Biography format')), + ('person', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Person', verbose_name='Person')), + ], + ), + migrations.AddField( + model_name='document', + name='shooting_angle', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.ShootingAngle', verbose_name='Shooting angle'), + ), + migrations.AddField( + model_name='historicaldocument', + name='shooting_angle', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.ShootingAngle', verbose_name='Shooting angle'), + ), + ] 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}", -- cgit v1.2.3