Add workarounds for serializer __repr__ ordering

This commit is contained in:
Carlton Gibson 2017-11-15 12:26:04 +01:00
parent 682c98958a
commit 826fd76825
2 changed files with 15 additions and 10 deletions

View File

@ -3,6 +3,7 @@ Helper functions for mapping model fields to a dictionary of default
keyword arguments that should be used for their equivalent serializer fields. keyword arguments that should be used for their equivalent serializer fields.
""" """
import inspect import inspect
from collections import OrderedDict
from django.core import validators from django.core import validators
from django.db import models from django.db import models
@ -130,10 +131,11 @@ def get_field_kwargs(field_name, model_field):
max_value, message = next(( max_value, message = next((
(validator.limit_value, validator.message) for validator in validator_kwarg (validator.limit_value, validator.message) for validator in validator_kwarg
if isinstance(validator, validators.MaxValueValidator) if isinstance(validator, validators.MaxValueValidator)
), (None, None)) ), (None, ''))
if max_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): if max_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES):
kwargs['max_value'] = max_value kwargs['max_value'] = max_value
kwargs['error_messages'] = {'max_value': message} if message != '':
kwargs.setdefault('error_messages', OrderedDict()).update(max_value=message)
validator_kwarg = [ validator_kwarg = [
validator for validator in validator_kwarg validator for validator in validator_kwarg
if not isinstance(validator, validators.MaxValueValidator) if not isinstance(validator, validators.MaxValueValidator)
@ -144,10 +146,11 @@ def get_field_kwargs(field_name, model_field):
min_value, message = next(( min_value, message = next((
(validator.limit_value, validator.message) for validator in validator_kwarg (validator.limit_value, validator.message) for validator in validator_kwarg
if isinstance(validator, validators.MinValueValidator) if isinstance(validator, validators.MinValueValidator)
), (None, None)) ), (None, ''))
if min_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): if min_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES):
kwargs['min_value'] = min_value kwargs['min_value'] = min_value
kwargs.setdefault('error_messages', {}).update(min_value=message) if message != '':
kwargs.setdefault('error_messages', OrderedDict()).update(min_value=message)
validator_kwarg = [ validator_kwarg = [
validator for validator in validator_kwarg validator for validator in validator_kwarg
if not isinstance(validator, validators.MinValueValidator) if not isinstance(validator, validators.MinValueValidator)
@ -202,9 +205,9 @@ def get_field_kwargs(field_name, model_field):
isinstance(model_field, models.TextField) or isinstance(model_field, models.TextField) or
isinstance(model_field, models.FileField)): isinstance(model_field, models.FileField)):
kwargs['max_length'] = max_length kwargs['max_length'] = max_length
custom_message = model_field.error_messages.get("max_length", None) custom_message = model_field.error_messages.get("max_length", '')
if custom_message is not None: if custom_message != '':
kwargs.setdefault('error_messages', {}).update(max_length=custom_message) kwargs.setdefault('error_messages', OrderedDict()).update(max_length=custom_message)
validator_kwarg = [ validator_kwarg = [
validator for validator in validator_kwarg validator for validator in validator_kwarg
if not isinstance(validator, validators.MaxLengthValidator) if not isinstance(validator, validators.MaxLengthValidator)
@ -215,10 +218,11 @@ def get_field_kwargs(field_name, model_field):
min_length, message = next(( min_length, message = next((
(validator.limit_value, validator.message) for validator in validator_kwarg (validator.limit_value, validator.message) for validator in validator_kwarg
if isinstance(validator, validators.MinLengthValidator) if isinstance(validator, validators.MinLengthValidator)
), (None, None)) ), (None, ''))
if min_length is not None and isinstance(model_field, models.CharField): if min_length is not None and isinstance(model_field, models.CharField):
kwargs['min_length'] = min_length kwargs['min_length'] = min_length
kwargs.setdefault('error_messages', {}).update(min_length=message) if message != '':
kwargs.setdefault('error_messages', OrderedDict()).update(min_length=message)
validator_kwarg = [ validator_kwarg = [
validator for validator in validator_kwarg validator for validator in validator_kwarg
if not isinstance(validator, validators.MinLengthValidator) if not isinstance(validator, validators.MinLengthValidator)

View File

@ -200,7 +200,7 @@ class TestRegularFieldMappings(TestCase):
expected = dedent(""" expected = dedent("""
TestSerializer(): TestSerializer():
id = IntegerField(label='ID', read_only=True) id = IntegerField(label='ID', read_only=True)
value_limit_field = IntegerField(error_messages={'max_value': 'Ensure this value is less than or equal to %(limit_value)s.', 'min_value': 'Ensure this value is greater than or equal to %(limit_value)s.'}, max_value=10, min_value=1) value_limit_field = IntegerField(error_messages=OrderedDict([('max_value', 'Ensure this value is less than or equal to %(limit_value)s.'), ('min_value', 'Ensure this value is greater than or equal to %(limit_value)s.')]), max_value=10, min_value=1)
length_limit_field = CharField(max_length=12, min_length=3) length_limit_field = CharField(max_length=12, min_length=3)
blank_field = CharField(allow_blank=True, max_length=10, required=False) blank_field = CharField(allow_blank=True, max_length=10, required=False)
null_field = IntegerField(allow_null=True, required=False) null_field = IntegerField(allow_null=True, required=False)
@ -218,6 +218,7 @@ class TestRegularFieldMappings(TestCase):
"{'max_value': 'Ensure this value is less than or equal to %(limit_value)s.', 'min_value': 'Ensure this value is greater than or equal to %(limit_value)s.'}", "{'max_value': 'Ensure this value is less than or equal to %(limit_value)s.', 'min_value': 'Ensure this value is greater than or equal to %(limit_value)s.'}",
"{'max_value': u'Ensure this value is less than or equal to %(limit_value)s.', 'min_value': u'Ensure this value is greater than or equal to %(limit_value)s.'}" "{'max_value': u'Ensure this value is less than or equal to %(limit_value)s.', 'min_value': u'Ensure this value is greater than or equal to %(limit_value)s.'}"
) )
self.maxDiff = None
self.assertEqual(unicode_repr(TestSerializer()), expected) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_method_field(self): def test_method_field(self):