summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2026-06-23 18:37:51 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2026-06-23 18:37:51 +0200
commitdf2beeb71cfa19f33ac735790bcdcc33c4425c19 (patch)
tree29d3c8bd84b73f7c6a42374c0b982027c5e95817
parent04a7a704ce8f6a8c2f2c47ecb096296095104ca1 (diff)
downloadIshtar-df2beeb71cfa19f33ac735790bcdcc33c4425c19.tar.bz2
Ishtar-df2beeb71cfa19f33ac735790bcdcc33c4425c19.zip
WIP sorting "diff" statement conditiondevelop-5.0
-rw-r--r--archaeological_finds/forms_treatments.py15
-rw-r--r--archaeological_finds/models_finds.py4
-rw-r--r--archaeological_finds/models_treatments.py90
3 files changed, 75 insertions, 34 deletions
diff --git a/archaeological_finds/forms_treatments.py b/archaeological_finds/forms_treatments.py
index 53a928fd8..fa9a03118 100644
--- a/archaeological_finds/forms_treatments.py
+++ b/archaeological_finds/forms_treatments.py
@@ -1258,7 +1258,7 @@ class QAStatementCondition(ManageOldType, forms.Form):
"qa_integrities",
"qa_conservatory_states",
"qa_museum_marking_type",
- "qa_museum_inventory_marking_presence"
+ "qa_museum_inventory_marking_presence",
]
associated_models = {
"qa_alterations": models.AlterationType,
@@ -1271,6 +1271,7 @@ class QAStatementCondition(ManageOldType, forms.Form):
"statement_condition_type_id": models.StatementConditionType,
"qa_museum_marking_type": models.MarkingType,
"qa_museum_inventory_marking_presence": models.InventoryMarkingPresence,
+ "qa_museum_inventory_conformity_id": models.InventoryConformity,
}
HEADERS = {}
pk = forms.IntegerField(required=False, widget=forms.HiddenInput)
@@ -1323,9 +1324,18 @@ class QAStatementCondition(ManageOldType, forms.Form):
widget=widgets.Select2Multiple,
required=False,
)
+ qa_mark_text = forms.CharField(label=_("Transcription of the marking"), required=False)
+ qa_mark = forms.CharField(label=_("Marking details"), widget=forms.Textarea, required=False)
+ qa_museum_inventory_conformity_id = forms.ChoiceField(
+ label=_("Conformity with inventory"), required=False, choices=[]
+ )
+ qa_museum_conformity_comment = forms.CharField(
+ label=_("Comment on conformity"), widget=forms.Textarea, required=False
+ )
- HEADERS["find_number"] = FormHeader(_("Dimensions / Quantities"))
+ HEADERS["qa_find_number"] = FormHeader(_("Dimensions / Quantities"))
qa_find_number = forms.IntegerField(label=_("Number of remains"), required=False)
+ qa_museum_inventory_quantity = forms.IntegerField(label=_("Inventory quantity"), required=False, max_value=32000)
qa_museum_observed_quantity = forms.IntegerField(
label=_("Observed quantity"), required=False)
qa_length = FloatField(
@@ -1422,6 +1432,7 @@ class QAStatementCondition(ManageOldType, forms.Form):
FieldType("statement_condition_type_id", models.StatementConditionType,
empty_first=False),
FieldType("qa_treatment_emergency_id", models.TreatmentEmergencyType),
+ FieldType("qa_museum_inventory_conformity_id", models.InventoryConformity),
]
PROFILE_FILTER = {
"museum": ["qa_museum_observed_quantity", "qa_museum_marking_type",
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index dc62789d5..01240d15d 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -2858,8 +2858,10 @@ class Find(
for idx, state in enumerate(statement_conditions_list):
diff = {}
initial = {} if not idx else None
- for field in StatementCondition._meta.get_fields():
+ # for field in StatementCondition._meta.get_fields():
+ for field in StatementCondition.get_model_fields():
attr = field.name
+ print(attr)
if attr in StatementCondition.OVERLOADED_FIELDS:
previous_value = getattr(previous, attr) or None
value = getattr(state, attr) or None
diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py
index 5a0fdde32..53f7921cc 100644
--- a/archaeological_finds/models_treatments.py
+++ b/archaeological_finds/models_treatments.py
@@ -18,6 +18,7 @@
# See the file COPYING for details.
import datetime
+import itertools
# nosec: used to build a controlled XML
import lxml.etree # nosec
import lxml.builder # nosec
@@ -1714,6 +1715,11 @@ class StatementCondition(
"dimensions_comment",
"treatment_emergency_id",
"find_number",
+ "mark_text",
+ "mark",
+ "museum_inventory_conformity_id",
+ "museum_conformity_comment",
+ "museum_inventory_quantity",
"museum_observed_quantity",
)
OVERLOADED_M2M_FIELDS = (
@@ -1753,38 +1759,8 @@ class StatementCondition(
observations = models.TextField(_("Observations"), blank=True, default="")
# find field
- integrities = models.ManyToManyField(
- "IntegrityType",
- verbose_name=_("Integrity"),
- blank=True,
- )
- conservatory_states = models.ManyToManyField(
- "ConservatoryState",
- verbose_name=_("Conservatory states"),
- blank=True,
- )
- recommended_treatments = models.ManyToManyField(
- "RecommendedTreatmentType",
- verbose_name=_("Recommended treatments"),
- blank=True,
- )
- treatment_emergency = models.ForeignKey(
- "TreatmentEmergencyType",
- verbose_name=_("Treatment emergency"),
- on_delete=models.SET_NULL,
- blank=True,
- null=True,
- )
- conservatory_comment = models.TextField(
- _("Conservatory comment"), blank=True, default=""
- )
- alterations = models.ManyToManyField(
- "AlterationType", verbose_name=_("Alteration"), blank=True
- )
- alteration_causes = models.ManyToManyField(
- "AlterationCauseType", verbose_name=_("Alteration cause"), blank=True,
- )
description = models.TextField(_("Description"), blank=True, default="")
+
# find fields - museum
museum_inventory_marking_presence = models.ManyToManyField(
"InventoryMarkingPresence", blank=True, related_name="statement_conditions",
@@ -1803,6 +1779,7 @@ class StatementCondition(
)
museum_conformity_comment = models.TextField(_("Comment on conformity"), blank=True,
default="")
+
# find field - dimensions
find_number = models.IntegerField(_("Number of remains"), blank=True, null=True)
museum_inventory_quantity = models.PositiveSmallIntegerField(
@@ -1831,6 +1808,38 @@ class StatementCondition(
dimensions_comment = models.TextField(
_("Dimensions comment"), blank=True, default=""
)
+ # conservation
+ integrities = models.ManyToManyField(
+ "IntegrityType",
+ verbose_name=_("Integrity"),
+ blank=True,
+ )
+ conservatory_states = models.ManyToManyField(
+ "ConservatoryState",
+ verbose_name=_("Conservatory states"),
+ blank=True,
+ )
+ recommended_treatments = models.ManyToManyField(
+ "RecommendedTreatmentType",
+ verbose_name=_("Recommended treatments"),
+ blank=True,
+ )
+ treatment_emergency = models.ForeignKey(
+ "TreatmentEmergencyType",
+ verbose_name=_("Treatment emergency"),
+ on_delete=models.SET_NULL,
+ blank=True,
+ null=True,
+ )
+ conservatory_comment = models.TextField(
+ _("Conservatory comment"), blank=True, default=""
+ )
+ alterations = models.ManyToManyField(
+ "AlterationType", verbose_name=_("Alteration"), blank=True
+ )
+ alteration_causes = models.ManyToManyField(
+ "AlterationCauseType", verbose_name=_("Alteration cause"), blank=True,
+ )
# documents
documents = models.ManyToManyField(
Document,
@@ -1863,6 +1872,25 @@ class StatementCondition(
lbl += f" - {self.find}"
return lbl
+ @classmethod
+ def get_model_fields(cls):
+ """
+ Get fields sorted by declaration
+ """
+ # django's Field class defines custom __eq__ and __lt__ methods that
+ # reference an internal creation_counter. This allows to construct a
+ # list of all the fields on the model, and simply use sorted to get
+ # them in the order.
+ sortable_private_fields = [
+ f for f in cls._meta.private_fields
+ if isinstance(f, Field)
+ ]
+ return sorted(
+ itertools.chain(
+ cls._meta.concrete_fields, sortable_private_fields,
+ cls._meta.many_to_many)
+ )
+
def pk_str(self):
return str(self.pk)