Commit e677f3ee by Krzysztof Jurewicz

PATCH requests should not be able to create objects.

parent 999056cd
...@@ -142,11 +142,14 @@ class UpdateModelMixin(object): ...@@ -142,11 +142,14 @@ class UpdateModelMixin(object):
try: try:
return self.get_object() return self.get_object()
except Http404: except Http404:
# If this is a PUT-as-create operation, we need to ensure that if self.request.method == 'PUT':
# we have relevant permissions, as if this was a POST request. # For PUT-as-create operation, we need to ensure that we have
# This will either raise a PermissionDenied exception, # relevant permissions, as if this was a POST request. This
# or simply return None # will either raise a PermissionDenied exception, or simply
self.check_permissions(clone_request(self.request, 'POST')) # return None.
self.check_permissions(clone_request(self.request, 'POST'))
else:
raise
def pre_save(self, obj): def pre_save(self, obj):
""" """
......
...@@ -338,6 +338,17 @@ class TestInstanceView(TestCase): ...@@ -338,6 +338,17 @@ class TestInstanceView(TestCase):
new_obj = SlugBasedModel.objects.get(slug='test_slug') new_obj = SlugBasedModel.objects.get(slug='test_slug')
self.assertEqual(new_obj.text, 'foobar') self.assertEqual(new_obj.text, 'foobar')
def test_patch_cannot_create_an_object(self):
"""
PATCH requests should not be able to create objects.
"""
data = {'text': 'foobar'}
request = factory.patch('/999', data, format='json')
with self.assertNumQueries(1):
response = self.view(request, pk=999).render()
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.assertFalse(self.objects.filter(id=999).exists())
class TestOverriddenGetObject(TestCase): class TestOverriddenGetObject(TestCase):
""" """
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment