1
1
import warnings
2
+ from operator import attrgetter
2
3
from urllib .parse import urljoin
3
4
4
5
from django .core .validators import (
8
9
from django .db import models
9
10
from django .utils .encoding import force_str
10
11
11
- from rest_framework import exceptions , serializers
12
+ from rest_framework import exceptions , renderers , serializers
12
13
from rest_framework .compat import uritemplate
13
14
from rest_framework .fields import _UnvalidatedField , empty
14
15
@@ -78,7 +79,9 @@ def get_schema(self, request=None, public=False):
78
79
79
80
class AutoSchema (ViewInspector ):
80
81
81
- content_types = ['application/json' ]
82
+ request_media_types = []
83
+ response_media_types = []
84
+
82
85
method_mapping = {
83
86
'get' : 'Retrieve' ,
84
87
'post' : 'Create' ,
@@ -336,6 +339,12 @@ def _map_field(self, field):
336
339
self ._map_min_max (field , content )
337
340
return content
338
341
342
+ if isinstance (field , serializers .FileField ):
343
+ return {
344
+ 'type' : 'string' ,
345
+ 'format' : 'binary'
346
+ }
347
+
339
348
# Simplest cases, default to 'string' type:
340
349
FIELD_CLASS_SCHEMA_TYPE = {
341
350
serializers .BooleanField : 'boolean' ,
@@ -430,9 +439,19 @@ def _get_pagninator(self):
430
439
pagination_class = getattr (self .view , 'pagination_class' , None )
431
440
if pagination_class :
432
441
return pagination_class ()
433
-
434
442
return None
435
443
444
+ def map_parsers (self , path , method ):
445
+ return list (map (attrgetter ('media_type' ), self .view .parser_classes ))
446
+
447
+ def map_renderers (self , path , method ):
448
+ media_types = []
449
+ for renderer in self .view .renderer_classes :
450
+ # I assume this is not relevant to OpenAPI spec
451
+ if renderer != renderers .BrowsableAPIRenderer :
452
+ media_types .append (renderer .media_type )
453
+ return media_types
454
+
436
455
def _get_serializer (self , method , path ):
437
456
view = self .view
438
457
@@ -452,6 +471,8 @@ def _get_request_body(self, path, method):
452
471
if method not in ('PUT' , 'PATCH' , 'POST' ):
453
472
return {}
454
473
474
+ self .request_media_types = self .map_parsers (path , method )
475
+
455
476
serializer = self ._get_serializer (path , method )
456
477
457
478
if not isinstance (serializer , serializers .Serializer ):
@@ -469,7 +490,7 @@ def _get_request_body(self, path, method):
469
490
return {
470
491
'content' : {
471
492
ct : {'schema' : content }
472
- for ct in self .content_types
493
+ for ct in self .request_media_types
473
494
}
474
495
}
475
496
@@ -482,6 +503,8 @@ def _get_responses(self, path, method):
482
503
}
483
504
}
484
505
506
+ self .response_media_types = self .map_renderers (path , method )
507
+
485
508
item_schema = {}
486
509
serializer = self ._get_serializer (path , method )
487
510
@@ -509,7 +532,7 @@ def _get_responses(self, path, method):
509
532
'200' : {
510
533
'content' : {
511
534
ct : {'schema' : response_schema }
512
- for ct in self .content_types
535
+ for ct in self .response_media_types
513
536
},
514
537
# description is a mandatory property,
515
538
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject
0 commit comments