diff options
Diffstat (limited to 'archaeological_finds/models_treatments.py')
| -rw-r--r-- | archaeological_finds/models_treatments.py | 157 |
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() |
