Skip to content

Commit 43b881d

Browse files
committed
determine error codes for validation errors only when the request serializer is indeed a serializer and not a basic type set using extend_schema (fixes #20)
1 parent 26d45f5 commit 43b881d

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

docs/changelog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
66

77
## [UNRELEASED]
8+
### Fixed
9+
- account for specifying the request serializer as a basic type using `@extend_schema(request=OpenApiTypes.STR)`
10+
when determining error codes for validation errors.
811

912
## [0.12.3] - 2022-11-13
1013
### Added

drf_standardized_errors/openapi.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import inspect
12
from typing import List, Optional, Type
23

34
from drf_spectacular.drainage import warn
@@ -131,8 +132,13 @@ def _should_add_validation_error_response(self) -> bool:
131132
to override to accomplish that (maybe sth like
132133
isinstance(self.view, SomeViewSet) and checking self.method)
133134
"""
134-
has_request_body = self.method in ("PUT", "PATCH", "POST") and bool(
135-
self.get_request_serializer()
135+
request_serializer = self.get_request_serializer()
136+
has_request_body = self.method in ("PUT", "PATCH", "POST") and (
137+
isinstance(request_serializer, serializers.Field)
138+
or (
139+
inspect.isclass(request_serializer)
140+
and issubclass(request_serializer, serializers.Field)
141+
)
136142
)
137143

138144
filter_backends = get_django_filter_backends(self.get_filter_backends())

tests/test_openapi.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from django_filters import CharFilter
55
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
66
from drf_spectacular.generators import SchemaGenerator
7+
from drf_spectacular.types import OpenApiTypes
8+
from drf_spectacular.utils import extend_schema
79
from rest_framework import serializers
810
from rest_framework.authentication import BasicAuthentication
911
from rest_framework.generics import GenericAPIView, ListAPIView
@@ -118,6 +120,27 @@ def test_no_validation_error_for_unsafe_method():
118120
assert "400" not in responses
119121

120122

123+
class OpenAPITypesView(GenericAPIView):
124+
# ensure that 400 is not added due to the parser classes by using a parser
125+
# that does not raise a ParseError which results in adding a 400 error response
126+
parser_classes = [CustomParser]
127+
128+
@extend_schema(request=OpenApiTypes.OBJECT, responses={204: None})
129+
def post(self, request, *args, **kwargs):
130+
return Response(status=204)
131+
132+
133+
def test_no_error_raised_when_request_serializer_is_set_as_openapi_type():
134+
route = "validate/"
135+
view = OpenAPITypesView.as_view()
136+
try:
137+
generate_view_schema(route, view)
138+
except Exception:
139+
pytest.fail(
140+
"Schema generation failed when using `@extend_schema(request.OpenApiTypes.OBJECT)`"
141+
)
142+
143+
121144
class CustomFilterSet(FilterSet):
122145
first_name = CharFilter()
123146

0 commit comments

Comments
 (0)