diff options
Diffstat (limited to 'archaeological_finds')
| -rw-r--r-- | archaeological_finds/admin.py | 4 | ||||
| -rw-r--r-- | archaeological_finds/forms.py | 22 | ||||
| -rw-r--r-- | archaeological_finds/migrations/0143_find_periods.py | 19 | ||||
| -rw-r--r-- | archaeological_finds/migrations/0144_datings_refactoring.py | 50 | ||||
| -rw-r--r-- | archaeological_finds/migrations/0145_migrate_periods_and_datings.py | 19 | ||||
| -rw-r--r-- | archaeological_finds/models_finds.py | 44 | ||||
| -rw-r--r-- | archaeological_finds/templates/ishtar/sheet_find.html | 7 | ||||
| -rw-r--r-- | archaeological_finds/views.py | 2 | 
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),  ] | 
