From b1f08426470580c9ce42470a0b0ac4d03db92e72 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 26 Jan 2022 08:53:07 +0100 Subject: [PATCH] fields: prevent PercentagePerYearField to be strings (#326) --- eo_gestion/eo_facture/fields.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/eo_gestion/eo_facture/fields.py b/eo_gestion/eo_facture/fields.py index 437f656..cb2b447 100644 --- a/eo_gestion/eo_facture/fields.py +++ b/eo_gestion/eo_facture/fields.py @@ -97,6 +97,20 @@ class PercentagePerYearFormField(forms.Field): return parse_percentage_per_year(value) +class PercentagePerYearDescriptor: + def __init__(self, field): + self.field = field + + def __set__(self, obj, value): + if isinstance(value, str): + value = parse_percentage_per_year(value) + if isinstance(value, list) and not isinstance(value, PercentagePerYear): + value = PercentagePerYear(value) + if not isinstance(value, PercentagePerYear): + raise ValueError('PercentagePerYear value expected') + obj.__dict__[self.field.name] = value + + class PercentagePerYearField(models.Field): default_validators = [check_percentage_per_year] @@ -143,3 +157,7 @@ class PercentagePerYearField(models.Field): defaults = {"form_class": PercentagePerYearFormField} defaults.update(kwargs) return super().formfield(**kwargs) + + def contribute_to_class(self, cls, name, **kwargs): + super().contribute_to_class(cls, name, **kwargs) + setattr(cls, self.name, PercentagePerYearDescriptor(self))