summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2026-04-16 12:47:02 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2026-04-16 13:01:37 +0200
commite2e493bb66e8ffa88a5b5cce27020c74e4ec23c0 (patch)
tree26c4b9f4f391cd95e9ab22c9964642fd019cb27a
parent59f9cb8443c62e707daecf52d1400e0b72f598dc (diff)
downloadIshtar-e2e493bb66e8ffa88a5b5cce27020c74e4ec23c0.tar.bz2
Ishtar-e2e493bb66e8ffa88a5b5cce27020c74e4ec23c0.zip
✨ finds - models: add many fields
-rw-r--r--archaeological_finds/forms.py12
-rw-r--r--archaeological_finds/migrations/0152_find_actors_heritage_museum_fields.py154
-rw-r--r--archaeological_finds/models_finds.py70
3 files changed, 224 insertions, 12 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py
index fdb44d0ac..51e8260ef 100644
--- a/archaeological_finds/forms.py
+++ b/archaeological_finds/forms.py
@@ -206,8 +206,6 @@ class RecordFormSelection(CustomForm, forms.Form):
class MuseumForm:
- MARK_FIELD = "mark"
-
def update_museum_fields(self):
"""
Overload fields labels for museum
@@ -226,10 +224,6 @@ class MuseumForm:
fields["museum_id"] = self.fields.pop("museum_id")
fields.update(self.fields)
self.fields = fields
- # update label of mark field
- if self.MARK_FIELD not in self.fields:
- return
- self.fields[self.MARK_FIELD].label = _("Marking details")
class BasicFindForm(MuseumForm, CustomForm, ManageOldType):
@@ -407,7 +401,7 @@ class BasicFindForm(MuseumForm, CustomForm, ManageOldType):
museum_marking_type = widgets.Select2MultipleField(
label=_("Type of marking"), required=False
)
- mark = forms.CharField(label=_("Mark"), required=False)
+ mark = forms.CharField(label=_("Marking details"), required=False)
HEADERS["ownership_status"] = FormHeader(_("Ownership"))
ownership_status = forms.ChoiceField(
label=_("Ownership status"), required=False, choices=[]
@@ -1099,7 +1093,7 @@ class QAFindFormMulti(MuseumForm, QAForm):
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)
+ qa_mark = forms.CharField(label=_("Marking details"), required=False)
## Ownership
qa_ownership_status = forms.ChoiceField(label=_("Ownership status"),
@@ -2025,7 +2019,7 @@ class FindSelect(MuseumForm, GeoItemSelect, DatingSelect):
museum_marking_type = forms.ChoiceField(
label=_("Museum - Type of marking"), choices=[]
)
- mark = forms.CharField(label=_("Mark"))
+ mark = forms.CharField(label=_("Marking details"))
museum_collections = forms.ChoiceField(
label=_("Museum - Collection"), choices=[]
)
diff --git a/archaeological_finds/migrations/0152_find_actors_heritage_museum_fields.py b/archaeological_finds/migrations/0152_find_actors_heritage_museum_fields.py
new file mode 100644
index 000000000..1d386c3ee
--- /dev/null
+++ b/archaeological_finds/migrations/0152_find_actors_heritage_museum_fields.py
@@ -0,0 +1,154 @@
+# Generated by Django 4.2.21 on 2026-04-16 10:44
+
+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', '0277_data_migration_qualifiedbionotetype'),
+ ('archaeological_finds', '0151_data_migration_find_relation_type'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='find',
+ name='actors',
+ field=models.ManyToManyField(blank=True, related_name='finds', to='ishtar_common.qualifiedbiographicalnote', verbose_name='Actors'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='conservatory_states_details',
+ field=models.TextField(blank=True, default='', verbose_name='Conservatory state details'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='iconography_notes',
+ field=models.TextField(blank=True, default='', verbose_name='Notes on iconography'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='listed_building_date',
+ field=models.DateField(blank=True, null=True, verbose_name='Date of listing as a listed building'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='listed_building_id',
+ field=models.TextField(blank=True, default='', verbose_name='Listed building ID'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='listed_building_notes',
+ field=models.TextField(blank=True, default='', verbose_name='Notes on listed building'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='mark_text',
+ field=models.TextField(blank=True, default='', verbose_name='Mark text'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='title',
+ field=models.TextField(blank=True, default='', verbose_name='Title'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='conservatory_states_details',
+ field=models.TextField(blank=True, default='', verbose_name='Conservatory state details'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='iconography_notes',
+ field=models.TextField(blank=True, default='', verbose_name='Notes on iconography'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='listed_building_date',
+ field=models.DateField(blank=True, null=True, verbose_name='Date of listing as a listed building'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='listed_building_id',
+ field=models.TextField(blank=True, default='', verbose_name='Listed building ID'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='listed_building_notes',
+ field=models.TextField(blank=True, default='', verbose_name='Notes on listed building'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='mark_text',
+ field=models.TextField(blank=True, default='', verbose_name='Mark text'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='title',
+ field=models.TextField(blank=True, default='', verbose_name='Title'),
+ ),
+ migrations.AlterField(
+ model_name='find',
+ name='mark',
+ field=models.TextField(blank=True, default='', verbose_name='Marking details'),
+ ),
+ migrations.AlterField(
+ model_name='historicalfind',
+ name='mark',
+ field=models.TextField(blank=True, default='', verbose_name='Marking details'),
+ ),
+ migrations.CreateModel(
+ name='ListedBuildingProtectionNature',
+ 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.listedbuildingprotectionnature', verbose_name='Parent')),
+ ],
+ options={
+ 'verbose_name': 'Listed building protection nature',
+ 'verbose_name_plural': 'Listed building protection nature',
+ 'ordering': ('order', 'label'),
+ },
+ bases=(ishtar_common.models_common.Cached, models.Model),
+ ),
+ migrations.CreateModel(
+ name='IconographicPatternType',
+ 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.iconographicpatterntype', verbose_name='Parent')),
+ ],
+ options={
+ 'verbose_name': 'Iconographic pattern type',
+ 'verbose_name_plural': 'Iconographic pattern types',
+ 'ordering': ('order', 'label'),
+ },
+ bases=(ishtar_common.models_common.Cached, models.Model),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='iconographic_patterns',
+ field=models.ManyToManyField(blank=True, related_name='finds', to='archaeological_finds.iconographicpatterntype', verbose_name='Iconographic patterns'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='listed_building_protection_nature',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='finds', to='archaeological_finds.listedbuildingprotectionnature', verbose_name='Nature of listed buildings protection'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='listed_building_protection_nature',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.listedbuildingprotectionnature', verbose_name='Nature of listed buildings protection'),
+ ),
+ ]
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 400ec7e2c..5f5a0df5d 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -65,6 +65,7 @@ from ishtar_common.models import (
Imported,
IshtarSiteProfile,
LightHistorizedItem,
+ QualifiedBiographicalNote,
main_item_pre_delete,
MainItem,
OrderedHierarchicalType,
@@ -124,9 +125,37 @@ post_save.connect(post_save_cache, sender=MaterialTypeQualityType)
post_delete.connect(post_save_cache, sender=MaterialTypeQualityType)
-class ConservatoryState(HierarchicalType):
- order = models.IntegerField(_("Order"), default=10)
+class IconographicPatternType(OrderedHierarchicalType):
+ class Meta:
+ verbose_name = _("Iconographic pattern type")
+ verbose_name_plural = _("Iconographic pattern types")
+ ordering = (
+ "order",
+ "label",
+ )
+ ADMIN_SECTION = _("Finds")
+
+
+post_save.connect(post_save_cache, sender=IconographicPatternType)
+post_delete.connect(post_save_cache, sender=IconographicPatternType)
+
+
+class ListedBuildingProtectionNature(OrderedHierarchicalType):
+ class Meta:
+ verbose_name = _("Listed building protection nature")
+ verbose_name_plural = _("Listed building protection nature")
+ ordering = (
+ "order",
+ "label",
+ )
+ ADMIN_SECTION = _("Finds")
+
+
+post_save.connect(post_save_cache, sender=ListedBuildingProtectionNature)
+post_delete.connect(post_save_cache, sender=ListedBuildingProtectionNature)
+
+class ConservatoryState(OrderedHierarchicalType):
class Meta:
verbose_name = _("Conservatory state type")
verbose_name_plural = _("Conservatory state types")
@@ -2176,6 +2205,7 @@ class Find(
order = models.IntegerField(_("Order"), default=1)
label = models.TextField(_("Free ID"))
denomination = models.TextField(_("Denomination"), blank=True, default="")
+ title = models.TextField(_("Title"), blank=True, default="")
# museum module IDs
museum_id_prefix = models.TextField(_("Museum ID prefix"), blank=True, default="")
museum_id = models.TextField(_("Museum inventory number"), blank=True, default="")
@@ -2185,6 +2215,14 @@ class Find(
description = models.TextField(_("Description"), blank=True, default="")
decoration = models.TextField(_("Decoration"), blank=True, default="")
inscription = models.TextField(_("Inscription"), blank=True, default="")
+ iconographic_patterns = models.ManyToManyField(
+ IconographicPatternType,
+ verbose_name=_("Iconographic patterns"),
+ related_name="finds",
+ blank=True,
+ )
+ iconography_notes = models.TextField(_("Notes on iconography"), blank=True,
+ default="")
manufacturing_place = models.TextField(
_("Manufacturing place"), blank=True, default=""
)
@@ -2243,6 +2281,28 @@ class Find(
cultural_attributions = models.ManyToManyField(
CulturalAttributionType, verbose_name=_("Cultural attribution"), blank=True
)
+ actors = models.ManyToManyField(
+ QualifiedBiographicalNote, related_name="finds", verbose_name=_("Actors"),
+ blank=True
+ )
+ ## listed building
+ listed_building_id = models.TextField(
+ _("Listed building ID"), default="", blank=True,
+ )
+ listed_building_protection_nature = models.ForeignKey(
+ ListedBuildingProtectionNature,
+ verbose_name=_("Nature of listed buildings protection"),
+ blank=True,
+ null=True,
+ related_name="finds",
+ on_delete=models.SET_NULL,
+ )
+ listed_building_date = models.DateField(
+ _("Date of listing as a listed building"), blank=True, null=True)
+ listed_building_notes = models.TextField(
+ _("Notes on listed building"), default="", blank=True,
+ )
+ ## containers
container = models.ForeignKey(
"archaeological_warehouse.Container",
verbose_name=_("Container"),
@@ -2327,7 +2387,8 @@ class Find(
dimensions_comment = models.TextField(
_("Dimensions comment"), blank=True, default=""
)
- mark = models.TextField(_("Mark"), blank=True, default="")
+ mark_text = models.TextField(_("Mark text"), blank=True, default="")
+ mark = models.TextField(_("Marking details"), blank=True, default="")
comment = models.TextField(_("General comment"), blank=True, default="")
dating_comment = models.TextField(_("Comment on dating"), blank=True, default="")
previous_id = models.TextField(_("Previous ID"), blank=True, default="")
@@ -2424,6 +2485,9 @@ class Find(
verbose_name=_("Conservatory states"),
blank=True,
)
+ conservatory_states_details = models.TextField(
+ _("Conservatory state details"), blank=True, default=""
+ )
conservatory_comment = models.TextField(
_("Conservatory comment"), blank=True, default=""
)