fields: prevent PercentagePerYearField to be strings (#326)

This commit is contained in:
Benjamin Dauvergne 2022-01-26 08:53:07 +01:00
parent 1707e20bd6
commit b1f0842647
1 changed files with 18 additions and 0 deletions

View File

@ -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))