diff options
| 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 |
| commit | e2e493bb66e8ffa88a5b5cce27020c74e4ec23c0 (patch) | |
| tree | 26c4b9f4f391cd95e9ab22c9964642fd019cb27a | |
| parent | 59f9cb8443c62e707daecf52d1400e0b72f598dc (diff) | |
| download | Ishtar-e2e493bb66e8ffa88a5b5cce27020c74e4ec23c0.tar.bz2 Ishtar-e2e493bb66e8ffa88a5b5cce27020c74e4ec23c0.zip | |
✨ finds - models: add many fields
| -rw-r--r-- | archaeological_finds/forms.py | 12 | ||||
| -rw-r--r-- | archaeological_finds/migrations/0152_find_actors_heritage_museum_fields.py | 154 | ||||
| -rw-r--r-- | archaeological_finds/models_finds.py | 70 |
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="" ) |
