fix OpenAPIRenderer for timedelta

This commit is contained in:
Rizwan Shaikh 2023-06-12 23:56:40 +05:30
parent 71f87a5864
commit 214702c4d4
2 changed files with 13 additions and 0 deletions

View File

@ -9,6 +9,7 @@ REST framework also provides an HTML renderer that renders the browsable API.
import base64 import base64
import contextlib import contextlib
import datetime
from urllib import parse from urllib import parse
from django import forms from django import forms
@ -1062,6 +1063,7 @@ class OpenAPIRenderer(BaseRenderer):
def ignore_aliases(self, data): def ignore_aliases(self, data):
return True return True
Dumper.add_representer(SafeString, Dumper.represent_str) Dumper.add_representer(SafeString, Dumper.represent_str)
Dumper.add_representer(datetime.timedelta, encoders.CustomScalar.represent_timedelta)
return yaml.dump(data, default_flow_style=False, sort_keys=False, Dumper=Dumper).encode('utf-8') return yaml.dump(data, default_flow_style=False, sort_keys=False, Dumper=Dumper).encode('utf-8')

View File

@ -65,3 +65,14 @@ class JSONEncoder(json.JSONEncoder):
elif hasattr(obj, '__iter__'): elif hasattr(obj, '__iter__'):
return tuple(item for item in obj) return tuple(item for item in obj)
return super().default(obj) return super().default(obj)
class CustomScalar:
"""
CustomScalar that knows how to encode timedelta that renderer
can understand.
"""
@classmethod
def represent_timedelta(cls, dumper, data):
value = str(data.total_seconds())
return dumper.represent_scalar('tag:yaml.org,2002:str', value)