Skip to content

Commit

Permalink
Add get_serializer check and warning
Browse files Browse the repository at this point in the history
  • Loading branch information
glowka committed Jun 13, 2020
1 parent 7a2f943 commit 2052324
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 6 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
------------------

- Add support for string-based `included_serializers`
- Warn about missing `get_serializer` for view's list action

0.6.0 (2020-04-11)
------------------
Expand Down
25 changes: 19 additions & 6 deletions drf_yasg_json_api/inspectors/view.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import logging

from collections import OrderedDict

from drf_yasg import inspectors
from drf_yasg import openapi
from drf_yasg.utils import filter_none
from drf_yasg.utils import guess_response_status
from drf_yasg.utils import is_list_view
from rest_framework_json_api.utils import format_value
from rest_framework_json_api.utils import get_included_serializers
from rest_framework_json_api.utils import get_resource_type_from_serializer
Expand All @@ -16,6 +17,8 @@
'SwaggerAutoSchema',
]

logger = logging.getLogger(__name__)


class SwaggerAutoSchema(inspectors.SwaggerAutoSchema):
def get_request_body_schema(self, serializer):
Expand Down Expand Up @@ -54,12 +57,22 @@ def get_default_responses(self):
return filter_none(OrderedDict({str(default_status): default_schema}))

def get_default_response_data(self, default_serializer):
default_data_schema = ''
if default_serializer and not isinstance(default_serializer, openapi.Schema):
if isinstance(default_serializer, openapi.Schema):
default_data_schema = default_serializer
elif default_serializer:
default_data_schema = self.serializer_to_schema(default_serializer) or ''

if is_list_view(self.path, self.method, self.view) and self.method.lower() == 'get':
default_data_schema = openapi.Schema(type=openapi.TYPE_ARRAY, items=default_data_schema)
else:
default_data_schema = ''

if self.is_list_view() and self.method.lower() == 'get':
if default_data_schema:
default_data_schema = openapi.Schema(type=openapi.TYPE_ARRAY, items=default_data_schema)
else:
logger.warning(
'Missing schema definition for list action of {view_name}, have you defined get_serializer?'.format(
view_name=self.view.__class__.__name__
)
)

return default_data_schema

Expand Down
25 changes: 25 additions & 0 deletions tests/test_serializer_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
import drf_yasg.inspectors
import pytest

from django.conf.urls import url
from django.db import models
from drf_yasg import openapi
from drf_yasg.generators import OpenAPISchemaGenerator
from rest_framework import mixins
from rest_framework import routers
from rest_framework import views
from rest_framework import viewsets
from rest_framework_json_api import django_filters
from rest_framework_json_api import filters
Expand Down Expand Up @@ -150,6 +152,29 @@ class ProjectViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
assert set(pagination_response_schema.keys()) == {'page', 'pages', 'count'}


@mock.patch('drf_yasg_json_api.inspectors.view.logger')
def test_get__list_missing_serializer_warning(logger):
class ProjectView(views.APIView):
renderer_classes = [renderers.JSONRenderer]
parser_classes = [parsers.JSONParser]
swagger_schema = BasicSwaggerAutoSchema

def get(*args, **kwargs):
pass

urlpatterns = [
url('projects/', ProjectView.as_view())
]

generator = OpenAPISchemaGenerator(info=openapi.Info(title="", default_version=""), patterns=urlpatterns)

swagger = generator.get_schema(None, True)

assert swagger['paths']['/projects/']['get']
logger.warning.assert_called_once_with('Missing schema definition for list action of ProjectView, '
'have you defined get_serializer?')


def test_get__included():
class MemberSerializer(serializers.ModelSerializer):
# projects = serializers.ResourceRelatedField(many=True, read_only=True)
Expand Down

0 comments on commit 2052324

Please sign in to comment.