summaryrefslogtreecommitdiff
path: root/archaeological_finds/models_treatments.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_finds/models_treatments.py')
-rw-r--r--archaeological_finds/models_treatments.py157
1 files changed, 135 insertions, 22 deletions
diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py
index e9cb727ea..c454c0610 100644
--- a/archaeological_finds/models_treatments.py
+++ b/archaeological_finds/models_treatments.py
@@ -61,6 +61,7 @@ from ishtar_common.models import (
SearchVectorConfig,
ValueGetter,
)
+from ishtar_common.data_importer import post_importer_action
from ishtar_common.models_common import (
CompleteIdentifierItem,
IdentifierItem,
@@ -1700,6 +1701,7 @@ class StatementCondition(
# associated find
OVERLOADED_FIELDS = (
"description",
+ "denomination",
"conservatory_comment",
"length",
"width",
@@ -1717,15 +1719,24 @@ class StatementCondition(
"find_number",
"mark_text",
"mark",
+ "object_type_quality_id",
+ "material_type_quality_id",
+ "material_comment",
"museum_inventory_conformity_id",
"museum_conformity_comment",
"museum_inventory_quantity",
"museum_observed_quantity",
+ "quantity_comment",
+ "conservatory_states_details",
+ "alteration_comment",
)
OVERLOADED_M2M_FIELDS = (
+ "object_types",
+ "material_types",
"integrities",
"conservatory_states",
"recommended_treatments",
+ "technical_processes",
"alterations",
"alteration_causes",
"museum_marking_type",
@@ -1742,24 +1753,58 @@ class StatementCondition(
last = models.BooleanField(_("Last"), default=True)
find = models.ForeignKey(Find, verbose_name=_("Find"), on_delete=models.CASCADE,
related_name="statement_conditions")
+ statement_condition_type = models.ForeignKey(
+ StatementConditionType, verbose_name=_("Type"), on_delete=models.PROTECT)
treatment = models.ForeignKey(
Treatment, verbose_name=_("Treatment"), on_delete=models.SET_NULL,
null=True, blank=True, related_name="statement_conditions")
- campaign_number = models.TextField(_("Campaign/observation number"), default="",
- blank=True)
- report_number = models.TextField(_("Report number"), default="", blank=True)
- verification_officers = models.TextField(_("Verification officers"), default="", blank=True)
in_charge = models.ForeignKey(
Person, verbose_name=_("In charge"), null=True, blank=True,
on_delete=models.SET_NULL)
- statement_condition_type = models.ForeignKey(
- StatementConditionType, verbose_name=_("Type"), on_delete=models.PROTECT)
+ verification_officers = models.TextField(_("Verification officers"), default="", blank=True)
+ campaign_number = models.TextField(_("Campaign/observation number"), default="",
+ blank=True)
+ report_number = models.TextField(_("Report number"), default="", blank=True)
follow_up_actions = models.ManyToManyField(
FollowUpActionType, verbose_name=_("Follow-up actions"), blank=True
)
observations = models.TextField(_("Observations"), blank=True, default="")
# find field
+ denomination = models.TextField(_("Denomination"), blank=True, default="")
+ object_types = models.ManyToManyField(
+ "ObjectType", verbose_name=_("Object types"),blank=True,
+ related_name="statement_conditions"
+ )
+ object_type_quality = models.ForeignKey(
+ "ObjectTypeQualityType",
+ verbose_name=_("Object type quality"),
+ related_name="statement_conditions",
+ on_delete=models.SET_NULL,
+ blank=True,
+ null=True,
+ )
+ material_types = models.ManyToManyField(
+ "MaterialType", verbose_name=_("Material types"),
+ related_name="statement_conditions", blank=True
+ )
+ material_type_quality = models.ForeignKey(
+ "MaterialTypeQualityType",
+ verbose_name=_("Material type quality"),
+ related_name="statement_conditions",
+ on_delete=models.SET_NULL,
+ blank=True,
+ null=True,
+ )
+ material_comment = models.TextField(
+ _("Comment on the material"), blank=True, default=""
+ )
+ technical_processes = models.ManyToManyField(
+ "TechnicalProcessType",
+ verbose_name=_("Technical processes"),
+ related_name="statement_conditions",
+ blank=True,
+ )
description = models.TextField(_("Description"), blank=True, default="")
# find fields - museum
@@ -1789,6 +1834,9 @@ class StatementCondition(
museum_observed_quantity = models.PositiveSmallIntegerField(
_("Observed quantity"), blank=True, null=True
)
+ quantity_comment = models.TextField(
+ _("Comment on quantity"), blank=True, default=""
+ )
length = models.FloatField(_("Length (cm)"), blank=True, null=True)
width = models.FloatField(_("Width (cm)"), blank=True, null=True)
height = models.FloatField(_("Height (cm)"), blank=True, null=True)
@@ -1815,12 +1863,23 @@ class StatementCondition(
verbose_name=_("Integrity"),
blank=True,
)
+ conservatory_states = models.ManyToManyField(
+ "ConservatoryState",
+ verbose_name=_("Conservatory states"),
+ blank=True,
+ )
+ conservatory_states_details = models.TextField(
+ _("Conservatory state details"), blank=True, default=""
+ )
alterations = models.ManyToManyField(
"AlterationType", verbose_name=_("Alteration"), blank=True
)
alteration_causes = models.ManyToManyField(
"AlterationCauseType", verbose_name=_("Alteration cause"), blank=True,
)
+ alteration_comment = models.TextField(
+ _("Details regards alterations"), blank=True, default=""
+ )
recommended_treatments = models.ManyToManyField(
"RecommendedTreatmentType",
verbose_name=_("Recommended treatments"),
@@ -1833,11 +1892,6 @@ class StatementCondition(
blank=True,
null=True,
)
- conservatory_states = models.ManyToManyField(
- "ConservatoryState",
- verbose_name=_("Conservatory states"),
- blank=True,
- )
conservatory_comment = models.TextField(
_("Conservatory comment"), blank=True, default=""
)
@@ -1898,6 +1952,44 @@ class StatementCondition(
def _get_base_image_path(self):
return f"{self.SLUG}/{self.date.year}"
+ @post_importer_action
+ def set_default_from_find(self, context, v):
+ """
+ Set statement condition attributes from find
+ """
+ if not v:
+ return
+ initial = self.get_initial_from_find(self.find, prefix="")
+ for key, value in initial.items():
+ if not value:
+ continue
+ if key in self.OVERLOADED_FIELDS:
+ # simple attr
+ current_value = getattr(self, key)
+ if current_value: # attr set
+ continue
+ setattr(self, key, value)
+ continue
+ # m2m
+ if getattr(self, key).exists(): # attr set
+ continue
+ getattr(self, key).add(*value)
+ return
+
+ set_default_from_find.post_save = True
+
+ @post_importer_action
+ def set_apply_validation(self, context, v):
+ """
+ Apply validation to find.
+ """
+ if not v:
+ return
+ self.apply_validation()
+ return self
+
+ set_apply_validation.post_save = True
+
@property
def is_last(self):
return not self.__class__.objects.filter(
@@ -1953,6 +2045,18 @@ class StatementCondition(
)
return initial
+ def _check_initial(self):
+ """
+ Verify that there is only one initial statement condition
+ for this find. If there is many, set only the older to initial.
+ """
+ q = self.__class__.objects.filter(find_id=self.find_id,
+ initial=True)
+ if q.count() < 2:
+ return
+ older = q.order_by("date", "pk").all()[0]
+ q.exclude(pk=older.pk).update(initial=False)
+
def _check_apply_validation(self):
if not self.pk:
# no previous state so apply immediatly
@@ -1979,6 +2083,7 @@ class StatementCondition(
obj.last = False
obj.in_charge = None
obj.treatment = None
+ obj.date = obj.find.created
for k in ("campaign_number", "report_number", "observations",
"verification_officers"):
setattr(obj, k, "")
@@ -1993,6 +2098,17 @@ class StatementCondition(
continue
getattr(obj, attr).add(*value)
+ @staticmethod
+ def _get_m2m(item: "MainItem", attr: str) -> list:
+ """
+ Get m2m ids from one item.
+ """
+ return list(
+ sorted(
+ list(getattr(item, attr).values_list("id", flat=True))
+ )
+ )
+
def apply_validation(self):
"""
Copy statement condition fields to the associated find
@@ -2005,16 +2121,8 @@ class StatementCondition(
for attr in self.OVERLOADED_FIELDS:
setattr(self.find, attr, getattr(self, attr))
for attr in self.OVERLOADED_M2M_FIELDS:
- m2m = list(
- sorted(
- list(getattr(self.find, attr).values_list("id", flat=True))
- )
- )
- new_m2m = list(
- sorted(
- list(getattr(self, attr).values_list("id", flat=True))
- )
- )
+ m2m = self._get_m2m(self.find, attr)
+ new_m2m = self._get_m2m(self, attr)
if m2m == new_m2m:
continue
getattr(self.find, attr).clear()
@@ -2063,9 +2171,14 @@ class StatementCondition(
def save(self, *args, **kwargs):
apply_validation = False
- if self.applied in ("V", "T"):
+ if self.pk and self.applied == "V" and \
+ self.__class__.objects.filter(
+ pk=self.pk).values_list("applied", flat=True)[0] == "D":
+ raise
+ # only apply when "applied" is from D to V
apply_validation = self._check_apply_validation()
super().save(*args, **kwargs)
+ self._check_initial()
if apply_validation:
self.apply_validation()