summaryrefslogtreecommitdiff
path: root/archaeological_finds
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_finds')
-rw-r--r--archaeological_finds/admin.py4
-rw-r--r--archaeological_finds/forms.py22
-rw-r--r--archaeological_finds/migrations/0143_find_periods.py19
-rw-r--r--archaeological_finds/migrations/0144_datings_refactoring.py50
-rw-r--r--archaeological_finds/migrations/0145_migrate_periods_and_datings.py19
-rw-r--r--archaeological_finds/models_finds.py44
-rw-r--r--archaeological_finds/templates/ishtar/sheet_find.html7
-rw-r--r--archaeological_finds/views.py2
8 files changed, 144 insertions, 23 deletions
diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py
index d6a711187..ffc51a787 100644
--- a/archaeological_finds/admin.py
+++ b/archaeological_finds/admin.py
@@ -61,7 +61,7 @@ admin_site.register(models.FindBasket, FindBasketAdmin)
class FindAdmin(HistorizedObjectAdmin):
list_display = ('label', 'operations_lbl', 'context_records_lbl', 'index',
'dating', 'materials')
- list_filter = ('datings__period', 'material_types')
+ list_filter = ('material_types',)
search_fields = ('cached_label', "base_finds__cache_complete_id")
model = models.Find
autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + [
@@ -76,7 +76,7 @@ class FindAdmin(HistorizedObjectAdmin):
'documents',
]
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
- 'datings', 'cached_label'
+ 'cached_label'
]
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py
index 0cabfd53a..9890387b1 100644
--- a/archaeological_finds/forms.py
+++ b/archaeological_finds/forms.py
@@ -129,7 +129,6 @@ __all__ = [
"FindForm",
"SimpleFindForm",
"DateForm",
- "DatingFormSet",
"PreservationForm",
"FindBasketFormSelection",
"FindBasketForWriteFormSelection",
@@ -240,6 +239,7 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType):
form_slug = "find-020-simplegeneral"
base_models = [
"object_type",
+ "period",
"material_type",
"communicabilitie",
"cultural_attribution",
@@ -256,6 +256,7 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType):
"material_type": models.MaterialType,
"cultural_attribution": CulturalAttributionType,
"object_type": models.ObjectType,
+ "period": Period,
"functional_area": models.FunctionalArea,
"technical_area": models.TechnicalAreaType,
"technical_processe": models.TechnicalProcessType,
@@ -330,6 +331,7 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType):
"communicabilitie",
"comment",
"cultural_attribution",
+ "period",
"dating_comment",
"length",
"width",
@@ -519,6 +521,10 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType):
label=_("Cultural attribution"),
required=False,
)
+ period = widgets.Select2MultipleField(
+ label=_("Periods"),
+ required=False,
+ )
dating_comment = forms.CharField(
label=_("Comment on dating"), required=False, widget=forms.Textarea
)
@@ -579,6 +585,7 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType):
extra_args={"full_hierarchy": True},
),
FieldType("cultural_attribution", CulturalAttributionType, is_multiple=True),
+ FieldType("period", Period, is_multiple=True),
FieldType("material_type_quality", models.MaterialTypeQualityType),
FieldType(
"object_type",
@@ -708,8 +715,9 @@ class FindForm(BasicFindForm):
"decoration",
"manufacturing_place",
"communicabilitie",
- "comment",
"cultural_attribution",
+ "comment",
+ "period",
"dating_comment",
"length",
"width",
@@ -1610,12 +1618,6 @@ class DateForm(ManageOldType, forms.Form):
]
-DatingFormSet = formset_factory(DateForm, can_delete=True, formset=FormSet)
-DatingFormSet.form_label = _("Dating")
-DatingFormSet.form_admin_name = _("Find - 040 - Dating")
-DatingFormSet.form_slug = "find-040-dating"
-
-
class FindSelect(MuseumForm, GeoItemSelect, PeriodSelect):
_model = models.Find
form_admin_name = _("Find - 001 - Search")
@@ -1907,6 +1909,9 @@ class FindSelect(MuseumForm, GeoItemSelect, PeriodSelect):
cultural_attributions = forms.ChoiceField(
label=_("Cultural attribution"), choices=[], required=False
)
+ periods = forms.ChoiceField(
+ label=_("Periods"), choices=[], required=False
+ )
dating_comment = forms.CharField(label=_("Comment on dating"))
length = FloatField(label=_("Length (cm)"), widget=widgets.CentimeterMeterWidget)
@@ -2015,6 +2020,7 @@ class FindSelect(MuseumForm, GeoItemSelect, PeriodSelect):
museum_purchase_price = forms.CharField(label=_("Museum - Purchase price"))
TYPES = PeriodSelect.TYPES + [
+ FieldType("periods", Period),
FieldType("conservatory_states", models.ConservatoryState),
FieldType("base_finds__batch", models.BatchType),
FieldType("recommended_treatments", models.RecommendedTreatmentType),
diff --git a/archaeological_finds/migrations/0143_find_periods.py b/archaeological_finds/migrations/0143_find_periods.py
new file mode 100644
index 000000000..91a5a7f54
--- /dev/null
+++ b/archaeological_finds/migrations/0143_find_periods.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.2.19 on 2025-10-28 15:24
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_operations', '0123_add_timezone_django_v4'),
+ ('archaeological_finds', '0142_add_timezone_django_v4'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='find',
+ name='periods',
+ field=models.ManyToManyField(blank=True, to='archaeological_operations.period', verbose_name='Periods'),
+ ),
+ ]
diff --git a/archaeological_finds/migrations/0144_datings_refactoring.py b/archaeological_finds/migrations/0144_datings_refactoring.py
new file mode 100644
index 000000000..27131f82a
--- /dev/null
+++ b/archaeological_finds/migrations/0144_datings_refactoring.py
@@ -0,0 +1,50 @@
+# Generated by Django 4.2.19 on 2025-10-29 10:54
+
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import ishtar_common.models_common
+import uuid
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_context_records', '0125_datings_refactoring'),
+ ('archaeological_operations', '0123_add_timezone_django_v4'),
+ ('archaeological_finds', '0143_find_periods'),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name='find',
+ old_name='datings',
+ new_name='datings_old',
+ ),
+ migrations.AlterField(
+ model_name='find',
+ name='preservation_to_considers',
+ field=models.ManyToManyField(blank=True, related_name='old_finds_recommended', to='archaeological_finds.treatmenttype', verbose_name='Recommended treatments'),
+ ),
+ migrations.CreateModel(
+ name='FindDating',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('uuid', models.UUIDField(default=uuid.uuid4)),
+ ('reference', models.TextField(blank=True, default='', verbose_name='Reference')),
+ ('external_id', models.TextField(blank=True, default='', verbose_name='External ID')),
+ ('start_date', models.IntegerField(blank=True, null=True, verbose_name='Start date')),
+ ('end_date', models.IntegerField(blank=True, null=True, verbose_name='End date')),
+ ('precise_dating', models.TextField(blank=True, default='', verbose_name='Precise on this dating')),
+ ('dating_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_context_records.datingtype', verbose_name='Dating type')),
+ ('find', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='datings', to='archaeological_finds.find', verbose_name='Find')),
+ ('period', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='archaeological_operations.period', verbose_name='Chronological period')),
+ ('quality', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_context_records.datingquality', verbose_name='Quality')),
+ ],
+ options={
+ 'verbose_name': 'Find dating',
+ 'verbose_name_plural': 'Find datings',
+ },
+ bases=(models.Model, ishtar_common.models_common.SerializeItem),
+ ),
+ ]
diff --git a/archaeological_finds/migrations/0145_migrate_periods_and_datings.py b/archaeological_finds/migrations/0145_migrate_periods_and_datings.py
new file mode 100644
index 000000000..a693f5b6d
--- /dev/null
+++ b/archaeological_finds/migrations/0145_migrate_periods_and_datings.py
@@ -0,0 +1,19 @@
+from django.db import migrations
+from ishtar_common.utils_migrations import migrate_dating_periods
+
+
+def _migrate_datings_periods(apps, __):
+ model_dating = apps.get_model("archaeological_finds", "finddating")
+ model = apps.get_model("archaeological_finds", "find")
+ migrate_dating_periods(apps, model_dating, model, "find")
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_finds', '0144_datings_refactoring'),
+ ]
+
+ operations = [
+ migrations.RunPython(_migrate_datings_periods)
+ ]
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 432bd5467..3b6392039 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -71,17 +71,18 @@ from ishtar_common.models import (
SearchVectorConfig,
ValueGetter,
)
-from ishtar_common.models_common import HistoricalRecords, Imported, SerializeItem, \
+from ishtar_common.models_common import HistoricalRecords, SerializeItem, \
GeoVectorData, geodata_attached_changed
from ishtar_common.utils import PRIVATE_FIELDS
from archaeological_operations.models import (
AdministrativeAct,
- Operation,
CulturalAttributionType,
+ Operation,
+ Period,
)
-from archaeological_context_records.models import ContextRecord, Dating, \
+from archaeological_context_records.models import BaseDating, ContextRecord, Dating, \
GeographicSubTownItem
from archaeological_warehouse.models import Warehouse
@@ -1285,6 +1286,7 @@ class Find(
"container__cached_label": _("Current container"),
"container_ref__cached_label": _("Reference container"),
"datings__period__label": _("Periods"),
+ "periods__label": _("Periods"),
"cached_periods": _("Periods"),
"material_types__label": _("Material types"),
"cached_materials": _("Material types"),
@@ -1322,7 +1324,7 @@ class Find(
"base_finds__context_record__operation__towns__areas__parent__label",
_("Extended area"),
),
- ("datings__period__label", _("Chronological period")),
+ ("periods__label", _("Chronological period")),
("material_types__label", _("Material type")),
("object_types__label", _("Object type")),
("recommended_treatments__label", _("Recommended treatments")),
@@ -1513,6 +1515,11 @@ class Find(
pgettext_lazy("key for text search", "object-type"),
"object_types__label__iexact",
),
+ "periods": SearchAltName(
+ pgettext_lazy("key for text search", "period"),
+ "periods__label__iexact",
+ related_name="periods",
+ ),
"recommended_treatments": SearchAltName(
pgettext_lazy("key for text search", "recommended-treatments"),
"recommended_treatments__label__iexact",
@@ -1958,7 +1965,7 @@ class Find(
SearchVectorConfig("museum_inventory_transcript", "local"),
]
M2M_SEARCH_VECTORS = [
- SearchVectorConfig("datings__period__label", "local"),
+ SearchVectorConfig("periods__label", "local"),
SearchVectorConfig("integrities__label", "raw"),
SearchVectorConfig("material_types__label", "local"),
SearchVectorConfig("object_types__label", "raw"),
@@ -2064,7 +2071,7 @@ class Find(
HISTORICAL_M2M = [
"material_types",
"technical_processes",
- "datings",
+ # "datings",
"cultural_attributions",
"conservatory_states",
"object_types",
@@ -2207,9 +2214,10 @@ class Find(
verbose_name=_("Downstream treatment"),
on_delete=models.SET_NULL,
)
- datings = models.ManyToManyField(
+ datings_old = models.ManyToManyField(
Dating, verbose_name=_("Dating"), related_name="find"
)
+ periods = models.ManyToManyField(Period, verbose_name=_("Periods"), blank=True)
cultural_attributions = models.ManyToManyField(
CulturalAttributionType, verbose_name=_("Cultural attribution"), blank=True
)
@@ -2937,6 +2945,10 @@ class Find(
return self.documents.count()
@property
+ def periods_count(self):
+ return self.periods.count()
+
+ @property
def operation(self):
bf = self.get_first_base_find()
if not bf or not bf.context_record or not bf.context_record.operation:
@@ -3246,7 +3258,7 @@ class Find(
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()])
+ return " & ".join([period.label for period in self.periods.all()])
def _generate_cached_object_types(self):
return " & ".join([str(obj) for obj in self.object_types.all()])
@@ -3820,6 +3832,22 @@ m2m_changed.connect(base_find_find_changed, sender=Find.base_finds.through)
m2m_changed.connect(document_attached_changed, sender=Find.documents.through)
+class FindDating(BaseDating):
+ SERIALIZE_EXCLUDE = ["find"]
+ CURRENT_MODEL = Find
+
+ find = models.ForeignKey(
+ Find,
+ verbose_name=_("Find"),
+ related_name="datings",
+ on_delete=models.CASCADE,
+ )
+
+ class Meta:
+ verbose_name = _("Find dating")
+ verbose_name_plural = _("Find datings")
+
+
class FindInsideContainer(models.Model):
CREATE_SQL = """
CREATE VIEW find_inside_container AS
diff --git a/archaeological_finds/templates/ishtar/sheet_find.html b/archaeological_finds/templates/ishtar/sheet_find.html
index 247e4c03b..34c442542 100644
--- a/archaeological_finds/templates/ishtar/sheet_find.html
+++ b/archaeological_finds/templates/ishtar/sheet_find.html
@@ -252,10 +252,11 @@
{% endif %}
{% with dating_list=item|m2m_listing:"datings" %}
- {% if dating_list or item.dating_comment or item.cultural_attributions_count %}
- <h3>{% trans "Dating" %}</h3>
- {% if item.cultural_attributions_count %}
+ {% if dating_list or item.dating_comment or item.cultural_attributions_count or item.periods_count %}
+ <h3>{% trans "Periods / Datings" %}</h3>
+ {% if item.cultural_attributions_count or item.periods_count %}
<div class='row'>
+ {% field_flex_multiple_obj _("Periods") item 'periods' %}
{% field_flex_multiple_obj "Cultural attributions" item 'cultural_attributions' %}
</div>
{% endif %}
diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py
index 751a6d973..6b612af43 100644
--- a/archaeological_finds/views.py
+++ b/archaeological_finds/views.py
@@ -378,7 +378,6 @@ find_creation_steps = [
("selecrecord-find_creation", RecordFormSelectionTable),
("find-find_creation", forms.FindForm),
("preservation-find_creation", forms.PreservationForm),
- ("dating-find_creation", forms.DatingFormSet),
("final-find_creation", FinalForm),
]
@@ -452,7 +451,6 @@ find_modification_steps = [
("find-find_modification", forms.FindForm),
("simplefind-find_modification", forms.SimpleFindForm),
("preservation-find_modification", forms.PreservationForm),
- ("dating-find_modification", forms.DatingFormSet),
("final-find_modification", FinalForm),
]