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
9cea6880
Commit
9cea6880
authored
Nov 19, 2013
by
Krzysztof Jurewicz
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added handling of validation errors in PUT-as-create.
Fixes #1035.
parent
ca2bd616
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
24 additions
and
3 deletions
+24
-3
rest_framework/mixins.py
+7
-1
rest_framework/tests/test_generics.py
+17
-2
No files found.
rest_framework/mixins.py
View file @
9cea6880
...
@@ -6,6 +6,7 @@ which allows mixin classes to be composed in interesting ways.
...
@@ -6,6 +6,7 @@ which allows mixin classes to be composed in interesting ways.
"""
"""
from
__future__
import
unicode_literals
from
__future__
import
unicode_literals
from
django.core.exceptions
import
ValidationError
from
django.http
import
Http404
from
django.http
import
Http404
from
rest_framework
import
status
from
rest_framework
import
status
from
rest_framework.response
import
Response
from
rest_framework.response
import
Response
...
@@ -127,7 +128,12 @@ class UpdateModelMixin(object):
...
@@ -127,7 +128,12 @@ class UpdateModelMixin(object):
files
=
request
.
FILES
,
partial
=
partial
)
files
=
request
.
FILES
,
partial
=
partial
)
if
serializer
.
is_valid
():
if
serializer
.
is_valid
():
self
.
pre_save
(
serializer
.
object
)
try
:
self
.
pre_save
(
serializer
.
object
)
except
ValidationError
as
err
:
# full_clean on model instance may be called in pre_save, so we
# have to handle eventual errors.
return
Response
(
err
.
message_dict
,
status
=
status
.
HTTP_400_BAD_REQUEST
)
self
.
object
=
serializer
.
save
(
**
save_kwargs
)
self
.
object
=
serializer
.
save
(
**
save_kwargs
)
self
.
post_save
(
self
.
object
,
created
=
created
)
self
.
post_save
(
self
.
object
,
created
=
created
)
return
Response
(
serializer
.
data
,
status
=
success_status_code
)
return
Response
(
serializer
.
data
,
status
=
success_status_code
)
...
...
rest_framework/tests/test_generics.py
View file @
9cea6880
...
@@ -23,6 +23,10 @@ class InstanceView(generics.RetrieveUpdateDestroyAPIView):
...
@@ -23,6 +23,10 @@ class InstanceView(generics.RetrieveUpdateDestroyAPIView):
"""
"""
model
=
BasicModel
model
=
BasicModel
def
get_queryset
(
self
):
queryset
=
super
(
InstanceView
,
self
)
.
get_queryset
()
return
queryset
.
exclude
(
text
=
'filtered out'
)
class
SlugSerializer
(
serializers
.
ModelSerializer
):
class
SlugSerializer
(
serializers
.
ModelSerializer
):
slug
=
serializers
.
Field
()
# read only
slug
=
serializers
.
Field
()
# read only
...
@@ -160,10 +164,10 @@ class TestInstanceView(TestCase):
...
@@ -160,10 +164,10 @@ class TestInstanceView(TestCase):
"""
"""
Create 3 BasicModel intances.
Create 3 BasicModel intances.
"""
"""
items
=
[
'foo'
,
'bar'
,
'baz'
]
items
=
[
'foo'
,
'bar'
,
'baz'
,
'filtered out'
]
for
item
in
items
:
for
item
in
items
:
BasicModel
(
text
=
item
)
.
save
()
BasicModel
(
text
=
item
)
.
save
()
self
.
objects
=
BasicModel
.
objects
self
.
objects
=
BasicModel
.
objects
.
exclude
(
text
=
'filtered out'
)
self
.
data
=
[
self
.
data
=
[
{
'id'
:
obj
.
id
,
'text'
:
obj
.
text
}
{
'id'
:
obj
.
id
,
'text'
:
obj
.
text
}
for
obj
in
self
.
objects
.
all
()
for
obj
in
self
.
objects
.
all
()
...
@@ -352,6 +356,17 @@ class TestInstanceView(TestCase):
...
@@ -352,6 +356,17 @@ class TestInstanceView(TestCase):
updated
=
self
.
objects
.
get
(
id
=
1
)
updated
=
self
.
objects
.
get
(
id
=
1
)
self
.
assertEqual
(
updated
.
text
,
'foobar'
)
self
.
assertEqual
(
updated
.
text
,
'foobar'
)
def
test_put_to_filtered_out_instance
(
self
):
"""
PUT requests to an URL of instance which is filtered out should not be
able to create new objects.
"""
data
=
{
'text'
:
'foo'
}
filtered_out_pk
=
BasicModel
.
objects
.
filter
(
text
=
'filtered out'
)[
0
]
.
pk
request
=
factory
.
put
(
'/{0}'
.
format
(
filtered_out_pk
),
data
,
format
=
'json'
)
response
=
self
.
view
(
request
,
pk
=
filtered_out_pk
)
.
render
()
self
.
assertEqual
(
response
.
status_code
,
status
.
HTTP_400_BAD_REQUEST
)
def
test_put_as_create_on_id_based_url
(
self
):
def
test_put_as_create_on_id_based_url
(
self
):
"""
"""
PUT requests to RetrieveUpdateDestroyAPIView should create an object
PUT requests to RetrieveUpdateDestroyAPIView should create an object
...
...
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