Skip to content

Commit c8609ba

Browse files
author
Rense VanderHoek
committed
Set field length/values as actual attributes.
The SimpleMetadata class in metadata.py tries to getattr() attributes on a field. For this to work, max_length and min_length have to be actually set as an attribute. Did the same for min_value and max_value and added those two to SimpleMetadata.get_field_info
1 parent dc8cc86 commit c8609ba

File tree

2 files changed

+37
-29
lines changed

2 files changed

+37
-29
lines changed

rest_framework/fields.py

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -556,15 +556,15 @@ class CharField(Field):
556556
def __init__(self, **kwargs):
557557
self.allow_blank = kwargs.pop('allow_blank', False)
558558
self.trim_whitespace = kwargs.pop('trim_whitespace', True)
559-
max_length = kwargs.pop('max_length', None)
560-
min_length = kwargs.pop('min_length', None)
559+
self.max_length = kwargs.pop('max_length', None)
560+
self.min_length = kwargs.pop('min_length', None)
561561
super(CharField, self).__init__(**kwargs)
562-
if max_length is not None:
563-
message = self.error_messages['max_length'].format(max_length=max_length)
564-
self.validators.append(MaxLengthValidator(max_length, message=message))
565-
if min_length is not None:
566-
message = self.error_messages['min_length'].format(min_length=min_length)
567-
self.validators.append(MinLengthValidator(min_length, message=message))
562+
if self.max_length is not None:
563+
message = self.error_messages['max_length'].format(max_length=self.max_length)
564+
self.validators.append(MaxLengthValidator(self.max_length, message=message))
565+
if self.min_length is not None:
566+
message = self.error_messages['min_length'].format(min_length=self.min_length)
567+
self.validators.append(MinLengthValidator(self.min_length, message=message))
568568

569569
def run_validation(self, data=empty):
570570
# Test for the empty string here so that it does not get validated,
@@ -658,15 +658,15 @@ class IntegerField(Field):
658658
MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs.
659659

660660
def __init__(self, **kwargs):
661-
max_value = kwargs.pop('max_value', None)
662-
min_value = kwargs.pop('min_value', None)
661+
self.max_value = kwargs.pop('max_value', None)
662+
self.min_value = kwargs.pop('min_value', None)
663663
super(IntegerField, self).__init__(**kwargs)
664-
if max_value is not None:
665-
message = self.error_messages['max_value'].format(max_value=max_value)
666-
self.validators.append(MaxValueValidator(max_value, message=message))
667-
if min_value is not None:
668-
message = self.error_messages['min_value'].format(min_value=min_value)
669-
self.validators.append(MinValueValidator(min_value, message=message))
664+
if self.max_value is not None:
665+
message = self.error_messages['max_value'].format(max_value=self.max_value)
666+
self.validators.append(MaxValueValidator(self.max_value, message=message))
667+
if self.min_value is not None:
668+
message = self.error_messages['min_value'].format(min_value=self.min_value)
669+
self.validators.append(MinValueValidator(self.min_value, message=message))
670670

671671
def to_internal_value(self, data):
672672
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
@@ -692,15 +692,15 @@ class FloatField(Field):
692692
MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs.
693693

694694
def __init__(self, **kwargs):
695-
max_value = kwargs.pop('max_value', None)
696-
min_value = kwargs.pop('min_value', None)
695+
self.max_value = kwargs.pop('max_value', None)
696+
self.min_value = kwargs.pop('min_value', None)
697697
super(FloatField, self).__init__(**kwargs)
698-
if max_value is not None:
699-
message = self.error_messages['max_value'].format(max_value=max_value)
700-
self.validators.append(MaxValueValidator(max_value, message=message))
701-
if min_value is not None:
702-
message = self.error_messages['min_value'].format(min_value=min_value)
703-
self.validators.append(MinValueValidator(min_value, message=message))
698+
if self.max_value is not None:
699+
message = self.error_messages['max_value'].format(max_value=self.max_value)
700+
self.validators.append(MaxValueValidator(self.max_value, message=message))
701+
if self.min_value is not None:
702+
message = self.error_messages['min_value'].format(min_value=self.min_value)
703+
self.validators.append(MinValueValidator(self.min_value, message=message))
704704

705705
def to_internal_value(self, data):
706706
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
@@ -733,12 +733,14 @@ def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value=
733733
self.max_digits = max_digits
734734
self.decimal_places = decimal_places
735735
self.coerce_to_string = coerce_to_string if (coerce_to_string is not None) else self.coerce_to_string
736+
self.max_value = kwargs.pop('max_value', None)
737+
self.min_value = kwargs.pop('min_value', None)
736738
super(DecimalField, self).__init__(**kwargs)
737-
if max_value is not None:
738-
message = self.error_messages['max_value'].format(max_value=max_value)
739+
if self.max_value is not None:
740+
message = self.error_messages['max_value'].format(max_value=self.max_value)
739741
self.validators.append(MaxValueValidator(max_value, message=message))
740-
if min_value is not None:
741-
message = self.error_messages['min_value'].format(min_value=min_value)
742+
if self.min_value is not None:
743+
message = self.error_messages['min_value'].format(min_value=self.min_value)
742744
self.validators.append(MinValueValidator(min_value, message=message))
743745

744746
def to_internal_value(self, data):

rest_framework/metadata.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,13 @@ def get_field_info(self, field):
115115
field_info['type'] = self.label_lookup[field]
116116
field_info['required'] = getattr(field, 'required', False)
117117

118-
for attr in ['read_only', 'label', 'help_text', 'min_length', 'max_length']:
118+
attrs = [
119+
'read_only', 'label', 'help_text',
120+
'min_length', 'max_length',
121+
'min_value', 'max_value'
122+
]
123+
124+
for attr in attrs:
119125
value = getattr(field, attr, None)
120126
if value is not None and value != '':
121127
field_info[attr] = force_text(value, strings_only=True)

0 commit comments

Comments
 (0)