From f5c5da72fc90ae6cb5dafe97ba2a2f3f9013f210 Mon Sep 17 00:00:00 2001 From: Stuart Axon Date: Thu, 7 Apr 2022 13:08:52 +0100 Subject: [PATCH 1/2] MeasureCondition: Add docsting and simplify description andcondition_string properties. --- measures/models.py | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/measures/models.py b/measures/models.py index defa49fe6..aeeacf92b 100644 --- a/measures/models.py +++ b/measures/models.py @@ -804,11 +804,14 @@ def is_certificate_required(self): @property def description(self) -> str: - out: list[str] = [] + """ + Human-readable description built from associated actions and conditions. - out.append( - f"Condition of type {self.condition_code.code} - {self.condition_code.description}", - ) + :dependencies: with_reference_price_string must be called in queries using this property. + """ + out: list[str] = [ + f"Condition of type {self.condition_code.code} - {self.condition_code.description}" + ] if self.required_certificate: out.append( @@ -829,19 +832,27 @@ def description(self) -> str: @property def condition_string(self) -> str: - out: list[str] = [] + """ + Returns a string representation of the component conditions. - components = self.components.latest_approved() + This is the duty_sentence, if there is one measure, measure_type and additional_code or + if there are more than one measure_type and additional_code. + + :dependencies: with_duty_sentence must be called in queries using this property. + """ measures: set[str] = set() measure_types: set[str] = set() additional_codes: set[str] = set() - for mcc in components: - measures.add(mcc.condition.dependent_measure.sid) - measure_types.add(mcc.condition.dependent_measure.measure_type.sid) - if mcc.condition.dependent_measure.additional_code: + for mcc in self.components.latest_approved(): + # TODO ^ select_related condition_measure, condition_measure.measure_type ? + condition_measure = mcc.condition.dependent_measure + + measures.add(condition_measure.sid) + measure_types.add(condition_measure.measure_type.sid) + if condition_measure.additional_code: additional_codes.add( - mcc.condition.dependent_measure.additional_code.sid, + condition_measure.additional_code.sid, ) if ( @@ -849,9 +860,9 @@ def condition_string(self) -> str: or len(measure_types) > 1 or len(additional_codes) > 1 ): - out.append(self.duty_sentence) + return self.duty_sentence - return "".join(out) + return "" class MeasureConditionComponent(TrackedModel): From 9f5387761c6bb7bec80a8bc4d49ed4a22facece7 Mon Sep 17 00:00:00 2001 From: Stuart Axon Date: Thu, 7 Apr 2022 13:26:25 +0100 Subject: [PATCH 2/2] In common override post() instead of allowing form_valid to call form_invalid if business rules are violated. --- common/views.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/common/views.py b/common/views.py index 42b27170c..8b8395443 100644 --- a/common/views.py +++ b/common/views.py @@ -347,11 +347,19 @@ def form_violates(self, form) -> bool: return violations - def form_valid(self, form): - if self.form_violates(form): - return self.form_invalid(form) + def post(self, request, *args, **kwargs): + """ + Handle POST requests: instantiate a form instance with the passed + POST variables and then check if it's valid. - return super().form_valid(form) + Override the default form .post() method to check business rules + when the form is otherwise valid. + """ + form = self.get_form() + if form.is_valid() and not self.form_violates(form): + return self.form_valid(form) + else: + return self.form_invalid(form) class TrackedModelChangeView(