Skip to content

Commit c603b98

Browse files
pchiquetPierre Chiquet
and
Pierre Chiquet
authored
Fix OpenAPISchema rendering for timedelta (encode#7641)
* Add failing test when rendering to json a schema with timedelta * Fix JSONOpenAPIRenderer for fields with default=timedelta() * fix isort * fix test for python 3.5 Co-authored-by: Pierre Chiquet <pierre.chiquet@ubikey.fr>
1 parent c69e2e4 commit c603b98

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

rest_framework/renderers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1063,7 +1063,8 @@ def ignore_aliases(self, data):
10631063
class JSONOpenAPIRenderer(BaseRenderer):
10641064
media_type = 'application/vnd.oai.openapi+json'
10651065
charset = None
1066+
encoder_class = encoders.JSONEncoder
10661067
format = 'openapi-json'
10671068

10681069
def render(self, data, media_type=None, renderer_context=None):
1069-
return json.dumps(data, indent=2).encode('utf-8')
1070+
return json.dumps(data, cls=self.encoder_class, indent=2).encode('utf-8')

tests/schemas/test_openapi.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
from rest_framework.compat import uritemplate
1212
from rest_framework.parsers import JSONParser, MultiPartParser
1313
from rest_framework.renderers import (
14-
BaseRenderer, BrowsableAPIRenderer, JSONRenderer, OpenAPIRenderer
14+
BaseRenderer, BrowsableAPIRenderer, JSONOpenAPIRenderer, JSONRenderer,
15+
OpenAPIRenderer
1516
)
1617
from rest_framework.request import Request
1718
from rest_framework.schemas.openapi import AutoSchema, SchemaGenerator
@@ -992,6 +993,19 @@ def test_schema_construction(self):
992993
assert 'openapi' in schema
993994
assert 'paths' in schema
994995

996+
def test_schema_rendering_to_json(self):
997+
patterns = [
998+
path('example/', views.ExampleGenericAPIView.as_view()),
999+
]
1000+
generator = SchemaGenerator(patterns=patterns)
1001+
1002+
request = create_request('/')
1003+
schema = generator.get_schema(request=request)
1004+
ret = JSONOpenAPIRenderer().render(schema)
1005+
1006+
assert b'"openapi": "' in ret
1007+
assert b'"default": "0.0"' in ret
1008+
9951009
def test_schema_with_no_paths(self):
9961010
patterns = []
9971011
generator = SchemaGenerator(patterns=patterns)

tests/schemas/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import uuid
2+
from datetime import timedelta
23

34
from django.core.validators import (
45
DecimalValidator, MaxLengthValidator, MaxValueValidator,
@@ -59,6 +60,7 @@ def get(self, *args, **kwargs):
5960
class ExampleSerializer(serializers.Serializer):
6061
date = serializers.DateField()
6162
datetime = serializers.DateTimeField()
63+
duration = serializers.DurationField(default=timedelta())
6264
hstore = serializers.HStoreField()
6365
uuid_field = serializers.UUIDField(default=uuid.uuid4)
6466

0 commit comments

Comments
 (0)