Skip to content

Commit

Permalink
Create responses with resouce context
Browse files Browse the repository at this point in the history
  • Loading branch information
ddobson committed May 14, 2020
1 parent 4e9a41e commit 4268ea1
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 18 deletions.
33 changes: 22 additions & 11 deletions drf_jsonapi/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def list(self, request):
self.document.instance.data = serializer.data
self.document.instance.included = serializer.included

return Response(self.document.data)
return Response(self.document.data, context={"collection": page})


class ProcessRelationshipsMixin:
Expand Down Expand Up @@ -137,7 +137,11 @@ def create(self, request):
serializer.instance = resource
self.document.instance.data = serializer.data

return Response(self.document.data, status=status.HTTP_201_CREATED)
return Response(
self.document.data,
status=status.HTTP_201_CREATED,
context={"resource": resource},
)


class RetrieveMixin:
Expand All @@ -162,7 +166,7 @@ def retrieve(self, request, pk):
self.document.instance.data = serializer.data
self.document.instance.included = serializer.included

return Response(self.document.data)
return Response(self.document.data, context={"resource": resource})


class PartialUpdateMixin(ProcessRelationshipsMixin):
Expand Down Expand Up @@ -199,7 +203,7 @@ def partial_update(self, request, *args, **kwargs):

self.document.instance.data = serializer.data

return Response(self.document.data)
return Response(self.document.data, context={"resource": resource})


class DestroyMixin:
Expand All @@ -208,10 +212,11 @@ class DestroyMixin:
"""

def destroy(self, request, pk):
resource = self.get_resource(request, pk)
resource.delete()
resource = self.get_resource(request, pk).delete()

return Response(status=status.HTTP_204_NO_CONTENT)
return Response(
status=status.HTTP_204_NO_CONTENT, context={"resource": resource}
)


class RelationshipRetrieveMixin:
Expand All @@ -238,7 +243,7 @@ def relationship_retrieve(self, request, pk, relationship):
serializer = resource_identifier(serializer_class)(related, many=handler.many)

self.document.instance.data = serializer.data
return Response(self.document.data)
return Response(self.document.data, context={"resource": resource})


class RelationshipCreateMixin:
Expand Down Expand Up @@ -268,7 +273,9 @@ def relationship_create(self, request, pk, relationship):

handler.add_related(resource, related, request)

return Response(status=status.HTTP_204_NO_CONTENT)
return Response(
status=status.HTTP_204_NO_CONTENT, context={"resource": resource}
)


class RelationshipUpdateMixin:
Expand All @@ -295,7 +302,9 @@ def relationship_update(self, request, pk, relationship):
if not handler.many:
resource.save()

return Response(status=status.HTTP_204_NO_CONTENT)
return Response(
status=status.HTTP_204_NO_CONTENT, context={"resource": resource}
)


class RelationshipDestroyMixin:
Expand Down Expand Up @@ -325,4 +334,6 @@ def relationship_destroy(self, request, pk, relationship):

handler.remove_related(resource, related, request)

return Response(status=status.HTTP_204_NO_CONTENT)
return Response(
status=status.HTTP_204_NO_CONTENT, context={"resource": resource}
)
22 changes: 15 additions & 7 deletions tests/test_mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ def test_retrieve_mixin(self):
view = TestViewSet.as_view({"get": "retrieve"})
response = view(request, pk=1)
self.assertEqual(response.status_code, 200)
self.assertIsInstance(response.context["resource"], TestModel)

def test_create_mixin(self):
factory = APIRequestFactory()
Expand All @@ -105,6 +106,7 @@ def test_create_mixin(self):
response = view(request)
response.render()
self.assertEqual(response.status_code, 201)
self.assertIsInstance(response.context["resource"], TestModel)

def test_create_mixin_with_relationships_to_many(self):
factory = APIRequestFactory()
Expand Down Expand Up @@ -272,6 +274,7 @@ def test_partial_update_mixin(self):
response = view(request, pk=1)
response.render()
self.assertEqual(response.status_code, 200)
self.assertIsInstance(response.context["resource"], TestModel)

def test_partial_update_mixin_with_relationships(self):
factory = APIRequestFactory()
Expand Down Expand Up @@ -370,6 +373,7 @@ def test_destroy_mixin(self):
view = TestViewSet.as_view({"delete": "destroy"})
response = view(request, pk=1)
self.assertEqual(response.status_code, 204)
self.assertIsInstance(response.context["resource"], TestModel)


class RelationshipCreateMixinTestCase(TestCase):
Expand All @@ -378,21 +382,22 @@ class TestManyView(mixins.RelationshipCreateMixin, ViewSet):
relationship = "related_things"

def get_resource(self, request, pk):
return True
return TestModel()

class TestOneView(mixins.RelationshipCreateMixin, ViewSet):
serializer_class = TestModelSerializer
relationship = "related_thing"

def get_resource(self, request, pk):
return True
return TestModel()

def test_create_valid(self):
factory = APIRequestFactory()
request = factory.post("/test_resources", {}, format="json")
request.data = {"data": [{"type": "test_resource", "id": "test_id"}]}
view = self.TestManyView()
view.relationship_create(request, 1, "related_things")
response = view.relationship_create(request, 1, "related_things")
self.assertIsInstance(response.context["resource"], TestModel)

def test_create_to_many_invalid(self):
factory = APIRequestFactory()
Expand Down Expand Up @@ -439,7 +444,8 @@ def test_patch_one_valid(self):
request = factory.patch("/test_resources", {}, format="json")
request.data = {"data": {"type": "test_resource", "id": "test_id"}}
view = self.TestOneView()
view.relationship_update(request, 1, "related_thing")
response = view.relationship_update(request, 1, "related_thing")
self.assertIsInstance(response.context["resource"], TestModel)

def test_patch_one_invalid(self):
factory = APIRequestFactory()
Expand All @@ -456,14 +462,14 @@ class TestManyView(mixins.RelationshipDestroyMixin, ViewSet):
relationship = "related_things"

def get_resource(self, request, pk):
return True
return TestModel()

class TestOneView(mixins.RelationshipDestroyMixin, ViewSet):
serializer_class = TestModelSerializer
relationship = "related_thing"

def get_resource(self, request, pk):
return True
return TestModel()

def test_destroy_to_one_invalid(self):
factory = APIRequestFactory()
Expand All @@ -483,7 +489,8 @@ def test_destroy_to_many_valid(self):
)
view = self.TestManyView()
request.data = {"data": {"type": "test_resource", "id": "5"}}
view.relationship_destroy(request, 1, "related_things")
response = view.relationship_destroy(request, 1, "related_things")
self.assertIsInstance(response.context["resource"], TestModel)

def test_destroy_to_many_valid_iterator(self):
factory = APIRequestFactory()
Expand Down Expand Up @@ -523,6 +530,7 @@ def test_list_mixin_one(self):
view = self.TestOneView.as_view({"get": "relationship_retrieve"})
response = view(request, 1, "related_thing")
self.assertEqual(response.status_code, 200)
self.assertIsInstance(response.context["resource"], TestModel)

def test_list_mixin_many(self):
factory = APIRequestFactory()
Expand Down

0 comments on commit 4268ea1

Please sign in to comment.