diff options
| author | Tom Christie | 2015-02-21 15:31:02 +0000 | 
|---|---|---|
| committer | Tom Christie | 2015-02-21 15:31:02 +0000 | 
| commit | b69032f3a794bbc45974a6b362b186c494373ae1 (patch) | |
| tree | 1bc222da8bdeef69039c0224b32592e9e1ba03d0 | |
| parent | bab36779a0e771ec35a124edaa4cc4ad5303afdc (diff) | |
| parent | 91416632a86f518a043ac1b82da3d1774701ba96 (diff) | |
| download | django-rest-framework-b69032f3a794bbc45974a6b362b186c494373ae1.tar.bz2 | |
Merge pull request #2586 from rense/master
Set field max_length/max_value as actual attribute.
| -rw-r--r-- | rest_framework/fields.py | 65 | ||||
| -rw-r--r-- | rest_framework/metadata.py | 8 | ||||
| -rw-r--r-- | tests/test_metadata.py | 17 | 
3 files changed, 55 insertions, 35 deletions
| diff --git a/rest_framework/fields.py b/rest_framework/fields.py index a5348922..13ea6dde 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -556,15 +556,15 @@ class CharField(Field):      def __init__(self, **kwargs):          self.allow_blank = kwargs.pop('allow_blank', False)          self.trim_whitespace = kwargs.pop('trim_whitespace', True) -        max_length = kwargs.pop('max_length', None) -        min_length = kwargs.pop('min_length', None) +        self.max_length = kwargs.pop('max_length', None) +        self.min_length = kwargs.pop('min_length', None)          super(CharField, self).__init__(**kwargs) -        if max_length is not None: -            message = self.error_messages['max_length'].format(max_length=max_length) -            self.validators.append(MaxLengthValidator(max_length, message=message)) -        if min_length is not None: -            message = self.error_messages['min_length'].format(min_length=min_length) -            self.validators.append(MinLengthValidator(min_length, message=message)) +        if self.max_length is not None: +            message = self.error_messages['max_length'].format(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'].format(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, @@ -658,15 +658,15 @@ class IntegerField(Field):      MAX_STRING_LENGTH = 1000  # Guard against malicious string inputs.      def __init__(self, **kwargs): -        max_value = kwargs.pop('max_value', None) -        min_value = kwargs.pop('min_value', None) +        self.max_value = kwargs.pop('max_value', None) +        self.min_value = kwargs.pop('min_value', None)          super(IntegerField, self).__init__(**kwargs) -        if max_value is not None: -            message = self.error_messages['max_value'].format(max_value=max_value) -            self.validators.append(MaxValueValidator(max_value, message=message)) -        if min_value is not None: -            message = self.error_messages['min_value'].format(min_value=min_value) -            self.validators.append(MinValueValidator(min_value, message=message)) +        if self.max_value is not None: +            message = self.error_messages['max_value'].format(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'].format(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: @@ -692,15 +692,15 @@ class FloatField(Field):      MAX_STRING_LENGTH = 1000  # Guard against malicious string inputs.      def __init__(self, **kwargs): -        max_value = kwargs.pop('max_value', None) -        min_value = kwargs.pop('min_value', None) +        self.max_value = kwargs.pop('max_value', None) +        self.min_value = kwargs.pop('min_value', None)          super(FloatField, self).__init__(**kwargs) -        if max_value is not None: -            message = self.error_messages['max_value'].format(max_value=max_value) -            self.validators.append(MaxValueValidator(max_value, message=message)) -        if min_value is not None: -            message = self.error_messages['min_value'].format(min_value=min_value) -            self.validators.append(MinValueValidator(min_value, message=message)) +        if self.max_value is not None: +            message = self.error_messages['max_value'].format(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'].format(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: @@ -733,13 +733,18 @@ class DecimalField(Field):          self.max_digits = max_digits          self.decimal_places = decimal_places          self.coerce_to_string = coerce_to_string if (coerce_to_string is not None) else self.coerce_to_string + +        self.max_value = max_value +        self.min_value = min_value +          super(DecimalField, self).__init__(**kwargs) -        if max_value is not None: -            message = self.error_messages['max_value'].format(max_value=max_value) -            self.validators.append(MaxValueValidator(max_value, message=message)) -        if min_value is not None: -            message = self.error_messages['min_value'].format(min_value=min_value) -            self.validators.append(MinValueValidator(min_value, message=message)) + +        if self.max_value is not None: +            message = self.error_messages['max_value'].format(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'].format(min_value=self.min_value) +            self.validators.append(MinValueValidator(self.min_value, message=message))      def to_internal_value(self, data):          """ diff --git a/rest_framework/metadata.py b/rest_framework/metadata.py index 3b058fab..bf3611aa 100644 --- a/rest_framework/metadata.py +++ b/rest_framework/metadata.py @@ -115,7 +115,13 @@ class SimpleMetadata(BaseMetadata):          field_info['type'] = self.label_lookup[field]          field_info['required'] = getattr(field, 'required', False) -        for attr in ['read_only', 'label', 'help_text', 'min_length', 'max_length']: +        attrs = [ +            'read_only', 'label', 'help_text', +            'min_length', 'max_length', +            'min_value', 'max_value' +        ] + +        for attr in attrs:              value = getattr(field, attr, None)              if value is not None and value != '':                  field_info[attr] = force_text(value, strings_only=True) diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 5031c0f3..3a435f02 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -54,8 +54,12 @@ class TestMetadata:          """          class ExampleSerializer(serializers.Serializer):              choice_field = serializers.ChoiceField(['red', 'green', 'blue']) -            integer_field = serializers.IntegerField(max_value=10) -            char_field = serializers.CharField(required=False) +            integer_field = serializers.IntegerField( +                min_value=1, max_value=1000 +            ) +            char_field = serializers.CharField( +                required=False, min_length=3, max_length=40 +            )          class ExampleView(views.APIView):              """Example view.""" @@ -96,13 +100,18 @@ class TestMetadata:                          'type': 'integer',                          'required': True,                          'read_only': False, -                        'label': 'Integer field' +                        'label': 'Integer field', +                        'min_value': 1, +                        'max_value': 1000, +                      },                      'char_field': {                          'type': 'string',                          'required': False,                          'read_only': False, -                        'label': 'Char field' +                        'label': 'Char field', +                        'min_length': 3, +                        'max_length': 40                      }                  }              } | 
