Skip to content

Commit

Permalink
DateTimeField to_representation can handle strings. Fixes encode#4013.
Browse files Browse the repository at this point in the history
  • Loading branch information
calumcalder committed Mar 26, 2016
1 parent c1802db commit ead6205
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
14 changes: 14 additions & 0 deletions rest_framework/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -1072,10 +1072,24 @@ def to_representation(self, value):
return value

if output_format.lower() == ISO_8601:
if isinstance(value, str):
format_strings = (format_prefix + timezone_extension
for format_prefix in ('%Y-%m-%dT%H:%M', '%Y-%m-%dT%H:%M:%S', '%Y-%m-%dT%H:%M:%S.%f')
for timezone_extension in ('', '%Z', '%z'))
for format_string in format_strings:
try:
value = datetime.datetime.strptime(value, format_string)
break
except ValueError:
pass
else:
raise ValueError('DateTime String %s did not match any valid format string.' % value)

value = value.isoformat()
if value.endswith('+00:00'):
value = value[:-6] + 'Z'
return value

return value.strftime(output_format)


Expand Down
9 changes: 9 additions & 0 deletions tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -978,6 +978,15 @@ class TestDateTimeField(FieldValues):
outputs = {
datetime.datetime(2001, 1, 1, 13, 00): '2001-01-01T13:00:00',
datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.UTC()): '2001-01-01T13:00:00Z',
'2001-01-01T01:01': '2001-01-01T01:01:00',
'2001-01-01T01:01:01': '2001-01-01T01:01:01',
'2001-01-01T01:01:01.01': '2001-01-01T01:01:01.010000',
'2001-01-01T01:01+0100': '2001-01-01T01:01:00+01:00',
'2001-01-01T01:01:01+0100': '2001-01-01T01:01:01+01:00',
'2001-01-01T01:01:01.01+0100': '2001-01-01T01:01:01.010000+01:00',
'2001-01-01T01:01UTC': '2001-01-01T01:01:00',
'2001-01-01T01:01:01UTC': '2001-01-01T01:01:01',
'2001-01-01T01:01:01.01UTC': '2001-01-01T01:01:01.010000',
None: None,
'': None,
}
Expand Down

0 comments on commit ead6205

Please sign in to comment.