From cbea03c85b7edc3b6ff3b589127645402f9107cc Mon Sep 17 00:00:00 2001 From: Ryan Allen Date: Thu, 23 Apr 2015 19:25:22 -0500 Subject: [PATCH 1/2] DateField to_representation can handle str and empty values. Fixes #2656, #2687. --- rest_framework/fields.py | 6 ++++++ tests/test_fields.py | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 68835bded..460645796 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -925,6 +925,9 @@ class DateField(Field): self.fail('invalid', format=humanized_format) def to_representation(self, value): + if not value: + return None + if self.format is None: return value @@ -938,7 +941,10 @@ class DateField(Field): ) if self.format.lower() == ISO_8601: + if (isinstance(value, str)): + value = datetime.datetime.strptime(value, '%Y-%m-%d').date() return value.isoformat() + return value.strftime(self.format) diff --git a/tests/test_fields.py b/tests/test_fields.py index da6bd6ceb..1531fe2ac 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -726,7 +726,10 @@ class TestDateField(FieldValues): datetime.datetime(2001, 1, 1, 12, 00): ['Expected a date but got a datetime.'], } outputs = { - datetime.date(2001, 1, 1): '2001-01-01' + datetime.date(2001, 1, 1): '2001-01-01', + '2001-01-01': '2001-01-01', + None: None, + '': None, } field = serializers.DateField() From f7da76bd6089b65d43ff0b424ef2db34ac018fb4 Mon Sep 17 00:00:00 2001 From: Ryan Allen Date: Thu, 23 Apr 2015 19:51:29 -0500 Subject: [PATCH 2/2] IntegerField to_representation can handle integer like strings with a decimal value of zero e.g. '1.0' --- rest_framework/fields.py | 13 +++++-------- tests/test_fields.py | 8 +++----- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 460645796..141bf663c 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -678,18 +678,21 @@ class IntegerField(Field): message = self.error_messages['min_value'].format(min_value=self.min_value) self.validators.append(MinValueValidator(self.min_value, message=message)) + def coerce_to_int(self, value): + return int(self.re_decimal.sub('', str(value))) + def to_internal_value(self, data): if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: self.fail('max_string_length') try: - data = int(self.re_decimal.sub('', str(data))) + data = self.coerce_to_int(data) except (ValueError, TypeError): self.fail('invalid') return data def to_representation(self, value): - return int(value) + return self.coerce_to_int(value) class FloatField(Field): @@ -925,9 +928,6 @@ class DateField(Field): self.fail('invalid', format=humanized_format) def to_representation(self, value): - if not value: - return None - if self.format is None: return value @@ -941,10 +941,7 @@ class DateField(Field): ) if self.format.lower() == ISO_8601: - if (isinstance(value, str)): - value = datetime.datetime.strptime(value, '%Y-%m-%d').date() return value.isoformat() - return value.strftime(self.format) diff --git a/tests/test_fields.py b/tests/test_fields.py index 1531fe2ac..c1497fb32 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -563,7 +563,8 @@ class TestIntegerField(FieldValues): 1: 1, 0: 0, 1.0: 1, - 0.0: 0 + 0.0: 0, + '1.0': 1 } field = serializers.IntegerField() @@ -726,10 +727,7 @@ class TestDateField(FieldValues): datetime.datetime(2001, 1, 1, 12, 00): ['Expected a date but got a datetime.'], } outputs = { - datetime.date(2001, 1, 1): '2001-01-01', - '2001-01-01': '2001-01-01', - None: None, - '': None, + datetime.date(2001, 1, 1): '2001-01-01' } field = serializers.DateField()