From 027c9079f62322fe933bdfd4438f23cf4848e3cc Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Wed, 31 Oct 2012 20:11:32 +0000 Subject: [PATCH] PUT as create should return 201. Fixes #340. --- docs/topics/release-notes.md | 4 ++++ rest_framework/mixins.py | 7 +++---- rest_framework/tests/generics.py | 6 +++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index a466f4b18..b336aeab9 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -4,6 +4,10 @@ > > — Eric S. Raymond, [The Cathedral and the Bazaar][cite]. +## Master + +* If PUT creates an instance return '201 Created', instead of '200 OK'. + ## 2.0.0 * **Fix all of the things.** (Well, almost.) diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py index 8873e4aed..0f2a0d937 100644 --- a/rest_framework/mixins.py +++ b/rest_framework/mixins.py @@ -3,9 +3,6 @@ Basic building blocks for generic class based views. We don't bind behaviour to http method handlers yet, which allows mixin classes to be composed in interesting ways. - -Eg. Use mixins to build a Resource class, and have a Router class - perform the binding of http methods to actions for us. """ from django.http import Http404 from rest_framework import status @@ -78,15 +75,17 @@ class UpdateModelMixin(object): def update(self, request, *args, **kwargs): try: self.object = self.get_object() + success_status = status.HTTP_200_OK except Http404: self.object = None + success_status = status.HTTP_201_CREATED serializer = self.get_serializer(data=request.DATA, instance=self.object) if serializer.is_valid(): self.pre_save(serializer.object) self.object = serializer.save() - return Response(serializer.data) + return Response(serializer.data, status=success_status) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index d45ea9760..a8279ef2b 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -236,7 +236,7 @@ class TestInstanceView(TestCase): request = factory.put('/1', json.dumps(content), content_type='application/json') response = self.view(request, pk=1).render() - self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.status_code, status.HTTP_201_CREATED) self.assertEquals(response.data, {'id': 1, 'text': 'foobar'}) updated = self.objects.get(id=1) self.assertEquals(updated.text, 'foobar') @@ -251,7 +251,7 @@ class TestInstanceView(TestCase): request = factory.put('/5', json.dumps(content), content_type='application/json') response = self.view(request, pk=5).render() - self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.status_code, status.HTTP_201_CREATED) new_obj = self.objects.get(pk=5) self.assertEquals(new_obj.text, 'foobar') @@ -264,7 +264,7 @@ class TestInstanceView(TestCase): request = factory.put('/test_slug', json.dumps(content), content_type='application/json') response = self.slug_based_view(request, slug='test_slug').render() - self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.status_code, status.HTTP_201_CREATED) self.assertEquals(response.data, {'slug': 'test_slug', 'text': 'foobar'}) new_obj = SlugBasedModel.objects.get(slug='test_slug') self.assertEquals(new_obj.text, 'foobar')