12
12
from django .db import models
13
13
from django .utils .encoding import force_str
14
14
15
- from rest_framework import exceptions , renderers , serializers
15
+ from rest_framework import (
16
+ RemovedInDRF314Warning , exceptions , renderers , serializers
17
+ )
16
18
from rest_framework .compat import uritemplate
17
19
from rest_framework .fields import _UnvalidatedField , empty
18
20
from rest_framework .settings import api_settings
@@ -146,15 +148,15 @@ def get_operation(self, path, method):
146
148
operation ['description' ] = self .get_description (path , method )
147
149
148
150
parameters = []
149
- parameters += self ._get_path_parameters (path , method )
150
- parameters += self ._get_pagination_parameters (path , method )
151
- parameters += self ._get_filter_parameters (path , method )
151
+ parameters += self .get_path_parameters (path , method )
152
+ parameters += self .get_pagination_parameters (path , method )
153
+ parameters += self .get_filter_parameters (path , method )
152
154
operation ['parameters' ] = parameters
153
155
154
- request_body = self ._get_request_body (path , method )
156
+ request_body = self .get_request_body (path , method )
155
157
if request_body :
156
158
operation ['requestBody' ] = request_body
157
- operation ['responses' ] = self ._get_responses (path , method )
159
+ operation ['responses' ] = self .get_responses (path , method )
158
160
operation ['tags' ] = self .get_tags (path , method )
159
161
160
162
return operation
@@ -190,14 +192,14 @@ def get_components(self, path, method):
190
192
if method .lower () == 'delete' :
191
193
return {}
192
194
193
- serializer = self ._get_serializer (path , method )
195
+ serializer = self .get_serializer (path , method )
194
196
195
197
if not isinstance (serializer , serializers .Serializer ):
196
198
return {}
197
199
198
200
component_name = self .get_component_name (serializer )
199
201
200
- content = self ._map_serializer (serializer )
202
+ content = self .map_serializer (serializer )
201
203
return {component_name : content }
202
204
203
205
def _to_camel_case (self , snake_str ):
@@ -220,8 +222,8 @@ def get_operation_id_base(self, path, method, action):
220
222
name = model .__name__
221
223
222
224
# Try with the serializer class name
223
- elif self ._get_serializer (path , method ) is not None :
224
- name = self ._get_serializer (path , method ).__class__ .__name__
225
+ elif self .get_serializer (path , method ) is not None :
226
+ name = self .get_serializer (path , method ).__class__ .__name__
225
227
if name .endswith ('Serializer' ):
226
228
name = name [:- 10 ]
227
229
@@ -259,7 +261,7 @@ def get_operation_id(self, path, method):
259
261
260
262
return action + name
261
263
262
- def _get_path_parameters (self , path , method ):
264
+ def get_path_parameters (self , path , method ):
263
265
"""
264
266
Return a list of parameters from templated path variables.
265
267
"""
@@ -295,15 +297,15 @@ def _get_path_parameters(self, path, method):
295
297
296
298
return parameters
297
299
298
- def _get_filter_parameters (self , path , method ):
299
- if not self ._allows_filters (path , method ):
300
+ def get_filter_parameters (self , path , method ):
301
+ if not self .allows_filters (path , method ):
300
302
return []
301
303
parameters = []
302
304
for filter_backend in self .view .filter_backends :
303
305
parameters += filter_backend ().get_schema_operation_parameters (self .view )
304
306
return parameters
305
307
306
- def _allows_filters (self , path , method ):
308
+ def allows_filters (self , path , method ):
307
309
"""
308
310
Determine whether to include filter Fields in schema.
309
311
@@ -316,19 +318,19 @@ def _allows_filters(self, path, method):
316
318
return self .view .action in ["list" , "retrieve" , "update" , "partial_update" , "destroy" ]
317
319
return method .lower () in ["get" , "put" , "patch" , "delete" ]
318
320
319
- def _get_pagination_parameters (self , path , method ):
321
+ def get_pagination_parameters (self , path , method ):
320
322
view = self .view
321
323
322
324
if not is_list_view (path , method , view ):
323
325
return []
324
326
325
- paginator = self ._get_paginator ()
327
+ paginator = self .get_paginator ()
326
328
if not paginator :
327
329
return []
328
330
329
331
return paginator .get_schema_operation_parameters (view )
330
332
331
- def _map_choicefield (self , field ):
333
+ def map_choicefield (self , field ):
332
334
choices = list (OrderedDict .fromkeys (field .choices )) # preserve order and remove duplicates
333
335
if all (isinstance (choice , bool ) for choice in choices ):
334
336
type = 'boolean'
@@ -356,24 +358,24 @@ def _map_choicefield(self, field):
356
358
mapping ['type' ] = type
357
359
return mapping
358
360
359
- def _map_field (self , field ):
361
+ def map_field (self , field ):
360
362
361
363
# Nested Serializers, `many` or not.
362
364
if isinstance (field , serializers .ListSerializer ):
363
365
return {
364
366
'type' : 'array' ,
365
- 'items' : self ._map_serializer (field .child )
367
+ 'items' : self .map_serializer (field .child )
366
368
}
367
369
if isinstance (field , serializers .Serializer ):
368
- data = self ._map_serializer (field )
370
+ data = self .map_serializer (field )
369
371
data ['type' ] = 'object'
370
372
return data
371
373
372
374
# Related fields.
373
375
if isinstance (field , serializers .ManyRelatedField ):
374
376
return {
375
377
'type' : 'array' ,
376
- 'items' : self ._map_field (field .child_relation )
378
+ 'items' : self .map_field (field .child_relation )
377
379
}
378
380
if isinstance (field , serializers .PrimaryKeyRelatedField ):
379
381
model = getattr (field .queryset , 'model' , None )
@@ -389,11 +391,11 @@ def _map_field(self, field):
389
391
if isinstance (field , serializers .MultipleChoiceField ):
390
392
return {
391
393
'type' : 'array' ,
392
- 'items' : self ._map_choicefield (field )
394
+ 'items' : self .map_choicefield (field )
393
395
}
394
396
395
397
if isinstance (field , serializers .ChoiceField ):
396
- return self ._map_choicefield (field )
398
+ return self .map_choicefield (field )
397
399
398
400
# ListField.
399
401
if isinstance (field , serializers .ListField ):
@@ -402,7 +404,7 @@ def _map_field(self, field):
402
404
'items' : {},
403
405
}
404
406
if not isinstance (field .child , _UnvalidatedField ):
405
- mapping ['items' ] = self ._map_field (field .child )
407
+ mapping ['items' ] = self .map_field (field .child )
406
408
return mapping
407
409
408
410
# DateField and DateTimeField type is string
@@ -504,7 +506,7 @@ def _map_min_max(self, field, content):
504
506
if field .min_value :
505
507
content ['minimum' ] = field .min_value
506
508
507
- def _map_serializer (self , serializer ):
509
+ def map_serializer (self , serializer ):
508
510
# Assuming we have a valid serializer instance.
509
511
required = []
510
512
properties = {}
@@ -516,7 +518,7 @@ def _map_serializer(self, serializer):
516
518
if field .required :
517
519
required .append (field .field_name )
518
520
519
- schema = self ._map_field (field )
521
+ schema = self .map_field (field )
520
522
if field .read_only :
521
523
schema ['readOnly' ] = True
522
524
if field .write_only :
@@ -527,7 +529,7 @@ def _map_serializer(self, serializer):
527
529
schema ['default' ] = field .default
528
530
if field .help_text :
529
531
schema ['description' ] = str (field .help_text )
530
- self ._map_field_validators (field , schema )
532
+ self .map_field_validators (field , schema )
531
533
532
534
properties [field .field_name ] = schema
533
535
@@ -540,7 +542,7 @@ def _map_serializer(self, serializer):
540
542
541
543
return result
542
544
543
- def _map_field_validators (self , field , schema ):
545
+ def map_field_validators (self , field , schema ):
544
546
"""
545
547
map field validators
546
548
"""
@@ -578,7 +580,7 @@ def _map_field_validators(self, field, schema):
578
580
schema ['maximum' ] = int (digits * '9' ) + 1
579
581
schema ['minimum' ] = - schema ['maximum' ]
580
582
581
- def _get_paginator (self ):
583
+ def get_paginator (self ):
582
584
pagination_class = getattr (self .view , 'pagination_class' , None )
583
585
if pagination_class :
584
586
return pagination_class ()
@@ -596,7 +598,7 @@ def map_renderers(self, path, method):
596
598
media_types .append (renderer .media_type )
597
599
return media_types
598
600
599
- def _get_serializer (self , path , method ):
601
+ def get_serializer (self , path , method ):
600
602
view = self .view
601
603
602
604
if not hasattr (view , 'get_serializer' ):
@@ -614,13 +616,13 @@ def _get_serializer(self, path, method):
614
616
def _get_reference (self , serializer ):
615
617
return {'$ref' : '#/components/schemas/{}' .format (self .get_component_name (serializer ))}
616
618
617
- def _get_request_body (self , path , method ):
619
+ def get_request_body (self , path , method ):
618
620
if method not in ('PUT' , 'PATCH' , 'POST' ):
619
621
return {}
620
622
621
623
self .request_media_types = self .map_parsers (path , method )
622
624
623
- serializer = self ._get_serializer (path , method )
625
+ serializer = self .get_serializer (path , method )
624
626
625
627
if not isinstance (serializer , serializers .Serializer ):
626
628
item_schema = {}
@@ -634,8 +636,7 @@ def _get_request_body(self, path, method):
634
636
}
635
637
}
636
638
637
- def _get_responses (self , path , method ):
638
- # TODO: Handle multiple codes and pagination classes.
639
+ def get_responses (self , path , method ):
639
640
if method == 'DELETE' :
640
641
return {
641
642
'204' : {
@@ -645,7 +646,7 @@ def _get_responses(self, path, method):
645
646
646
647
self .response_media_types = self .map_renderers (path , method )
647
648
648
- serializer = self ._get_serializer (path , method )
649
+ serializer = self .get_serializer (path , method )
649
650
650
651
if not isinstance (serializer , serializers .Serializer ):
651
652
item_schema = {}
@@ -657,7 +658,7 @@ def _get_responses(self, path, method):
657
658
'type' : 'array' ,
658
659
'items' : item_schema ,
659
660
}
660
- paginator = self ._get_paginator ()
661
+ paginator = self .get_paginator ()
661
662
if paginator :
662
663
response_schema = paginator .get_paginated_response_schema (response_schema )
663
664
else :
@@ -688,3 +689,99 @@ def get_tags(self, path, method):
688
689
path = path [1 :]
689
690
690
691
return [path .split ('/' )[0 ].replace ('_' , '-' )]
692
+
693
+ def _get_path_parameters (self , path , method ):
694
+ warnings .warn (
695
+ "Method `_get_path_parameters()` has been renamed to `get_path_parameters()`. "
696
+ "The old name will be removed in DRF v3.14." ,
697
+ RemovedInDRF314Warning , stacklevel = 2
698
+ )
699
+ return self .get_path_parameters (path , method )
700
+
701
+ def _get_filter_parameters (self , path , method ):
702
+ warnings .warn (
703
+ "Method `_get_filter_parameters()` has been renamed to `get_filter_parameters()`. "
704
+ "The old name will be removed in DRF v3.14." ,
705
+ RemovedInDRF314Warning , stacklevel = 2
706
+ )
707
+ return self .get_filter_parameters (path , method )
708
+
709
+ def _get_responses (self , path , method ):
710
+ warnings .warn (
711
+ "Method `_get_responses()` has been renamed to `get_responses()`. "
712
+ "The old name will be removed in DRF v3.14." ,
713
+ RemovedInDRF314Warning , stacklevel = 2
714
+ )
715
+ return self .get_responses (path , method )
716
+
717
+ def _get_request_body (self , path , method ):
718
+ warnings .warn (
719
+ "Method `_get_request_body()` has been renamed to `get_request_body()`. "
720
+ "The old name will be removed in DRF v3.14." ,
721
+ RemovedInDRF314Warning , stacklevel = 2
722
+ )
723
+ return self .get_request_body (path , method )
724
+
725
+ def _get_serializer (self , path , method ):
726
+ warnings .warn (
727
+ "Method `_get_serializer()` has been renamed to `get_serializer()`. "
728
+ "The old name will be removed in DRF v3.14." ,
729
+ RemovedInDRF314Warning , stacklevel = 2
730
+ )
731
+ return self .get_serializer (path , method )
732
+
733
+ def _get_paginator (self ):
734
+ warnings .warn (
735
+ "Method `_get_paginator()` has been renamed to `get_paginator()`. "
736
+ "The old name will be removed in DRF v3.14." ,
737
+ RemovedInDRF314Warning , stacklevel = 2
738
+ )
739
+ return self .get_paginator ()
740
+
741
+ def _map_field_validators (self , field , schema ):
742
+ warnings .warn (
743
+ "Method `_map_field_validators()` has been renamed to `map_field_validators()`. "
744
+ "The old name will be removed in DRF v3.14." ,
745
+ RemovedInDRF314Warning , stacklevel = 2
746
+ )
747
+ return self .map_field_validators (field , schema )
748
+
749
+ def _map_serializer (self , serializer ):
750
+ warnings .warn (
751
+ "Method `_map_serializer()` has been renamed to `map_serializer()`. "
752
+ "The old name will be removed in DRF v3.14." ,
753
+ RemovedInDRF314Warning , stacklevel = 2
754
+ )
755
+ return self .map_serializer (serializer )
756
+
757
+ def _map_field (self , field ):
758
+ warnings .warn (
759
+ "Method `_map_field()` has been renamed to `map_field()`. "
760
+ "The old name will be removed in DRF v3.14." ,
761
+ RemovedInDRF314Warning , stacklevel = 2
762
+ )
763
+ return self .map_field (field )
764
+
765
+ def _map_choicefield (self , field ):
766
+ warnings .warn (
767
+ "Method `_map_choicefield()` has been renamed to `map_choicefield()`. "
768
+ "The old name will be removed in DRF v3.14." ,
769
+ RemovedInDRF314Warning , stacklevel = 2
770
+ )
771
+ return self .map_choicefield (field )
772
+
773
+ def _get_pagination_parameters (self , path , method ):
774
+ warnings .warn (
775
+ "Method `_get_pagination_parameters()` has been renamed to `get_pagination_parameters()`. "
776
+ "The old name will be removed in DRF v3.14." ,
777
+ RemovedInDRF314Warning , stacklevel = 2
778
+ )
779
+ return self .get_pagination_parameters (path , method )
780
+
781
+ def _allows_filters (self , path , method ):
782
+ warnings .warn (
783
+ "Method `_allows_filters()` has been renamed to `allows_filters()`. "
784
+ "The old name will be removed in DRF v3.14." ,
785
+ RemovedInDRF314Warning , stacklevel = 2
786
+ )
787
+ return self .allows_filters (path , method )
0 commit comments