Refactor the message generation to delay the formatting.

This commit is contained in:
Xavier Ordoquy 2015-10-19 22:42:52 +02:00
parent 1ce88beff0
commit 3a4be046bd
2 changed files with 19 additions and 32 deletions

View File

@ -114,24 +114,11 @@ def get_model_name(model_cls):
return model_cls._meta.module_name
class CustomValidatorMessage(object):
def __init__(self, *args, **kwargs):
self.message = kwargs.pop('message', self.message)
self.format = kwargs.pop('string_format', '%')
super(CustomValidatorMessage, self).__init__(*args, **kwargs)
def __call__(self, value):
cleaned = self.clean(value)
params = {'limit_value': self.limit_value, 'show_value': cleaned, 'value': value}
if self.compare(cleaned, self.limit_value):
message = self.message
if self.format == '{':
args = {self.code: self.limit_value}
message = message.format(**args)
raise ValidationError(message, code=self.code, params=params)
class MinValueValidator(CustomValidatorMessage, MinValueValidator):
pass

View File

@ -17,7 +17,7 @@ from django.forms import ImageField as DjangoImageField
from django.utils import six, timezone
from django.utils.dateparse import parse_date, parse_datetime, parse_time
from django.utils.encoding import is_protected_type, smart_text
from django.utils.functional import cached_property
from django.utils.functional import cached_property, lazy
from django.utils.ipv6 import clean_ipv6_address
from django.utils.translation import ugettext_lazy as _
@ -675,11 +675,11 @@ class CharField(Field):
self.min_length = kwargs.pop('min_length', None)
super(CharField, self).__init__(**kwargs)
if self.max_length is not None:
message = self.error_messages['max_length']
self.validators.append(MaxLengthValidator(self.max_length, message=message, string_format='{'))
message = lazy(self.error_messages['max_length'].format, str)(max_length=self.max_length)
self.validators.append(MaxLengthValidator(self.max_length, message=message))
if self.min_length is not None:
message = self.error_messages['min_length']
self.validators.append(MinLengthValidator(self.min_length, message=message, string_format='{'))
message = lazy(self.error_messages['min_length'].format, str)(min_length=self.min_length)
self.validators.append(MinLengthValidator(self.min_length, message=message))
def run_validation(self, data=empty):
# Test for the empty string here so that it does not get validated,
@ -820,11 +820,11 @@ class IntegerField(Field):
self.min_value = kwargs.pop('min_value', None)
super(IntegerField, self).__init__(**kwargs)
if self.max_value is not None:
message = self.error_messages['max_value']
self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{'))
message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value)
self.validators.append(MaxValueValidator(self.max_value, message=message))
if self.min_value is not None:
message = self.error_messages['min_value']
self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{'))
message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value)
self.validators.append(MinValueValidator(self.min_value, message=message))
def to_internal_value(self, data):
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
@ -854,11 +854,11 @@ class FloatField(Field):
self.min_value = kwargs.pop('min_value', None)
super(FloatField, self).__init__(**kwargs)
if self.max_value is not None:
message = self.error_messages['max_value']
self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{'))
message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value)
self.validators.append(MaxValueValidator(self.max_value, message=message))
if self.min_value is not None:
message = self.error_messages['min_value']
self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{'))
message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value)
self.validators.append(MinValueValidator(self.min_value, message=message))
def to_internal_value(self, data):
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
@ -903,11 +903,11 @@ class DecimalField(Field):
super(DecimalField, self).__init__(**kwargs)
if self.max_value is not None:
message = self.error_messages['max_value']
self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{'))
message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value)
self.validators.append(MaxValueValidator(self.max_value, message=message))
if self.min_value is not None:
message = self.error_messages['min_value']
self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{'))
message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value)
self.validators.append(MinValueValidator(self.min_value, message=message))
def to_internal_value(self, data):
"""
@ -1606,8 +1606,8 @@ class ModelField(Field):
max_length = kwargs.pop('max_length', None)
super(ModelField, self).__init__(**kwargs)
if max_length is not None:
message = self.error_messages['max_length']
self.validators.append(MaxLengthValidator(max_length, message=message, string_format='{'))
message = lazy(self.error_messages['max_length'].format, str)(max_length=max_length)
self.validators.append(MaxLengthValidator(max_length, message=message))
def to_internal_value(self, data):
rel = getattr(self.model_field, 'rel', None)