summaryrefslogtreecommitdiff
path: root/archaeological_finds
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2024-04-18 16:35:46 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2024-04-18 17:44:55 +0200
commit7e631d9a322a8bb530652e7adac073d18baf326b (patch)
tree55d3e6f99fe6455c56f8455fe44f147edecbf10c /archaeological_finds
parent6332d4cf19d181cb12e61a857265596001fe4eb1 (diff)
downloadIshtar-7e631d9a322a8bb530652e7adac073d18baf326b.tar.bz2
Ishtar-7e631d9a322a8bb530652e7adac073d18baf326b.zip
🗃️ conservation state becomes multi-valued (refs #5904)
Diffstat (limited to 'archaeological_finds')
-rw-r--r--archaeological_finds/forms.py25
-rw-r--r--archaeological_finds/migrations/0122_conservatory_states_m2m.py24
-rw-r--r--archaeological_finds/migrations/0123_remove_old_conservatory_state.py56
-rw-r--r--archaeological_finds/models_finds.py19
-rw-r--r--archaeological_finds/templates/ishtar/sheet_find.html4
-rw-r--r--archaeological_finds/templates/ishtar/sheet_museum_find.html4
-rw-r--r--archaeological_finds/tests.py2
-rw-r--r--archaeological_finds/tests/importer-group.zipbin79390 -> 9732 bytes
-rw-r--r--archaeological_finds/wizards.py2
9 files changed, 111 insertions, 25 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py
index 7e217d06c..5dc6910ea 100644
--- a/archaeological_finds/forms.py
+++ b/archaeological_finds/forms.py
@@ -919,7 +919,7 @@ class QAFindFormMulti(QAForm):
"qa_alteration_causes": models.AlterationCauseType,
"qa_checked_type": models.CheckedType,
"qa_period": Period,
- "qa_conservatory_state": models.ConservatoryState,
+ "qa_conservatory_states": models.ConservatoryState,
"qa_treatment_emergency": models.TreatmentEmergencyType,
"qa_museum_collection_entry_mode": models.CollectionEntryModeType,
"qa_museum_owner_institution": Organization,
@@ -940,7 +940,6 @@ class QAFindFormMulti(QAForm):
"qa_manufacturing_place",
"qa_checked_type",
"qa_check_date",
- "qa_conservatory_state",
"qa_treatment_emergency",
"qa_appraisal_date",
"qa_insurance_value", # 'qa_collection',
@@ -1123,9 +1122,7 @@ class QAFindFormMulti(QAForm):
qa_alteration_causes = widgets.Select2MultipleField(
label=_("Alteration cause"), required=False
)
- qa_conservatory_state = forms.ChoiceField(
- label=_("Conservatory state"), required=False, choices=[]
- )
+ qa_conservatory_states = widgets.Select2MultipleField(label=_("Conservatory states"), required=False)
qa_treatment_emergency = forms.ChoiceField(
label=_("Treatment emergency"), choices=[], required=False
)
@@ -1176,7 +1173,7 @@ class QAFindFormMulti(QAForm):
FieldType("qa_alteration_causes", models.AlterationCauseType, is_multiple=True),
FieldType("qa_remarkabilities", models.RemarkabilityType, is_multiple=True),
FieldType("qa_checked_type", models.CheckedType),
- FieldType("qa_conservatory_state", models.ConservatoryState),
+ FieldType("qa_conservatory_states", models.ConservatoryState, is_multiple=True),
FieldType("qa_treatment_emergency", models.TreatmentEmergencyType),
FieldType("qa_period", Period, is_multiple=True),
FieldType("qa_museum_collection_entry_mode", models.CollectionEntryModeType),
@@ -1475,6 +1472,7 @@ class PreservationForm(CustomForm, ManageOldType):
"preservation_to_consider",
"integritie",
"remarkabilitie",
+ "conservatory_state",
]
associated_models = {
"alteration": models.AlterationType,
@@ -1497,8 +1495,11 @@ class PreservationForm(CustomForm, ManageOldType):
widget=widgets.Select2Multiple,
required=False,
)
- conservatory_state = forms.ChoiceField(
- label=_("Conservatory state"), choices=[], required=False
+ conservatory_state = forms.MultipleChoiceField(
+ label=_("Conservatory states"),
+ choices=[],
+ widget=widgets.Select2Multiple,
+ required=False,
)
alteration = forms.MultipleChoiceField(
label=_("Alteration"),
@@ -1531,13 +1532,13 @@ class PreservationForm(CustomForm, ManageOldType):
)
TYPES = [
- FieldType("conservatory_state", models.ConservatoryState),
FieldType("treatment_emergency", models.TreatmentEmergencyType),
FieldType("preservation_to_consider", models.TreatmentType, True),
FieldType("alteration", models.AlterationType, True),
FieldType("alteration_cause", models.AlterationCauseType, True),
FieldType("integritie", models.IntegrityType, is_multiple=True),
FieldType("remarkabilitie", models.RemarkabilityType, is_multiple=True),
+ FieldType("conservatory_state", models.ConservatoryState, is_multiple=True),
]
def __init__(self, *args, **kwargs):
@@ -1651,7 +1652,7 @@ class FindSelect(GeoItemSelect, PeriodSelect):
(
"integrities",
"remarkabilities",
- "conservatory_state",
+ "conservatory_states",
"conservatory_comment",
"alterations",
"alteration_causes",
@@ -1984,7 +1985,7 @@ class FindSelect(GeoItemSelect, PeriodSelect):
)
integrities = forms.ChoiceField(label=_("Integrity"), choices=[])
remarkabilities = forms.ChoiceField(label=_("Remarkability"), choices=[])
- conservatory_state = forms.ChoiceField(label=_("Conservatory state"), choices=[])
+ conservatory_states = forms.ChoiceField(label=_("Conservatory states"), choices=[])
conservatory_comment = forms.CharField(label=_("Conservatory comment"))
alterations = forms.ChoiceField(label=_("Alteration"), choices=[])
alteration_causes = forms.ChoiceField(label=_("Alteration cause"), choices=[])
@@ -2088,7 +2089,7 @@ class FindSelect(GeoItemSelect, PeriodSelect):
museum_purchase_price = forms.CharField(label=_("Museum - Purchase price"))
TYPES = PeriodSelect.TYPES + [
- FieldType("conservatory_state", models.ConservatoryState),
+ FieldType("conservatory_states", models.ConservatoryState),
FieldType("base_finds__batch", models.BatchType),
FieldType("preservation_to_considers", models.TreatmentType),
FieldType("integrities", models.IntegrityType),
diff --git a/archaeological_finds/migrations/0122_conservatory_states_m2m.py b/archaeological_finds/migrations/0122_conservatory_states_m2m.py
new file mode 100644
index 000000000..85fd4163c
--- /dev/null
+++ b/archaeological_finds/migrations/0122_conservatory_states_m2m.py
@@ -0,0 +1,24 @@
+# Generated by Django 2.2.24 on 2024-04-18 14:07
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_finds', '0121_fix_bad_treatment_types_states'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='find',
+ name='conservatory_states',
+ field=models.ManyToManyField(blank=True, to='archaeological_finds.ConservatoryState', verbose_name='Conservatory states'),
+ ),
+ migrations.AlterField(
+ model_name='find',
+ name='conservatory_state',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='finds_previous', to='archaeological_finds.ConservatoryState', verbose_name='Conservatory state'),
+ ),
+ ]
diff --git a/archaeological_finds/migrations/0123_remove_old_conservatory_state.py b/archaeological_finds/migrations/0123_remove_old_conservatory_state.py
new file mode 100644
index 000000000..91a6fd4e6
--- /dev/null
+++ b/archaeological_finds/migrations/0123_remove_old_conservatory_state.py
@@ -0,0 +1,56 @@
+# Generated by Django 2.2.24 on 2024-04-18 14:24
+
+import sys
+from django.db import migrations, models
+from ishtar_common.utils import BColors
+
+
+def migrate_conservatory_state(apps, __):
+ Find = apps.get_model("archaeological_finds", "Find")
+ q = Find.objects.filter(conservatory_state__isnull=False)
+ sys.stdout.write("\n")
+ total = q.count()
+ for idx, find in enumerate(q.all()):
+ sys.stdout.write(f"\r{BColors.OKBLUE}→ Migration {idx}/{total}{BColors.ENDC}")
+ find.conservatory_states.add(find.conservatory_state)
+ print(BColors.format("OKGREEN", f"\r* Conservatory state changed for {q.count()} find(s)."))
+
+ # migrate importers
+ ImporterDefault = apps.get_model("ishtar_common", "ImporterDefault")
+ for default in ImporterDefault.objects.filter(target__contains='conservatory_state').all():
+ default.target = default.target.replace("conservatory_state", "conservatory_states")
+ default.save()
+
+ ImporterDuplicateField = apps.get_model("ishtar_common", "ImporterDuplicateField")
+ for dup in ImporterDuplicateField.objects.filter(field_name__contains='conservatory_state').all():
+ dup.field_name = dup.field_name.replace("conservatory_state", "conservatory_states")
+ dup.save()
+
+ ImportTarget = apps.get_model("ishtar_common", "ImportTarget")
+ for targ in ImportTarget.objects.filter(target__contains='conservatory_state').all():
+ targ.target = targ.target.replace("conservatory_state", "conservatory_states")
+ targ.save()
+
+ FormaterType = apps.get_model("ishtar_common", "FormaterType")
+ for f in FormaterType.objects.filter(options__contains='ConservatoryState').all():
+ f.many_split = '&'
+ f.save()
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_finds', '0122_conservatory_states_m2m'),
+ ]
+
+ operations = [
+ migrations.RunPython(migrate_conservatory_state),
+ migrations.RemoveField(
+ model_name='find',
+ name='conservatory_state',
+ ),
+ migrations.RemoveField(
+ model_name='historicalfind',
+ name='conservatory_state',
+ ),
+ ]
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 977a3ff3b..7e153c6b5 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -1175,7 +1175,7 @@ class Find(
("material_types__label", _("Material type")),
("object_types__label", _("Object type")),
("preservation_to_considers__label", _("Recommended treatments")),
- ("conservatory_state__label", _("Conservatory state")),
+ ("conservatory_states__label", _("Conservatory states")),
("integrities__label", _("Integrity")),
("remarkabilities__label", _("Remarkability")),
("communicabilities__label", _("Communicability")),
@@ -1343,9 +1343,9 @@ class Find(
pgettext_lazy("key for text search", "recommended-treatments"),
"preservation_to_considers__label__iexact",
),
- "conservatory_state": SearchAltName(
+ "conservatory_states": SearchAltName(
pgettext_lazy("key for text search", "conservatory"),
- "conservatory_state__label__iexact",
+ "conservatory_states__label__iexact",
),
"integrities": SearchAltName(
pgettext_lazy("key for text search", "integrity"),
@@ -1922,6 +1922,7 @@ class Find(
"technical_processes",
"datings",
"cultural_attributions",
+ "conservatory_states",
"object_types",
"functional_areas",
"technical_areas",
@@ -1947,6 +1948,7 @@ class Find(
"preservation_to_considers",
"alterations",
"alteration_causes",
+ "conservatory_states",
]
CACHED_LABELS = [
"cache_complete_museum_id",
@@ -1963,6 +1965,7 @@ class Find(
SERIALIZE_PROPERTIES = MainItem.SERIALIZE_PROPERTIES + [
"administrative_index",
"integrities_count",
+ "conservatory_states_count",
"remarkabilities_count",
"cultural_attributions_count",
"documents_count",
@@ -2218,12 +2221,10 @@ class Find(
museum_observed_quantity = models.PositiveSmallIntegerField(_("Observed quantity"), blank=True, null=True)
# preservation module
- conservatory_state = models.ForeignKey(
+ conservatory_states = models.ManyToManyField(
ConservatoryState,
- verbose_name=_("Conservatory state"),
+ verbose_name=_("Conservatory states"),
blank=True,
- null=True,
- on_delete=models.SET_NULL,
)
conservatory_comment = models.TextField(
_("Conservatory comment"), blank=True, default=""
@@ -2692,6 +2693,10 @@ class Find(
return self.integrities.count()
@property
+ def conservatory_states_count(self):
+ return self.conservatory_states.count()
+
+ @property
def remarkabilities_count(self):
return self.remarkabilities.count()
diff --git a/archaeological_finds/templates/ishtar/sheet_find.html b/archaeological_finds/templates/ishtar/sheet_find.html
index 5adcce68a..6af22839f 100644
--- a/archaeological_finds/templates/ishtar/sheet_find.html
+++ b/archaeological_finds/templates/ishtar/sheet_find.html
@@ -312,12 +312,12 @@
</div>
{% endif %}
{% endcomment %}
- {% if item.integrities_count or item.remarkabilities_count or item.conservatory_state or item.conservatory_comment or item.alterations.count or item.alteration_causes.count or item.preservation_to_considers.count or item.appraisal_date or item.treatment_emergency or item.insurance_value or item.estimated_value %}
+ {% if item.integrities_count or item.remarkabilities_count or item.conservatory_states_count or item.conservatory_comment or item.alterations.count or item.alteration_causes.count or item.preservation_to_considers.count or item.appraisal_date or item.treatment_emergency or item.insurance_value or item.estimated_value %}
<h3>{% trans "Preservation" %}</h3>
<div class='row'>
{% field_flex_multiple_obj "Integrity" item 'integrities' %}
{% field_flex_multiple_obj "Remarkability" item 'remarkabilities' %}
- {% field_flex "Conservatory state" item.conservatory_state %}
+ {% field_flex_multiple_obj _("Conservatory states") item 'conservatory_states' %}
{% field_flex_multiple_obj "Alteration" item 'alterations' %}
{% field_flex_multiple_obj "Alteration cause" item 'alteration_causes' %}
{% field_flex_multiple_obj "Recommended treatments" item 'preservation_to_considers' %}
diff --git a/archaeological_finds/templates/ishtar/sheet_museum_find.html b/archaeological_finds/templates/ishtar/sheet_museum_find.html
index 4c3317ba2..4006973d7 100644
--- a/archaeological_finds/templates/ishtar/sheet_museum_find.html
+++ b/archaeological_finds/templates/ishtar/sheet_museum_find.html
@@ -307,12 +307,12 @@
</div>
{% endif %}
{% endcomment %}
- {% if item.integrities_count or item.remarkabilities_count or item.conservatory_state or item.conservatory_comment or item.alterations.count or item.alteration_causes.count or item.preservation_to_considers.count or item.appraisal_date or item.treatment_emergency or item.insurance_value or item.estimated_value %}
+ {% if item.integrities_count or item.remarkabilities_count or item.conservatory_states_count or item.conservatory_comment or item.alterations.count or item.alteration_causes.count or item.preservation_to_considers.count or item.appraisal_date or item.treatment_emergency or item.insurance_value or item.estimated_value %}
<h3>{% trans "Preservation" %}</h3>
<div class='row'>
{% field_flex_multiple_obj "Integrity" item 'integrities' %}
{% field_flex_multiple_obj "Remarkability" item 'remarkabilities' %}
- {% field_flex "Conservatory state" item.conservatory_state %}
+ {% field_flex_multiple_obj _("Conservatory states") item 'conservatory_states' %}
{% field_flex_multiple_obj "Alteration" item 'alterations' %}
{% field_flex_multiple_obj "Alteration cause" item 'alteration_causes' %}
{% field_flex_multiple_obj "Recommended treatments" item 'preservation_to_considers' %}
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py
index c73aff9ae..45f178856 100644
--- a/archaeological_finds/tests.py
+++ b/archaeological_finds/tests.py
@@ -1493,7 +1493,7 @@ class FindSearchTest(FindInit, TestCase, SearchText):
cs3 = models.ConservatoryState.objects.all()[2]
cs3.parent = cs1
cs3.save()
- find.conservatory_state = cs2
+ find.conservatory_states.add(cs2)
find.save()
search = {"search_vector": f'conservatory="{cs2.name}"'}
diff --git a/archaeological_finds/tests/importer-group.zip b/archaeological_finds/tests/importer-group.zip
index dc581c173..e33655f25 100644
--- a/archaeological_finds/tests/importer-group.zip
+++ b/archaeological_finds/tests/importer-group.zip
Binary files differ
diff --git a/archaeological_finds/wizards.py b/archaeological_finds/wizards.py
index 5bf321baf..91795d60e 100644
--- a/archaeological_finds/wizards.py
+++ b/archaeological_finds/wizards.py
@@ -124,7 +124,7 @@ class FindDeletionWizard(MultipleDeletionWizard):
"find_number",
"object_types",
"description",
- "conservatory_state",
+ "conservatory_states",
"mark",
"preservation_to_considers",
"integrities",