From e0aec3ff459b6f37f9c1fc832463a970ac5b692b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristi=20V=C3=AEjdea?= Date: Fri, 29 Jun 2018 17:41:37 +0300 Subject: [PATCH] Test that get_serializer is not called when overriden Views' ``get_serializer`` methods should not be called when the serializer is provided by ``request_body`` or ``responses``. Closes #154 --- src/drf_yasg/inspectors/view.py | 3 ++- testproj/todo/views.py | 35 ++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/drf_yasg/inspectors/view.py b/src/drf_yasg/inspectors/view.py index 03c383d..a025dee 100644 --- a/src/drf_yasg/inspectors/view.py +++ b/src/drf_yasg/inspectors/view.py @@ -89,7 +89,8 @@ class SwaggerAutoSchema(ViewInspector): try: return self.view.get_serializer() except Exception: - log.warning("view's get_serializer raised exception (%s)", type(self.view).__name__, exc_info=True) + log.warning("view's get_serializer raised exception (%s %s %s)", + self.method, self.path, type(self.view).__name__, exc_info=True) return None def get_request_serializer(self): diff --git a/testproj/todo/views.py b/testproj/todo/views.py index 786d6d7..a882de0 100644 --- a/testproj/todo/views.py +++ b/testproj/todo/views.py @@ -1,6 +1,8 @@ from rest_framework import viewsets from rest_framework.generics import RetrieveAPIView +from drf_yasg.utils import swagger_auto_schema + from .models import Todo, TodoAnother, TodoTree, TodoYetAnother from .serializer import ( TodoAnotherSerializer, TodoRecursiveSerializer, TodoSerializer, TodoTreeSerializer, TodoYetAnotherSerializer @@ -36,4 +38,35 @@ class TodoTreeView(viewsets.ReadOnlyModelViewSet): class TodoRecursiveView(viewsets.ModelViewSet): queryset = TodoTree.objects.all() - serializer_class = TodoRecursiveSerializer + + def get_serializer(self, *args, **kwargs): + raise NotImplementedError("must not call this") + + def get_serializer_class(self): + raise NotImplementedError("must not call this") + + def get_serializer_context(self): + raise NotImplementedError("must not call this") + + @swagger_auto_schema(request_body=TodoRecursiveSerializer) + def create(self, request, *args, **kwargs): + return super(TodoRecursiveView, self).create(request, *args, **kwargs) + + @swagger_auto_schema(responses={200: TodoRecursiveSerializer}) + def retrieve(self, request, *args, **kwargs): + return super(TodoRecursiveView, self).retrieve(request, *args, **kwargs) + + @swagger_auto_schema(request_body=TodoRecursiveSerializer) + def update(self, request, *args, **kwargs): + return super(TodoRecursiveView, self).update(request, *args, **kwargs) + + @swagger_auto_schema(request_body=TodoRecursiveSerializer) + def partial_update(self, request, *args, **kwargs): + return super(TodoRecursiveView, self).update(request, *args, **kwargs) + + def destroy(self, request, *args, **kwargs): + return super(TodoRecursiveView, self).destroy(request, *args, **kwargs) + + @swagger_auto_schema(responses={200: TodoRecursiveSerializer(many=True)}) + def list(self, request, *args, **kwargs): + return super(TodoRecursiveView, self).list(request, *args, **kwargs)