Skip to content

Commit e7826ea

Browse files
nmanovicChris Lee-Messer
authored and
Chris Lee-Messer
committed
Swagger documentation (cvat-ai#978)
* Fix swagger problems (exceptions, /api/swagger.json, /api/docs/)
1 parent 7333b31 commit e7826ea

File tree

6 files changed

+40
-12
lines changed

6 files changed

+40
-12
lines changed

cvat-ui/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22

33
/node_modules
44
/dist
5+
/build
6+
/yarn.lock
57

cvat/apps/engine/serializers.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ def to_internal_value(self, data):
2626
return attribute
2727

2828
def to_representation(self, instance):
29-
attribute = super().to_representation(instance)
30-
attribute['values'] = attribute['values'].split('\n')
29+
if instance:
30+
attribute = super().to_representation(instance)
31+
attribute['values'] = attribute['values'].split('\n')
32+
else:
33+
attribute = instance
34+
3135
return attribute
3236

3337
class LabelSerializer(serializers.ModelSerializer):
@@ -75,8 +79,11 @@ def to_internal_value(self, data):
7579

7680
# pylint: disable=no-self-use
7781
def to_representation(self, instance):
78-
upload_dir = instance.task.get_upload_dirname()
79-
return instance.file.path[len(upload_dir) + 1:]
82+
if instance:
83+
upload_dir = instance.task.get_upload_dirname()
84+
return instance.file.path[len(upload_dir) + 1:]
85+
else:
86+
return instance
8087

8188
class ServerFileSerializer(serializers.ModelSerializer):
8289
class Meta:
@@ -89,7 +96,7 @@ def to_internal_value(self, data):
8996

9097
# pylint: disable=no-self-use
9198
def to_representation(self, instance):
92-
return instance.file
99+
return instance.file if instance else instance
93100

94101
class RemoteFileSerializer(serializers.ModelSerializer):
95102
class Meta:
@@ -102,7 +109,7 @@ def to_internal_value(self, data):
102109

103110
# pylint: disable=no-self-use
104111
def to_representation(self, instance):
105-
return instance.file
112+
return instance.file if instance else instance
106113

107114
class RqStatusSerializer(serializers.Serializer):
108115
state = serializers.ChoiceField(choices=[

cvat/apps/engine/urls.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@
3737
path('dashboard/', views.dispatch_request),
3838

3939
# documentation for API
40-
path('api/swagger.<slug:format>$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
41-
path('api/swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
42-
path('api/docs/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
40+
path('api/swagger<str:scheme>', views.wrap_swagger(
41+
schema_view.without_ui(cache_timeout=0)), name='schema-json'),
42+
path('api/swagger/', views.wrap_swagger(
43+
schema_view.with_ui('swagger', cache_timeout=0)), name='schema-swagger-ui'),
44+
path('api/docs/', views.wrap_swagger(
45+
schema_view.with_ui('redoc', cache_timeout=0)), name='schema-redoc'),
4346

4447
# entry point for API
4548
path('api/v1/auth/', include('cvat.apps.authentication.api_urls')),

cvat/apps/engine/views.py

+16
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,22 @@
5555
from drf_yasg.inspectors import NotHandled, CoreAPICompatInspector
5656
from django_filters.rest_framework import DjangoFilterBackend
5757

58+
# drf-yasg component doesn't handle correctly URL_FORMAT_OVERRIDE and
59+
# send requests with ?format=openapi suffix instead of ?scheme=openapi.
60+
# We map the required paramater explicitly and add it into query arguments
61+
# on the server side.
62+
def wrap_swagger(view):
63+
@login_required
64+
def _map_format_to_schema(request, scheme=None):
65+
if 'format' in request.GET:
66+
request.GET = request.GET.copy()
67+
format_alias = settings.REST_FRAMEWORK['URL_FORMAT_OVERRIDE']
68+
request.GET[format_alias] = request.GET['format']
69+
70+
return view(request, format=scheme)
71+
72+
return _map_format_to_schema
73+
5874
# Server REST API
5975
@login_required
6076
def dispatch_request(request):

cvat/requirements/base.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ GitPython==2.1.11
3030
coreapi==2.3.3
3131
django-filter==2.0.0
3232
Markdown==3.0.1
33-
djangorestframework==3.9.1
33+
djangorestframework==3.9.3
3434
Pygments==2.3.1
35-
drf-yasg==1.16.0
35+
drf-yasg==1.17.0
3636
Shapely==1.6.4.post2
3737
pdf2image==1.6.0
3838
pascal_voc_writer==0.1.4

cvat/settings/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def generate_ssh_keys():
145145
'rest_framework.filters.OrderingFilter'),
146146

147147
# Disable default handling of the 'format' query parameter by REST framework
148-
'URL_FORMAT_OVERRIDE': None,
148+
'URL_FORMAT_OVERRIDE': 'scheme',
149149
}
150150

151151
REST_AUTH_REGISTER_SERIALIZERS = {

0 commit comments

Comments
 (0)