diff options
| author | Ludwig Kraatz | 2012-11-13 18:00:41 +0100 | 
|---|---|---|
| committer | Ludwig Kraatz | 2012-11-13 18:00:41 +0100 | 
| commit | cc55a7b64310cdd4b8b96e8270a48fd994ede90c (patch) | |
| tree | 8208b4efaf9547a96382a14315df8d810f279cf0 /rest_framework | |
| parent | 44e9749e36d31f811db7dc0998c7b8d1e35a784d (diff) | |
| download | django-rest-framework-cc55a7b64310cdd4b8b96e8270a48fd994ede90c.tar.bz2 | |
Returning a Location Header on Create
when creating a Resource with HyperlinkedIdentityField of any name
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/mixins.py | 19 | ||||
| -rw-r--r-- | rest_framework/tests/hyperlinkedserializers.py | 8 | 
2 files changed, 25 insertions, 2 deletions
diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py index c3625a88..f54b5b1f 100644 --- a/rest_framework/mixins.py +++ b/rest_framework/mixins.py @@ -7,6 +7,7 @@ which allows mixin classes to be composed in interesting ways.  from django.http import Http404  from rest_framework import status  from rest_framework.response import Response +from rest_framework.fields import HyperlinkedIdentityField  class CreateModelMixin(object): @@ -19,9 +20,23 @@ class CreateModelMixin(object):          if serializer.is_valid():              self.pre_save(serializer.object)              self.object = serializer.save() -            return Response(serializer.data, status=status.HTTP_201_CREATED) +            headers = self.get_success_headers(serializer) +            return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)          return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - +     +    def get_success_headers(self,serializer): +        headers = [] +        identity_field = identity_name = None +        for name,field in serializer.fields.iteritems(): +                if isinstance(field,HyperlinkedIdentityField): +                    identity_name, identity_field = name, field +        if identity_field: +            #identity_field.initialize(serializer,"url") +            headers.append( +                ("Location",identity_field.field_to_native(self.object,identity_name)) +            ) +        return headers +          def pre_save(self, obj):          pass diff --git a/rest_framework/tests/hyperlinkedserializers.py b/rest_framework/tests/hyperlinkedserializers.py index 5ab850af..cc5a19c1 100644 --- a/rest_framework/tests/hyperlinkedserializers.py +++ b/rest_framework/tests/hyperlinkedserializers.py @@ -8,6 +8,7 @@ factory = RequestFactory()  class BlogPostCommentSerializer(serializers.ModelSerializer): +    custom_identity_field = serializers.HyperlinkedIdentityField(view_name='blogpostcomment-detail')      text = serializers.CharField()      blog_post_url = serializers.HyperlinkedRelatedField(source='blog_post', view_name='blogpost-detail') @@ -17,6 +18,7 @@ class BlogPostCommentSerializer(serializers.ModelSerializer):  class PhotoSerializer(serializers.Serializer): +    """ When Adding a HyperlinkedIdentityField to this serializer, the TestCreateWithForeignKeysAndCustomSlug will fail """      description = serializers.CharField()      album_url = serializers.HyperlinkedRelatedField(source='album', view_name='album-detail', queryset=Album.objects.all(), slug_field='title', slug_url_kwarg='title') @@ -53,6 +55,9 @@ class BlogPostCommentListCreate(generics.ListCreateAPIView):      model = BlogPostComment      serializer_class = BlogPostCommentSerializer +class BlogPostCommentDetail(generics.RetrieveAPIView): +    model = BlogPostComment +    serializer_class = BlogPostCommentSerializer  class BlogPostDetail(generics.RetrieveAPIView):      model = BlogPost @@ -80,6 +85,7 @@ urlpatterns = patterns('',      url(r'^manytomany/(?P<pk>\d+)/$', ManyToManyDetail.as_view(), name='manytomanymodel-detail'),      url(r'^posts/(?P<pk>\d+)/$', BlogPostDetail.as_view(), name='blogpost-detail'),      url(r'^comments/$', BlogPostCommentListCreate.as_view(), name='blogpostcomment-list'), +    url(r'^comments/(?P<pk>\d+)/$', BlogPostCommentDetail.as_view(), name='blogpostcomment-detail'),      url(r'^albums/(?P<title>\w[\w-]*)/$', AlbumDetail.as_view(), name='album-detail'),      url(r'^photos/$', PhotoListCreate.as_view(), name='photo-list'),      url(r'^optionalrelation/(?P<pk>\d+)/$', OptionalRelationDetail.as_view(), name='optionalrelationmodel-detail'), @@ -191,6 +197,7 @@ class TestCreateWithForeignKeys(TestCase):          request = factory.post('/comments/', data=data)          response = self.create_view(request).render()          self.assertEqual(response.status_code, status.HTTP_201_CREATED) +        self.assertEqual(response["Location"], 'http://testserver/comments/1/')          self.assertEqual(self.post.blogpostcomment_set.count(), 1)          self.assertEqual(self.post.blogpostcomment_set.all()[0].text, 'A test comment') @@ -215,6 +222,7 @@ class TestCreateWithForeignKeysAndCustomSlug(TestCase):          request = factory.post('/photos/', data=data)          response = self.list_create_view(request).render()          self.assertEqual(response.status_code, status.HTTP_201_CREATED) +        self.assertNotIn("Location",response,msg="A Serializer without HyperlinkedIdentityField can not produce a valid Location header (for now). Thats why there shouldn'd be one")          self.assertEqual(self.post.photo_set.count(), 1)          self.assertEqual(self.post.photo_set.all()[0].description, 'A test photo')  | 
