summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_finds/admin.py2
-rw-r--r--archaeological_finds/forms.py81
-rw-r--r--archaeological_finds/migrations/0138_donor_to_donors.py36
-rw-r--r--archaeological_finds/migrations/0138_donors_owner_ownership_status_collections.py123
-rw-r--r--archaeological_finds/migrations/0139_data_migration_owner_ownership.py29
-rw-r--r--archaeological_finds/migrations/0139_data_migration_owner_type.json35
-rw-r--r--archaeological_finds/migrations/0139_data_migration_ownership_status.json68
-rw-r--r--archaeological_finds/models.py2
-rw-r--r--archaeological_finds/models_finds.py75
-rw-r--r--archaeological_finds/templates/ishtar/sheet_find.html10
-rw-r--r--archaeological_finds/templates/ishtar/sheet_museum_find.html10
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 %}