diff options
11 files changed, 381 insertions, 90 deletions
diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py index 39a8b16a4..77dae07e1 100644 --- a/archaeological_finds/admin.py +++ b/archaeological_finds/admin.py @@ -263,7 +263,7 @@ general_models = [ models.InventoryMarkingPresence, models.MarkingType, models.MaterialTypeQualityType, models.MuseumCollection, models.ObjectTypeQualityType, models.OriginalReproduction, models.RemarkabilityType, models.TreatmentEmergencyType, models.DiscoveryMethod, - models.ExhibitionType + models.ExhibitionType, models.OwnerType, models.OwnershipStatus ] for model in general_models: diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 31673014c..def6c53b9 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -250,6 +250,7 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType): "museum_donor", "museum_inventory_marking_presence", "museum_marking_type", + "museum_collection", ] associated_models = { "material_type": models.MaterialType, @@ -271,7 +272,8 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType): "museum_donor": BiographicalNote, "museum_former_collection": BiographicalNote, "get_first_base_find__discovery_method": models.DiscoveryMethod, - # 'collection': Warehouse, + "owner": models.OwnerType, + "ownership_status": models.OwnershipStatus } field_order = [ "museum_id_prefix", @@ -381,14 +383,14 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType): } HEADERS = {} 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 inventory number"), 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")) + label = forms.CharField( + label=_("Free ID"), validators=[validators.MaxLengthValidator(60)] + ) denomination = forms.CharField(label=_("Denomination"), required=False) previous_id = forms.CharField(label=_("Previous ID"), required=False) laboratory_id = forms.CharField(label=_("Laboratory ID"), required=False) @@ -400,12 +402,14 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType): label=_("Type of marking"), required=False ) mark = forms.CharField(label=_("Mark"), 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["ownership_status"] = FormHeader(_("Ownership")) + ownership_status = forms.ChoiceField( + label=_("Ownership status"), required=False, choices=[] + ) + owner = forms.ChoiceField( + label=_("Owner"), required=False, choices=[] + ) + HEADERS["museum_owner_institution"] = FormHeader(_("Museum")) museum_owner_institution = widgets.ModelJQueryAutocompleteField( model=Organization, label=_("Owner institution"), new=True, required=False @@ -427,9 +431,8 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType): museum_donor = widgets.Select2MultipleField( model=BiographicalNote, label=_("Donors, testators or vendors"), required=False, remote=True, new=True) - museum_collection = forms.ChoiceField( - label=_("Collection"), required=False, choices=[] - ) + museum_collection = widgets.Select2MultipleField( + model=models.MuseumCollection, label=_("Collections"), required=False) museum_former_collection = widgets.Select2MultipleField( model=BiographicalNote, label=_("Former collections"), required=False, remote=True, new=True) museum_inventory_entry_year = forms.IntegerField( @@ -596,6 +599,8 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType): FieldType("museum_collection", models.MuseumCollection), FieldType("museum_inventory_conformity", models.InventoryConformity), FieldType("museum_original_repro", models.OriginalReproduction), + FieldType("owner", models.OwnerType), + FieldType("ownership_status", models.OwnershipStatus), ] def __init__(self, *args, **kwargs): @@ -657,6 +662,8 @@ class FindForm(BasicFindForm): "museum_inventory_marking_presence", "museum_marking_type", "mark", + "ownership_status", + "owner", "museum_owner_institution", "museum_assigned_institution", "museum_custodian_institution", @@ -926,8 +933,10 @@ class QAFindFormMulti(MuseumForm, QAForm): "qa_museum_collection_entry_mode", "qa_museum_inventory_marking_presence", "qa_museum_marking_type", - "qa_museum_collection", + "qa_museum_collections", "qa_museum_original_repro", + "qa_owner", + "qa_ownership_status", ] associated_models = { "qa_material_types": models.MaterialType, @@ -951,9 +960,11 @@ class QAFindFormMulti(MuseumForm, QAForm): "qa_museum_donors": BiographicalNote, "qa_museum_marking_type": models.MarkingType, "qa_museum_inventory_marking_presence": models.InventoryMarkingPresence, - "qa_museum_collection": models.MuseumCollection, + "qa_museum_collections": models.MuseumCollection, "qa_museum_original_repro": models.OriginalReproduction, "qa_museum_former_collections": BiographicalNote, + "qa_owner": models.OwnerType, + "qa_ownership_status": models.OwnershipStatus, } MULTI = True @@ -966,7 +977,7 @@ class QAFindFormMulti(MuseumForm, QAForm): "qa_check_date", "qa_treatment_emergency", "qa_appraisal_date", - "qa_insurance_value", # 'qa_collection', + "qa_insurance_value", "qa_find_number", "qa_min_number_of_individuals", "qa_museum_inventory_quantity", @@ -977,9 +988,10 @@ class QAFindFormMulti(MuseumForm, QAForm): "qa_museum_custodian_institution", "qa_museum_entry_date", "qa_museum_entry_date_end", - "qa_museum_collection", "qa_museum_inventory_entry_year", "qa_museum_original_repro", + "qa_owner", + "qa_ownership_status", ] PROFILE_FILTER = { "museum": [ @@ -995,7 +1007,7 @@ class QAFindFormMulti(MuseumForm, QAForm): "qa_museum_donors", "qa_museum_inventory_marking_presence", "qa_museum_marking_type", - "qa_museum_collection", + "qa_museum_collections", "qa_museum_former_collections", "qa_museum_inventory_entry_year", "qa_museum_original_repro", @@ -1006,6 +1018,7 @@ class QAFindFormMulti(MuseumForm, QAForm): "qa_ue": FormHeader(_("Context record")), "qa_label": FormHeader(_("Identification"), slug='identification'), "qa_denomination": FormHeader(_("Identification"), slug='identification'), + "qa_ownership_status": FormHeader(_("Ownership")), "qa_description": FormHeader(_("Description")), "qa_checked_type": FormHeader(_("Sheet")), "qa_period": FormHeader(_("Datation")), @@ -1046,12 +1059,11 @@ class QAFindFormMulti(MuseumForm, QAForm): qa_laboratory_id = forms.CharField(label=_("Laboratory ID"), required=False) qa_seal_number = forms.CharField(label=_("Seal number"), required=False) qa_mark = forms.CharField(label=_("Mark"), required=False) - # qa_collection = forms.IntegerField( - # label=_("Collection"), - # widget=widgets.JQueryAutoComplete( - # reverse_lazy('autocomplete-warehouse'), - # associated_model=Warehouse), - # validators=[valid_id(Warehouse)], required=False) + + ## Ownership + qa_ownership_status = forms.ChoiceField(label=_("Ownership status"), + required=False, choices=[]) + qa_owner = forms.ChoiceField(label=_("Owner"), required=False, choices=[]) ## Museum qa_museum_owner_institution = forms.IntegerField( @@ -1094,7 +1106,7 @@ class QAFindFormMulti(MuseumForm, QAForm): qa_museum_marking_type = widgets.Select2MultipleField( label=_("Type of marking"), required=False, choices=[] ) - qa_museum_collection = forms.ChoiceField(label=_("Collection"), required=False, choices=[]) + qa_museum_collections = forms.ChoiceField(label=_("Collections"), required=False, choices=[]) qa_museum_former_collections = forms.IntegerField( label=_("Former collections"), required=False, widget=widgets.JQueryAutoComplete( @@ -1195,9 +1207,10 @@ class QAFindFormMulti(MuseumForm, QAForm): FieldType("qa_museum_collection_entry_mode", models.CollectionEntryModeType), FieldType("qa_museum_marking_type", models.MarkingType, is_multiple=True), FieldType("qa_museum_inventory_marking_presence", models.InventoryMarkingPresence, is_multiple=True), - FieldType("qa_museum_collection", models.MuseumCollection), + FieldType("qa_museum_collections", models.MuseumCollection), FieldType("qa_museum_original_repro", models.OriginalReproduction), - + FieldType("qa_ownership_status", models.OwnershipStatus), + FieldType("qa_owner", models.OwnerType), ] def __init__(self, *args, **kwargs): @@ -1678,7 +1691,7 @@ class FindSelect(MuseumForm, GeoItemSelect, PeriodSelect): "museum_donors", "museum_inventory_marking_presence", "museum_marking_type", - "museum_collection", + "museum_collections", "museum_former_collections", "museum_inventory_entry_year", "museum_inventory_conformity", @@ -1706,7 +1719,7 @@ class FindSelect(MuseumForm, GeoItemSelect, PeriodSelect): "museum_donors", "museum_inventory_marking_presence", "museum_marking_type", - "museum_collection", + "museum_collections", "museum_former_collections", "museum_inventory_entry_year", "museum_inventory_conformity", @@ -1973,7 +1986,7 @@ class FindSelect(MuseumForm, GeoItemSelect, PeriodSelect): label=_("Museum - Type of marking"), choices=[] ) mark = forms.CharField(label=_("Mark")) - museum_collection = forms.ChoiceField( + museum_collections = forms.ChoiceField( label=_("Museum - Collection"), choices=[] ) museum_former_collections = forms.IntegerField( @@ -2025,7 +2038,7 @@ class FindSelect(MuseumForm, GeoItemSelect, PeriodSelect): FieldType("museum_collection_entry_mode", models.CollectionEntryModeType), FieldType("museum_inventory_marking_presence", models.InventoryMarkingPresence), FieldType("museum_marking_type", models.MarkingType), - FieldType("museum_collection", models.MuseumCollection), + FieldType("museum_collections", models.MuseumCollection), FieldType("museum_inventory_conformity", models.InventoryConformity), FieldType("museum_original_repro", models.OriginalReproduction), ] + GeoItemSelect.TYPES @@ -2058,12 +2071,6 @@ class FindSelect(MuseumForm, GeoItemSelect, PeriodSelect): class FindSelectWarehouseModule(FindSelect): - # collection = forms.IntegerField( - # label=_("Collection (warehouse)"), - # widget=widgets.JQueryAutoComplete( - # reverse_lazy('autocomplete-warehouse'), - # associated_model=Warehouse), - # validators=[valid_id(Warehouse)]) container_ref = forms.IntegerField( label=_("Reference container"), widget=widgets.JQueryAutoComplete( diff --git a/archaeological_finds/migrations/0138_donor_to_donors.py b/archaeological_finds/migrations/0138_donor_to_donors.py deleted file mode 100644 index 24ecf65d1..000000000 --- a/archaeological_finds/migrations/0138_donor_to_donors.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 2.2.24 on 2025-08-25 10:14 - -from django.db import migrations, models - - -SQL_MIGRATE = """ -INSERT INTO archaeological_finds_find_museum_donors - (find_id, biographicalnote_id) - SELECT id, museum_donor_id FROM archaeological_finds_find - WHERE museum_donor_id IS NOT NULL; -""" - - -class Migration(migrations.Migration): - - dependencies = [ - ('ishtar_common', '0263_media_exporter'), - ('archaeological_finds', '0137_data_migration_treatment_status_inputstatus'), - ] - - operations = [ - migrations.AddField( - model_name='find', - name='museum_donors', - field=models.ManyToManyField(blank=True, related_name='finds_donors', to='ishtar_common.BiographicalNote', verbose_name='Donors, testators or vendors'), - ), - migrations.RunSQL(SQL_MIGRATE), - migrations.RemoveField( - model_name='find', - name='museum_donor', - ), - migrations.RemoveField( - model_name='historicalfind', - name='museum_donor', - ), - ] diff --git a/archaeological_finds/migrations/0138_donors_owner_ownership_status_collections.py b/archaeological_finds/migrations/0138_donors_owner_ownership_status_collections.py new file mode 100644 index 000000000..edb476ebc --- /dev/null +++ b/archaeological_finds/migrations/0138_donors_owner_ownership_status_collections.py @@ -0,0 +1,123 @@ +# Generated by Django 2.2.24 on 2025-08-25 10:14 + +import ishtar_common.models_common +import django.core.validators +from django.db import migrations, models +import re + + +SQL_MIGRATE_1 = """ +INSERT INTO archaeological_finds_find_museum_donors + (find_id, biographicalnote_id) + SELECT id, museum_donor_id FROM archaeological_finds_find + WHERE museum_donor_id IS NOT NULL; +""" +SQL_MIGRATE_2 = """ +INSERT INTO archaeological_finds_find_museum_collections + (find_id, museumcollection_id) + SELECT id, museum_collection_id FROM archaeological_finds_find + WHERE museum_collection_id IS NOT NULL; +""" + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0263_media_exporter'), + ('archaeological_finds', '0137_data_migration_treatment_status_inputstatus'), + ] + + operations = [ + migrations.AddField( + model_name='find', + name='museum_donors', + field=models.ManyToManyField(blank=True, related_name='finds_donors', to='ishtar_common.BiographicalNote', verbose_name='Donors, testators or vendors'), + ), + migrations.RunSQL(SQL_MIGRATE_1), + migrations.RemoveField( + model_name='find', + name='museum_donor', + ), + migrations.RemoveField( + model_name='historicalfind', + name='museum_donor', + ), + migrations.CreateModel( + name='OwnerType', + 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.OwnerType', verbose_name='Parent')), + ], + options={ + 'verbose_name': 'Ownership type', + 'verbose_name_plural': 'Owner types', + 'ordering': ('order', 'parent__label', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='OwnershipStatus', + 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.OwnershipStatus', verbose_name='Parent')), + ], + options={ + 'verbose_name': 'Ownership status', + 'verbose_name_plural': 'Ownership status', + 'ordering': ('order', 'parent__label', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.AddField( + model_name='find', + name='owner', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.OwnerType', verbose_name='Owner'), + ), + migrations.AddField( + model_name='find', + name='ownership_status', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.OwnershipStatus', verbose_name='Ownership status'), + ), + migrations.AddField( + model_name='historicalfind', + name='owner', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.OwnerType', verbose_name='Owner'), + ), + migrations.AddField( + model_name='historicalfind', + name='ownership_status', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.OwnershipStatus', verbose_name='Ownership status'), + ), + migrations.AddField( + model_name='find', + name='museum_collections', + field=models.ManyToManyField(blank=True, to='archaeological_finds.MuseumCollection', verbose_name='Collections'), + ), + migrations.RunSQL(SQL_MIGRATE_2), + migrations.RemoveField( + model_name='find', + name='museum_collection', + ), + migrations.RemoveField( + model_name='historicalfind', + name='museum_collection', + ), + migrations.RemoveField( + model_name='find', + name='collection', + ), + migrations.RemoveField( + model_name='historicalfind', + name='collection', + ), + ] diff --git a/archaeological_finds/migrations/0139_data_migration_owner_ownership.py b/archaeological_finds/migrations/0139_data_migration_owner_ownership.py new file mode 100644 index 000000000..9ce23e697 --- /dev/null +++ b/archaeological_finds/migrations/0139_data_migration_owner_ownership.py @@ -0,0 +1,29 @@ +import os + +from django.db import migrations +from django.core.management import call_command + + +def load_data(apps, __): + OwnershipStatus = apps.get_model("archaeological_finds", "ownershipstatus") + if not OwnershipStatus.objects.count(): + migration = "0139_data_migration_ownership_status.json" + json_path = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-1] + [migration]) + call_command("loaddata", json_path) + + OwnerType = apps.get_model("archaeological_finds", "ownertype") + if not OwnerType.objects.count(): + migration = "0139_data_migration_owner_type.json" + json_path = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-1] + [migration]) + call_command("loaddata", json_path) + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_finds', '0138_donors_owner_ownership_status_collections'), + ] + + operations = [ + migrations.RunPython(load_data) + ] diff --git a/archaeological_finds/migrations/0139_data_migration_owner_type.json b/archaeological_finds/migrations/0139_data_migration_owner_type.json new file mode 100644 index 000000000..e49241655 --- /dev/null +++ b/archaeological_finds/migrations/0139_data_migration_owner_type.json @@ -0,0 +1,35 @@ +[ + { + "model": "archaeological_finds.ownertype", + "fields": { + "label": "\u00c9tat", + "txt_idx": "etat", + "comment": "", + "available": true, + "order": 10, + "parent": null + } + }, + { + "model": "archaeological_finds.ownertype", + "fields": { + "label": "Collectivit\u00e9", + "txt_idx": "collectivite", + "comment": "", + "available": true, + "order": 20, + "parent": null + } + }, + { + "model": "archaeological_finds.ownertype", + "fields": { + "label": "Inventeur", + "txt_idx": "inventeur", + "comment": "", + "available": true, + "order": 30, + "parent": null + } + } +]
\ No newline at end of file diff --git a/archaeological_finds/migrations/0139_data_migration_ownership_status.json b/archaeological_finds/migrations/0139_data_migration_ownership_status.json new file mode 100644 index 000000000..33dc4de97 --- /dev/null +++ b/archaeological_finds/migrations/0139_data_migration_ownership_status.json @@ -0,0 +1,68 @@ +[ + { + "model": "archaeological_finds.ownershipstatus", + "fields": { + "label": "Collection patrimoniale", + "txt_idx": "collection-patrimoniale", + "comment": "", + "available": true, + "order": 10, + "parent": null + } + }, + { + "model": "archaeological_finds.ownershipstatus", + "fields": { + "label": "D\u00e9p\u00f4t", + "txt_idx": "depot", + "comment": "", + "available": true, + "order": 20, + "parent": null + } + }, + { + "model": "archaeological_finds.ownershipstatus", + "fields": { + "label": "R\u00e9gl\u00e9", + "txt_idx": "regle", + "comment": "", + "available": true, + "order": 30, + "parent": null + } + }, + { + "model": "archaeological_finds.ownershipstatus", + "fields": { + "label": "Non r\u00e9gl\u00e9", + "txt_idx": "non-regle", + "comment": "", + "available": true, + "order": 40, + "parent": null + } + }, + { + "model": "archaeological_finds.ownershipstatus", + "fields": { + "label": "En cours", + "txt_idx": "en-cours", + "comment": "", + "available": true, + "order": 50, + "parent": null + } + }, + { + "model": "archaeological_finds.ownershipstatus", + "fields": { + "label": "Probl\u00e9matique", + "txt_idx": "problematique", + "comment": "", + "available": true, + "order": 60, + "parent": null + } + } +]
\ No newline at end of file diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index c03e17f18..7d5a9617d 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -26,6 +26,8 @@ from archaeological_finds.models_finds import ( ObjectType, ObjectTypeQualityType, OriginalReproduction, + OwnershipStatus, + OwnerType, Property, RemarkabilityType, TechnicalAreaType, diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 89bbf245f..d3b1934e1 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -427,6 +427,7 @@ class DiscoveryMethod(OrderedHierarchicalType): ) ADMIN_SECTION = _("Finds") + post_save.connect(post_save_cache, sender=DiscoveryMethod) post_delete.connect(post_save_cache, sender=DiscoveryMethod) @@ -507,6 +508,38 @@ post_save.connect(post_save_cache, sender=InventoryConformity) post_delete.connect(post_save_cache, sender=InventoryConformity) +class OwnerType(OrderedHierarchicalType): + class Meta: + verbose_name = _("Owner type") + verbose_name_plural = _("Owner types") + ordering = ( + "order", + "parent__label", + "label", + ) + ADMIN_SECTION = _("Finds") + + +post_save.connect(post_save_cache, sender=OwnerType) +post_delete.connect(post_save_cache, sender=OwnerType) + + +class OwnershipStatus(OrderedHierarchicalType): + class Meta: + verbose_name = _("Ownership status") + verbose_name_plural = _("Ownership status") + ordering = ( + "order", + "parent__label", + "label", + ) + ADMIN_SECTION = _("Finds") + + +post_save.connect(post_save_cache, sender=OwnershipStatus) +post_delete.connect(post_save_cache, sender=OwnershipStatus) + + class OriginalReproduction(OrderedType): class Meta: verbose_name = _("Original/reproduction type") @@ -1677,6 +1710,14 @@ class Find( pgettext_lazy("key for text search", "appraisal-date"), "appraisal_date", ), + "owner": SearchAltName( + pgettext_lazy("key for text search", "owner"), + "owner__label__iexact", + ), + "ownership_status": SearchAltName( + pgettext_lazy("key for text search", "ownership"), + "ownership_status__label__iexact", + ), "cultural_attributions": SearchAltName( pgettext_lazy("key for text search", "cultural-attribution"), "cultural_attributions__label__iexact", @@ -1777,10 +1818,10 @@ class Find( pgettext_lazy("key for text search", "museum-marking-type"), "museum_marking_type__label__iexact" ), - "museum_collection": SearchAltName( - pgettext_lazy("key for text search", "museum-collection"), - "museum_collection__label__iexact", - related_name="museum_collection" + "museum_collections": SearchAltName( + pgettext_lazy("key for text search", "museum-collections"), + "museum_collections__label__iexact", + related_name="museum_collections" ), "museum_former_collections": SearchAltName( pgettext_lazy("key for text search", "museum-former-collection"), @@ -1884,7 +1925,7 @@ class Find( SearchVectorConfig("museum_entry_mode_comment"), SearchVectorConfig("museum_entry_date_comment", "local"), SearchVectorConfig("museum_donors__denomination"), - SearchVectorConfig("museum_collection__label"), + SearchVectorConfig("museum_collections__label"), SearchVectorConfig("museum_former_collections__denomination"), SearchVectorConfig("museum_inventory_transcript", "local"), ] @@ -2243,11 +2284,13 @@ class Find( ) check_date = models.DateField(_("Check date"), default=datetime.date.today) estimated_value = models.FloatField(_("Estimated value"), blank=True, null=True) - collection = models.ForeignKey( - "archaeological_warehouse.Warehouse", blank=True, null=True, on_delete=models.SET_NULL, - related_name="finds", - verbose_name=_("Collection"), - help_text=_("Do not use - need evolutions"), + ownership_status = models.ForeignKey( + OwnershipStatus, blank=True, null=True, on_delete=models.SET_NULL, + verbose_name=_("Ownership status"), + ) + owner = models.ForeignKey( + OwnerType, blank=True, null=True, on_delete=models.SET_NULL, + verbose_name=_("Owner"), ) # museum module museum_owner_institution = models.ForeignKey( @@ -2290,10 +2333,10 @@ class Find( blank=True, related_name="finds", ) - museum_collection = models.ForeignKey( - MuseumCollection, blank=True, null=True, on_delete=models.SET_NULL, - related_name='current_collection_of', - verbose_name=_("Collection"), + museum_collections = models.ManyToManyField( + MuseumCollection, + blank=True, + verbose_name=_("Collections"), ) museum_former_collections = models.ManyToManyField( BiographicalNote, blank=True, @@ -2463,6 +2506,10 @@ class Find( return False @property + def has_ownership_section(self): + return self.owner or self.ownership_status + + @property def museum_entry_date_label(self): from django.utils.formats import date_format if not self.museum_entry_date: diff --git a/archaeological_finds/templates/ishtar/sheet_find.html b/archaeological_finds/templates/ishtar/sheet_find.html index 62cae08fb..247e4c03b 100644 --- a/archaeological_finds/templates/ishtar/sheet_find.html +++ b/archaeological_finds/templates/ishtar/sheet_find.html @@ -212,6 +212,14 @@ </div> {% endif %} + {% if item.has_ownership_section %} + <h3>{% trans "Ownership" %}</h3> + <div class='row'> + {% field_flex _("Ownership status") item.ownership_status %} + {% field_flex _("Owner") item.owner %} + </div> + {% endif %} + {% if item.has_museum_section %} <h3>{% trans "Museum / legal status" %}</h3> <div class='row'> @@ -231,7 +239,7 @@ {% field_flex_detail_multiple _("Donors, testators or vendors") item.museum_donors %} {% field_flex_multiple_obj "Presence of inventory marking" item "museum_inventory_marking_presence" %} {% field_flex_multiple_obj "Type of marking" item "museum_marking_type" %} - {% field_flex "Collection" item.museum_collection %} + {% field_flex_multiple_obj _("Collections") item "museum_collections" %} {% field_flex_detail_multiple _("Former collection") item.museum_former_collections %} {% field_flex "Inventory entry year" item.museum_inventory_entry_year %} {% field_flex "Conformity with inventory" item.museum_inventory_conformity %} diff --git a/archaeological_finds/templates/ishtar/sheet_museum_find.html b/archaeological_finds/templates/ishtar/sheet_museum_find.html index 7ecc38050..291156e7c 100644 --- a/archaeological_finds/templates/ishtar/sheet_museum_find.html +++ b/archaeological_finds/templates/ishtar/sheet_museum_find.html @@ -141,12 +141,20 @@ {% field_flex_full _("General comment") item.comment "<pre>" "</pre>" %} </div> + {% if item.has_ownership_section %} + <h3>{% trans "Ownership" %}</h3> + <div class='row'> + {% field_flex _("Ownership status") item.ownership_status %} + {% field_flex _("Owner") item.owner %} + </div> + {% endif %} + {% if item.has_museum_section %} <h3>{% trans "Museum / legal status" %}</h3> <div class='row'> {% field_flex "Complete museum ID" item.cache_complete_museum_id %} {% field_flex "Comment on museum ID" item.museum_id_comment %} - {% field_flex "Collection" item.museum_collection %} + {% field_flex_multiple_obj _("Collections") item "museum_collections" %} {% field_flex_detail_multiple _("Former collection") item.museum_former_collections %} {% field_flex_detail "Owner institution" item.museum_owner_institution %} {% field_flex_detail "Assigned institution" item.museum_assigned_institution %} |