diff options
Diffstat (limited to 'archaeological_finds/forms_treatments.py')
| -rw-r--r-- | archaeological_finds/forms_treatments.py | 259 |
1 files changed, 258 insertions, 1 deletions
diff --git a/archaeological_finds/forms_treatments.py b/archaeological_finds/forms_treatments.py index 2c6e49c46..1713bff1a 100644 --- a/archaeological_finds/forms_treatments.py +++ b/archaeological_finds/forms_treatments.py @@ -17,6 +17,7 @@ # See the file COPYING for details. +from copy import copy import datetime import logging from collections import OrderedDict @@ -26,7 +27,7 @@ from django import forms from django.core import validators from django.utils import timezone from ishtar_common.utils import gettext_lazy as _ -from ishtar_common.forms import FormHeader +from ishtar_common.forms import FloatField, FormHeader from archaeological_finds import models from archaeological_operations.forms import AdministrativeActForm, \ @@ -1174,3 +1175,259 @@ class QANewExhibitionLoanForm(IshtarForm): obj = models.TreatmentFile.objects.create(**values) self.exhibition.treatment_files.add(obj) return obj + + +class QAStatementCondition(ManageOldType, forms.Form): + form_label = _("Statement condition") + base_models = [ + "qa_alterations", + "qa_alteration_causes", + "qa_recommended_treatments", + "qa_integrities", + "qa_conservatory_states", + "qa_museum_marking_type", + "qa_museum_inventory_marking_presence" + ] + associated_models = { + "qa_alterations": models.AlterationType, + "qa_alteration_causes": models.AlterationCauseType, + "qa_treatment_emergency_id": models.TreatmentEmergencyType, + "qa_conservatory_states": models.ConservatoryState, + "qa_recommended_treatments": models.RecommendedTreatmentType, + "qa_integrities": models.IntegrityType, + "follow_up_action": models.FollowUpActionType, + "statement_condition_type_id": models.StatementConditionType, + "treatment_person": Person, + "qa_museum_marking_type": models.MarkingType, + "qa_museum_inventory_marking_presence": models.InventoryMarkingPresence, + } + TREATMENT_FIELDS = ("treatment_type", "treatment_person", "treatment_organization") + HEADERS = {} + pk = forms.IntegerField(required=False, widget=forms.HiddenInput) + HEADERS["date"] = FormHeader(_("Statement of condition")) + date = DateField(label=_("Date"), initial=datetime.date.today) + applied = forms.ChoiceField(label=_("Input status"), + choices=models.StatementCondition.APPLIED_CHOICES) + statement_condition_type_id = forms.ChoiceField(label=_("Type"), choices=[], + required=True) + verification_officer_id = forms.IntegerField( + label=_("Verification officer"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-person'), associated_model=Person, + new=True), + validators=[valid_id(Person)], required=False) + campaign_number = forms.CharField(label=_("Campaign/observation number"), + required=False) + report_number = forms.CharField(label=_("Report number"), required=False) + follow_up_action = forms.MultipleChoiceField( + label=_("Follow-up actions"), + choices=[], + widget=widgets.Select2Multiple, + required=False, + ) + observations = forms.CharField(label=_("Observations"), widget=forms.Textarea, + required=False) + + HEADERS["treatment_type"] = FormHeader(_("Treatment"), collapse=True) + treatment_type = forms.ChoiceField(label=_("Treatment type"), choices=[], + required=False) + treatment_person = forms.IntegerField( + label=_("Responsible"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-person'), associated_model=Person, + new=True), + validators=[valid_id(Person)], required=False) + treatment_organization = forms.IntegerField( + label=_("Organization"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-organization'), + associated_model=Organization, new=True), + validators=[valid_id(Organization)], required=False) + + HEADERS["qa_description"] = FormHeader(_("Find")) + qa_description = forms.CharField( + label=_("Description"), widget=forms.Textarea, required=False + ) + + HEADERS["qa_museum_inventory_marking_presence"] = FormHeader(_("Museum")) + qa_museum_inventory_marking_presence = forms.MultipleChoiceField( + label=_("Presence of inventory marking"), + choices=[], + widget=widgets.Select2Multiple, + required=False, + ) + qa_museum_marking_type = forms.MultipleChoiceField( + label=_("Type of marking"), + choices=[], + widget=widgets.Select2Multiple, + required=False, + ) + + HEADERS["find_number"] = FormHeader(_("Dimensions / Quantities")) + qa_find_number = forms.IntegerField(label=_("Number of remains"), required=False) + qa_museum_observed_quantity = forms.IntegerField( + label=_("Observed quantity"), required=False) + qa_length = FloatField( + label=_("Length (cm)"), widget=widgets.CentimeterMeterWidget, required=False + ) + qa_width = FloatField( + label=_("Width (cm)"), required=False, widget=widgets.CentimeterMeterWidget + ) + qa_height = FloatField( + label=_("Height (cm)"), widget=widgets.CentimeterMeterWidget, required=False + ) + qa_thickness = FloatField( + label=_("Thickness (cm)"), widget=widgets.CentimeterMeterWidget, required=False + ) + qa_diameter = FloatField( + label=_("Diameter (cm)"), widget=widgets.CentimeterMeterWidget, required=False + ) + qa_circumference = FloatField( + label=_("Circumference (cm)"), + widget=widgets.CentimeterMeterWidget, + required=False, + ) + qa_volume = FloatField(label=_("Volume (l)"), required=False) + qa_weight = FloatField( + label=_("Weight (g)"), widget=widgets.GramKilogramWidget, required=False + ) + qa_clutter_long_side = FloatField( + label=_("Clutter long side (cm)"), + widget=widgets.CentimeterMeterWidget, + required=False, + ) + qa_clutter_short_side = FloatField( + label=_("Clutter short side (cm)"), + widget=widgets.CentimeterMeterWidget, + required=False, + ) + qa_clutter_height = FloatField( + label=_("Clutter height (cm)"), + widget=widgets.CentimeterMeterWidget, + required=False, + ) + qa_dimensions_comment = forms.CharField( + label=_("Dimensions comment"), required=False, widget=forms.Textarea + ) + + HEADERS["qa_integrities"] = FormHeader(_("Preservation")) + qa_integrities = forms.MultipleChoiceField( + label=_("Integrity"), + choices=[], + widget=widgets.Select2Multiple, + required=False, + ) + qa_conservatory_states = forms.MultipleChoiceField( + label=_("Conservatory states"), + choices=[], + widget=widgets.Select2Multiple, + required=False, + ) + qa_alterations = forms.MultipleChoiceField( + label=_("Alteration"), + choices=[], + widget=widgets.Select2Multiple, + required=False, + ) + qa_alteration_causes = forms.MultipleChoiceField( + label=_("Alteration cause"), + choices=[], + widget=widgets.Select2Multiple, + required=False, + ) + qa_recommended_treatments = forms.MultipleChoiceField( + label=_("Recommended treatments"), + choices=[], + widget=widgets.Select2Multiple, + required=False, + ) + qa_treatment_emergency_id = forms.ChoiceField( + label=_("Treatment emergency"), choices=[], required=False + ) + qa_conservatory_comment = forms.CharField( + label=_("Conservatory comment"), required=False, widget=forms.Textarea + ) + + TYPES = [ + FieldType("qa_alterations", models.AlterationType, True), + FieldType("qa_alteration_causes", models.AlterationCauseType, True), + FieldType("qa_conservatory_states", models.ConservatoryState, is_multiple=True), + FieldType("follow_up_action", models.FollowUpActionType, is_multiple=True), + FieldType("qa_integrities", models.IntegrityType, is_multiple=True), + FieldType("qa_museum_marking_type", models.MarkingType, is_multiple=True), + FieldType("qa_museum_inventory_marking_presence", models.InventoryMarkingPresence, + is_multiple=True), + FieldType("qa_recommended_treatments", models.RecommendedTreatmentType, True), + FieldType("statement_condition_type_id", models.StatementConditionType, + empty_first=False), + FieldType("qa_treatment_emergency_id", models.TreatmentEmergencyType), + FieldType("treatment_type", models.TreatmentType, empty_first=False, + extra_args={'dct': {"is_statement_condition": True}}), + ] + PROFILE_FILTER = { + "museum": ["qa_museum_observed_quantity", "qa_museum_marking_type", + "qa_museum_inventory_marking_presence"] + } + + def __init__(self, *args, **kwargs): + self.current_item = kwargs.pop("current_item") + self.user = None + if 'user' in kwargs: + self.user = kwargs.pop('user') + super().__init__(*args, **kwargs) + if not self.user: + return + q = Person.objects.filter(ishtaruser__pk=self.user.pk) + if q.count(): + person = q.all()[0] + self.fields['treatment_person'].initial = person.pk + self.fields['verification_officer_id'].initial = person.pk + + def save(self): + data = copy(self.cleaned_data) + data["find_id"] = self.current_item.pk + applied = data.pop("applied") + follow_up_actions = data.pop("follow_up_action") + # remove m2m fields + m2m = {} + for m2m_attr in models.StatementCondition.OVERLOADED_M2M_FIELDS: + key = f"qa_{m2m_attr}" + if key in data: + m2m[m2m_attr] = data.pop(key) + # remove treatment fields + treatment = {} + for k in self.TREATMENT_FIELDS: + if k in data.keys(): + treatment[k] = data.pop(k) + # remove "qa_" prefix for remaining fields + for k in list(data.keys()): + if k.startswith("qa_"): + data[k[3:]] = data.pop(k) + created = None + if data.get("pk", None): + # update condition + created = True + pk = data.pop("pk") + models.StatementCondition.objects.filter(pk=pk).update(**data) + st = models.StatementCondition.objects.get(pk=pk) + else: + # new statement condition + st = models.StatementCondition.objects.create(**data) + st.follow_up_actions.clear() + for action in follow_up_actions: + st.follow_up_actions.add(action) + for m2m_attr, value in m2m.items(): + # update m2m + value = list(sorted([int(v) for v in value])) + if not created: + current_value = getattr(st, m2m_attr).values_list( + "pk", flat=True).order_by("pk") + if current_value == value: + continue + getattr(st, m2m_attr).clear() + getattr(st, m2m_attr).add(*value) + if applied == "D": + # draft exit + return + st.applied = applied + st.apply_validation(treatment) |
