Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
f208d8d2
Commit
f208d8d2
authored
Mar 01, 2013
by
Stephan Groß
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add drf settings + output format + testcases
parent
ef5752f8
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
57 additions
and
17 deletions
+57
-17
rest_framework/fields.py
+29
-11
rest_framework/settings.py
+21
-0
rest_framework/tests/fields.py
+0
-0
rest_framework/tests/filterset.py
+5
-4
rest_framework/tests/pagination.py
+1
-1
rest_framework/tests/serializer.py
+1
-1
No files found.
rest_framework/fields.py
View file @
f208d8d2
...
...
@@ -13,12 +13,12 @@ from django import forms
from
django.forms
import
widgets
from
django.utils.encoding
import
is_protected_type
from
django.utils.translation
import
ugettext_lazy
as
_
from
rest_framework.compat
import
parse_date
,
parse_datetime
from
rest_framework.compat
import
timezone
from
rest_framework.compat
import
BytesIO
from
rest_framework.compat
import
six
from
rest_framework.compat
import
smart_text
from
rest_framework.
compat
import
parse_time
from
rest_framework.
settings
import
api_settings
from
rest_framework.utils.dates
import
get_readable_date_format
...
...
@@ -453,7 +453,8 @@ class DateField(WritableField):
empty
=
None
def
__init__
(
self
,
*
args
,
**
kwargs
):
self
.
format
=
kwargs
.
pop
(
'format'
,
settings
.
DATE_INPUT_FORMATS
)
self
.
input_formats
=
kwargs
.
pop
(
'input_formats'
,
api_settings
.
DATE_INPUT_FORMATS
)
self
.
output_format
=
kwargs
.
pop
(
'output_format'
,
api_settings
.
DATE_OUTPUT_FORMAT
)
super
(
DateField
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
def
from_native
(
self
,
value
):
...
...
@@ -470,7 +471,7 @@ class DateField(WritableField):
if
isinstance
(
value
,
datetime
.
date
):
return
value
for
format
in
self
.
format
:
for
format
in
self
.
input_formats
:
try
:
parsed
=
datetime
.
datetime
.
strptime
(
value
,
format
)
except
(
ValueError
,
TypeError
):
...
...
@@ -478,10 +479,15 @@ class DateField(WritableField):
else
:
return
parsed
.
date
()
date_input_formats
=
'; '
.
join
(
self
.
format
)
date_input_formats
=
'; '
.
join
(
self
.
input_formats
)
msg
=
self
.
error_messages
[
'invalid'
]
%
get_readable_date_format
(
date_input_formats
)
raise
ValidationError
(
msg
)
def
to_native
(
self
,
value
):
if
self
.
output_format
is
not
None
:
return
value
.
strftime
(
self
.
output_format
)
return
value
.
isoformat
()
class
DateTimeField
(
WritableField
):
type_name
=
'DateTimeField'
...
...
@@ -494,7 +500,8 @@ class DateTimeField(WritableField):
empty
=
None
def
__init__
(
self
,
*
args
,
**
kwargs
):
self
.
format
=
kwargs
.
pop
(
'format'
,
settings
.
DATETIME_INPUT_FORMATS
)
self
.
input_formats
=
kwargs
.
pop
(
'input_formats'
,
api_settings
.
DATETIME_INPUT_FORMATS
)
self
.
output_format
=
kwargs
.
pop
(
'output_format'
,
api_settings
.
DATETIME_OUTPUT_FORMAT
)
super
(
DateTimeField
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
def
from_native
(
self
,
value
):
...
...
@@ -517,7 +524,7 @@ class DateTimeField(WritableField):
value
=
timezone
.
make_aware
(
value
,
default_timezone
)
return
value
for
format
in
self
.
format
:
for
format
in
self
.
input_formats
:
try
:
parsed
=
datetime
.
datetime
.
strptime
(
value
,
format
)
except
(
ValueError
,
TypeError
):
...
...
@@ -525,10 +532,15 @@ class DateTimeField(WritableField):
else
:
return
parsed
datetime_input_formats
=
'; '
.
join
(
self
.
format
)
datetime_input_formats
=
'; '
.
join
(
self
.
input_formats
)
msg
=
self
.
error_messages
[
'invalid'
]
%
get_readable_date_format
(
datetime_input_formats
)
raise
ValidationError
(
msg
)
def
to_native
(
self
,
value
):
if
self
.
output_format
is
not
None
:
return
value
.
strftime
(
self
.
output_format
)
return
value
.
isoformat
()
class
TimeField
(
WritableField
):
type_name
=
'TimeField'
...
...
@@ -541,7 +553,8 @@ class TimeField(WritableField):
empty
=
None
def
__init__
(
self
,
*
args
,
**
kwargs
):
self
.
format
=
kwargs
.
pop
(
'format'
,
settings
.
TIME_INPUT_FORMATS
)
self
.
input_formats
=
kwargs
.
pop
(
'input_formats'
,
api_settings
.
TIME_INPUT_FORMATS
)
self
.
output_format
=
kwargs
.
pop
(
'output_format'
,
api_settings
.
TIME_OUTPUT_FORMAT
)
super
(
TimeField
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
def
from_native
(
self
,
value
):
...
...
@@ -551,7 +564,7 @@ class TimeField(WritableField):
if
isinstance
(
value
,
datetime
.
time
):
return
value
for
format
in
self
.
format
:
for
format
in
self
.
input_formats
:
try
:
parsed
=
datetime
.
datetime
.
strptime
(
value
,
format
)
except
(
ValueError
,
TypeError
):
...
...
@@ -559,10 +572,15 @@ class TimeField(WritableField):
else
:
return
parsed
.
time
()
time_input_formats
=
'; '
.
join
(
self
.
format
)
time_input_formats
=
'; '
.
join
(
self
.
input_formats
)
msg
=
self
.
error_messages
[
'invalid'
]
%
get_readable_date_format
(
time_input_formats
)
raise
ValidationError
(
msg
)
def
to_native
(
self
,
value
):
if
self
.
output_format
is
not
None
:
return
value
.
strftime
(
self
.
output_format
)
return
value
.
isoformat
()
class
IntegerField
(
WritableField
):
type_name
=
'IntegerField'
...
...
rest_framework/settings.py
View file @
f208d8d2
...
...
@@ -76,6 +76,27 @@ DEFAULTS = {
'URL_FORMAT_OVERRIDE'
:
'format'
,
'FORMAT_SUFFIX_KWARG'
:
'format'
,
# Input and output formats
'DATE_INPUT_FORMATS'
:
(
'
%
Y-
%
m-
%
d'
,
# '1984-07-31'
),
'DATE_OUTPUT_FORMAT'
:
None
,
'DATETIME_INPUT_FORMATS'
:
(
'
%
Y-
%
m-
%
d'
,
# '1984-07-31'
'
%
Y-
%
m-
%
d
%
H:
%
M'
,
# '1984-07-31 04:31'
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
,
# '1984-07-31 04:31:59'
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S.
%
f'
,
# '1984-07-31 04:31:59.000200'
),
'DATETIME_OUTPUT_FORMAT'
:
None
,
'TIME_INPUT_FORMATS'
:
(
'
%
H:
%
M'
,
# '04:31'
'
%
H:
%
M:
%
S'
,
# '04:31:59'
'
%
H:
%
M:
%
S.
%
f'
,
# '04:31:59.000200'
),
'TIME_OUTPUT_FORMAT'
:
None
,
}
...
...
rest_framework/tests/fields.py
View file @
f208d8d2
This diff is collapsed.
Click to expand it.
rest_framework/tests/filterset.py
View file @
f208d8d2
...
...
@@ -65,7 +65,7 @@ class IntegrationTestFiltering(TestCase):
self
.
objects
=
FilterableItem
.
objects
self
.
data
=
[
{
'id'
:
obj
.
id
,
'text'
:
obj
.
text
,
'decimal'
:
obj
.
decimal
,
'date'
:
obj
.
date
}
{
'id'
:
obj
.
id
,
'text'
:
obj
.
text
,
'decimal'
:
obj
.
decimal
,
'date'
:
obj
.
date
.
isoformat
()
}
for
obj
in
self
.
objects
.
all
()
]
...
...
@@ -95,7 +95,7 @@ class IntegrationTestFiltering(TestCase):
request
=
factory
.
get
(
'/?date=
%
s'
%
search_date
)
# search_date str: '2012-09-22'
response
=
view
(
request
)
.
render
()
self
.
assertEqual
(
response
.
status_code
,
status
.
HTTP_200_OK
)
expected_data
=
[
f
for
f
in
self
.
data
if
f
[
'date'
]
==
search_date
]
expected_data
=
[
f
for
f
in
self
.
data
if
datetime
.
datetime
.
strptime
(
f
[
'date'
],
'
%
Y-
%
m-
%
d'
)
.
date
()
==
search_date
]
self
.
assertEqual
(
response
.
data
,
expected_data
)
@unittest.skipUnless
(
django_filters
,
'django-filters not installed'
)
...
...
@@ -125,7 +125,7 @@ class IntegrationTestFiltering(TestCase):
request
=
factory
.
get
(
'/?date=
%
s'
%
search_date
)
# search_date str: '2012-10-02'
response
=
view
(
request
)
.
render
()
self
.
assertEqual
(
response
.
status_code
,
status
.
HTTP_200_OK
)
expected_data
=
[
f
for
f
in
self
.
data
if
f
[
'date'
]
>
search_date
]
expected_data
=
[
f
for
f
in
self
.
data
if
datetime
.
datetime
.
strptime
(
f
[
'date'
],
'
%
Y-
%
m-
%
d'
)
.
date
()
>
search_date
]
self
.
assertEqual
(
response
.
data
,
expected_data
)
# Tests that the text filter set with 'icontains' in the filter class works.
...
...
@@ -142,7 +142,8 @@ class IntegrationTestFiltering(TestCase):
request
=
factory
.
get
(
'/?decimal=
%
s&date=
%
s'
%
(
search_decimal
,
search_date
))
response
=
view
(
request
)
.
render
()
self
.
assertEqual
(
response
.
status_code
,
status
.
HTTP_200_OK
)
expected_data
=
[
f
for
f
in
self
.
data
if
f
[
'date'
]
>
search_date
and
expected_data
=
[
f
for
f
in
self
.
data
if
datetime
.
datetime
.
strptime
(
f
[
'date'
],
'
%
Y-
%
m-
%
d'
)
.
date
()
>
search_date
and
f
[
'decimal'
]
<
search_decimal
]
self
.
assertEqual
(
response
.
data
,
expected_data
)
...
...
rest_framework/tests/pagination.py
View file @
f208d8d2
...
...
@@ -112,7 +112,7 @@ class IntegrationTestPaginationAndFiltering(TestCase):
self
.
objects
=
FilterableItem
.
objects
self
.
data
=
[
{
'id'
:
obj
.
id
,
'text'
:
obj
.
text
,
'decimal'
:
obj
.
decimal
,
'date'
:
obj
.
date
}
{
'id'
:
obj
.
id
,
'text'
:
obj
.
text
,
'decimal'
:
obj
.
decimal
,
'date'
:
obj
.
date
.
isoformat
()
}
for
obj
in
self
.
objects
.
all
()
]
self
.
view
=
FilterFieldsRootView
.
as_view
()
...
...
rest_framework/tests/serializer.py
View file @
f208d8d2
...
...
@@ -112,7 +112,7 @@ class BasicTests(TestCase):
self
.
expected
=
{
'email'
:
'tom@example.com'
,
'content'
:
'Happy new year!'
,
'created'
:
datetime
.
datetime
(
2012
,
1
,
1
)
,
'created'
:
'2012-01-01T00:00:00'
,
'sub_comment'
:
'And Merry Christmas!'
}
self
.
person_data
=
{
'name'
:
'dwight'
,
'age'
:
35
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment