1
0
mirror of https://github.com/openvinotoolkit/cvat.git synced 2022-03-09 18:58:10 +03:00

Add small improvements

This commit is contained in:
Maya
2022-02-26 00:57:26 +03:00
parent 6ea6c68bc8
commit 1bbcd6d07b
5 changed files with 424 additions and 392 deletions

View File

@@ -73,6 +73,7 @@ from cvat.apps.iam.permissions import (CloudStoragePermission,
CommentPermission, IssuePermission, JobPermission, ProjectPermission,
TaskPermission, UserPermission)
@extend_schema(tags=['server'])
class ServerViewSet(viewsets.ViewSet):
serializer_class = None
iam_organization_field = None
@@ -86,8 +87,7 @@ class ServerViewSet(viewsets.ViewSet):
@extend_schema(summary='Method provides basic CVAT information',
responses={
'200': AboutSerializer,
},
tags=['server'], versions=['2.0'])
})
@action(detail=False, methods=['GET'], serializer_class=AboutSerializer)
def about(request):
from cvat import __version__ as cvat_version
@@ -111,8 +111,7 @@ class ServerViewSet(viewsets.ViewSet):
description='Sends logs to the ELK if it is connected',
request=ExceptionSerializer, responses={
'201': ExceptionSerializer,
},
tags=['server'], versions=['2.0'])
})
@action(detail=False, methods=['POST'], serializer_class=ExceptionSerializer)
def exception(request):
serializer = ExceptionSerializer(data=request.data)
@@ -139,7 +138,7 @@ class ServerViewSet(viewsets.ViewSet):
request=LogEventSerializer(many=True),
responses={
'201': LogEventSerializer(many=True),
}, tags=['server'], versions=['2.0'])
})
@action(detail=False, methods=['POST'], serializer_class=LogEventSerializer)
def logs(request):
serializer = LogEventSerializer(many=True, data=request.data)
@@ -166,7 +165,7 @@ class ServerViewSet(viewsets.ViewSet):
],
responses={
'200' : FileInfoSerializer(many=True)
}, tags=['server'], versions=['2.0'])
})
@action(detail=False, methods=['GET'], serializer_class=FileInfoSerializer)
def share(request):
param = request.query_params.get('directory', '/')
@@ -199,7 +198,7 @@ class ServerViewSet(viewsets.ViewSet):
summary='Method provides the list of supported annotations formats',
responses={
'200': DatasetFormatsSerializer,
}, tags=['server'], versions=['2.0'])
})
@action(detail=False, methods=['GET'], url_path='annotation/formats')
def annotation_formats(request):
data = dm.views.get_all_formats()
@@ -210,7 +209,7 @@ class ServerViewSet(viewsets.ViewSet):
summary='Method provides allowed plugins',
responses={
'200': PluginsSerializer,
}, tags=['server'], versions=['2.0'])
})
@action(detail=False, methods=['GET'], url_path='plugins', serializer_class=PluginsSerializer)
def plugins(request):
response = {
@@ -221,7 +220,6 @@ class ServerViewSet(viewsets.ViewSet):
}
return Response(response)
class ProjectFilter(filters.FilterSet):
name = filters.CharFilter(field_name="name", lookup_expr="icontains")
owner = filters.CharFilter(field_name="owner__username", lookup_expr="icontains")
@@ -232,46 +230,49 @@ class ProjectFilter(filters.FilterSet):
model = models.Project
fields = ("id", "name", "owner", "status")
@extend_schema_view(list=extend_schema(
summary='Returns a paginated list of projects according to query parameters (12 projects per page)',
parameters=[
OpenApiParameter('id', description='A unique number value identifying this project',
location=OpenApiParameter.QUERY, type=OpenApiTypes.NUMBER),
OpenApiParameter('name', description='Find all projects where name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('owner', description='Find all project where owner name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('status', description='Find all projects with a specific status',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=StatusChoice.list()),
OpenApiParameter('names_only', description="Returns only names and id's of projects",
location=OpenApiParameter.QUERY, type=OpenApiTypes.BOOL)
],
responses={
'200': PolymorphicProxySerializer(component_name='PolymorphicProject',
serializers=[
ProjectSerializer, ProjectSearchSerializer,
], resource_type_field_name='name', many=True),
}, tags=['projects'], versions=['2.0']))
@extend_schema_view(create=extend_schema(
summary='Method creates a new project',
responses={
'201': ProjectSerializer,
}, tags=['projects'], versions=['2.0']))
@extend_schema_view(retrieve=extend_schema(
summary='Method returns details of a specific project',
responses={
'200': ProjectSerializer,
}, tags=['projects'], versions=['2.0']))
@extend_schema_view(destroy=extend_schema(
summary='Method deletes a specific project',
responses={
'204': OpenApiResponse(description='The project has been deleted'),
}, tags=['projects'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a project',
responses={
'200': ProjectSerializer,
}, tags=['projects'], versions=['2.0']))
@extend_schema(tags=['projects'])
@extend_schema_view(
list=extend_schema(
summary='Returns a paginated list of projects according to query parameters (12 projects per page)',
parameters=[
OpenApiParameter('id', description='A unique number value identifying this project',
location=OpenApiParameter.QUERY, type=OpenApiTypes.NUMBER),
OpenApiParameter('name', description='Find all projects where name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('owner', description='Find all project where owner name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('status', description='Find all projects with a specific status',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=StatusChoice.list()),
OpenApiParameter('names_only', description="Returns only names and id's of projects",
location=OpenApiParameter.QUERY, type=OpenApiTypes.BOOL)
],
responses={
'200': PolymorphicProxySerializer(component_name='PolymorphicProject',
serializers=[
ProjectSerializer, ProjectSearchSerializer,
], resource_type_field_name='name', many=True),
}),
create=extend_schema(
summary='Method creates a new project',
responses={
'201': ProjectSerializer,
}),
retrieve=extend_schema(
summary='Method returns details of a specific project',
responses={
'200': ProjectSerializer,
}),
destroy=extend_schema(
summary='Method deletes a specific project',
responses={
'204': OpenApiResponse(description='The project has been deleted'),
}),
partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a project',
responses={
'200': ProjectSerializer,
})
)
class ProjectViewSet(viewsets.ModelViewSet):
queryset = models.Project.objects.prefetch_related(Prefetch('label_set',
queryset=models.Label.objects.order_by('id')
@@ -307,7 +308,7 @@ class ProjectViewSet(viewsets.ModelViewSet):
summary='Method returns information of the tasks of the project with the selected id',
responses={
'200': TaskSerializer(many=True),
}, tags=['projects'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], serializer_class=TaskSerializer)
def tasks(self, request, pk):
self.get_object() # force to call check_object_permissions
@@ -339,7 +340,7 @@ class ProjectViewSet(viewsets.ModelViewSet):
'201': OpenApiResponse(description='Output file is ready for downloading'),
'202': OpenApiResponse(description='Exporting has been started'),
'405': OpenApiResponse(description='Format is not available'),
}, tags=['projects'], versions=['2.0'])
})
@extend_schema(methods=['POST'], summary='Import dataset in specific format as a project',
parameters=[
OpenApiParameter('format', description='Desired dataset format name\n'
@@ -350,7 +351,7 @@ class ProjectViewSet(viewsets.ModelViewSet):
'202': OpenApiResponse(description='Exporting has been started'),
'400': OpenApiResponse(description='Failed to import dataset'),
'405': OpenApiResponse(description='Format is not available'),
}, tags=['projects'], versions=['2.0'])
})
@action(detail=True, methods=['GET', 'POST'], serializer_class=None,
url_path='dataset')
def dataset(self, request, pk):
@@ -419,7 +420,7 @@ class ProjectViewSet(viewsets.ModelViewSet):
'202': OpenApiResponse(description='Dump of annotations has been started'),
'401': OpenApiResponse(description='Format is not specified'),
'405': OpenApiResponse(description='Format is not available'),
}, tags=['projects'], versions=['2.0'])
})
@action(detail=True, methods=['GET'],
serializer_class=LabeledDataSerializer)
def annotations(self, request, pk):
@@ -442,7 +443,7 @@ class ProjectViewSet(viewsets.ModelViewSet):
'200': OpenApiResponse(description='Download of file started'),
'201': OpenApiResponse(description='Output backup file is ready for downloading'),
'202': OpenApiResponse(description='Creating a backup file has been started'),
}, tags=['projects'], versions=['2.0'])
})
@action(methods=['GET'], detail=True, url_path='backup')
def export_backup(self, request, pk=None):
db_project = self.get_object() # force to call check_object_permissions
@@ -452,7 +453,7 @@ class ProjectViewSet(viewsets.ModelViewSet):
responses={
'201': OpenApiResponse(description='The project has been imported'), # or better specify {id: project_id}
'202': OpenApiResponse(description='Importing a backup file has been started'),
}, tags=['projects'], versions=['2.0'])
})
@action(detail=False, methods=['POST'], url_path='backup')
def import_backup(self, request, pk=None):
return backup.import_project(request)
@@ -563,48 +564,51 @@ class TaskFilter(filters.FilterSet):
fields = ("id", "project_id", "project", "name", "owner", "mode", "status",
"assignee")
@extend_schema_view(list=extend_schema(
summary='Returns a paginated list of tasks according to query parameters (10 tasks per page)',
parameters=[
OpenApiParameter('id', description='A unique number value identifying this task',
location=OpenApiParameter.QUERY, type=OpenApiTypes.NUMBER),
OpenApiParameter('name', description='Find all tasks where name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('owner', description='Find all tasks where owner name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('mode', description='Find all tasks with a specific mode',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=['annotation', 'interpolation']),
OpenApiParameter('status', description='Find all tasks with a specific status',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=StatusChoice.list()),
OpenApiParameter('assignee', description='Find all tasks where assignee name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR)
],
responses={
'200': TaskSerializer(many=True),
}, tags=['tasks'], versions=['2.0']))
@extend_schema_view(create=extend_schema(
summary='Method creates a new task in a database without any attached images and videos',
responses={
'201': TaskSerializer,
}, tags=['tasks'], versions=['2.0']))
@extend_schema_view(retrieve=extend_schema(
summary='Method returns details of a specific task',
responses=TaskSerializer, tags=['tasks'], versions=['2.0']))
@extend_schema_view(update=extend_schema(
summary='Method updates a task by id',
responses={
'200': TaskSerializer,
}, tags=['tasks'], versions=['2.0']))
@extend_schema_view(destroy=extend_schema(
summary='Method deletes a specific task, all attached jobs, annotations, and data',
responses={
'204': OpenApiResponse(description='The task has been deleted'),
}, tags=['tasks'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a task',
responses={
'200': TaskSerializer,
}, tags=['tasks'], versions=['2.0']))
@extend_schema(tags=['tasks'])
@extend_schema_view(
list=extend_schema(
summary='Returns a paginated list of tasks according to query parameters (10 tasks per page)',
parameters=[
OpenApiParameter('id', description='A unique number value identifying this task',
location=OpenApiParameter.QUERY, type=OpenApiTypes.NUMBER),
OpenApiParameter('name', description='Find all tasks where name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('owner', description='Find all tasks where owner name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('mode', description='Find all tasks with a specific mode',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=['annotation', 'interpolation']),
OpenApiParameter('status', description='Find all tasks with a specific status',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=StatusChoice.list()),
OpenApiParameter('assignee', description='Find all tasks where assignee name contains a parameter value',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR)
],
responses={
'200': TaskSerializer(many=True),
}),
create=extend_schema(
summary='Method creates a new task in a database without any attached images and videos',
responses={
'201': TaskSerializer,
}),
retrieve=extend_schema(
summary='Method returns details of a specific task',
responses=TaskSerializer),
update=extend_schema(
summary='Method updates a task by id',
responses={
'200': TaskSerializer,
}),
destroy=extend_schema(
summary='Method deletes a specific task, all attached jobs, annotations, and data',
responses={
'204': OpenApiResponse(description='The task has been deleted'),
}),
partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a task',
responses={
'200': TaskSerializer,
})
)
class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
queryset = Task.objects.prefetch_related(
Prefetch('label_set', queryset=models.Label.objects.order_by('id')),
@@ -629,7 +633,7 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
responses={
'201': OpenApiResponse(description='The task has been imported'), # or better specify {id: task_id}
'202': OpenApiResponse(description='Importing a backup file has been started'),
}, tags=['tasks'], versions=['2.0'])
})
@action(detail=False, methods=['POST'], url_path='backup')
def import_backup(self, request, pk=None):
return backup.import_task(request)
@@ -639,7 +643,7 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
'200': OpenApiResponse(description='Download of file started'),
'201': OpenApiResponse(description='Output backup file is ready for downloading'),
'202': OpenApiResponse(description='Creating a backup file has been started'),
}, tags=['tasks'], versions=['2.0'])
})
@action(methods=['GET'], detail=True, url_path='backup')
def export_backup(self, request, pk=None):
db_task = self.get_object() # force to call check_object_permissions
@@ -675,7 +679,7 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
@extend_schema(summary='Method returns a list of jobs for a specific task',
responses={
'200': JobReadSerializer(many=True),
}, tags=['tasks'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], serializer_class=JobReadSerializer)
def jobs(self, request, pk):
self.get_object() # force to call check_object_permissions
@@ -732,7 +736,7 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
],
responses={
'202': OpenApiResponse(description=''),
}, tags=['tasks'], versions=['2.0'])
})
@extend_schema(methods=['GET'], summary='Method returns data for a specific task',
parameters=[
OpenApiParameter('type', location=OpenApiParameter.QUERY, required=True,
@@ -746,7 +750,7 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
],
responses={
'200': OpenApiResponse(description='Data of a specific type'),
}, tags=['tasks'], versions=['2.0'])
})
@action(detail=True, methods=['OPTIONS', 'POST', 'GET'], url_path=r'data/?$')
def data(self, request, pk):
db_task = self.get_object() # call check_object_permissions as well
@@ -788,7 +792,7 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
'201': OpenApiResponse(description='Annotations file is ready to download'),
'202': OpenApiResponse(description='Dump of annotations has been started'),
'405': OpenApiResponse(description='Format is not available'),
}, tags=['tasks'], versions=['2.0'])
})
@extend_schema(methods=['PUT'], summary='Method allows to upload task annotations',
parameters=[
OpenApiParameter('format', location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, required=False,
@@ -798,16 +802,16 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
'201': OpenApiResponse(description='Uploading has finished'),
'202': OpenApiResponse(description='Uploading has been started'),
'405': OpenApiResponse(description='Format is not available'),
}, tags=['tasks'], versions=['2.0'])
})
@extend_schema(methods=['PATCH'], summary='Method performs a partial update of annotations in a specific task',
parameters=[
OpenApiParameter('action', location=OpenApiParameter.QUERY, required=True,
type=OpenApiTypes.STR, enum=['create', 'update', 'delete']),
], tags=['tasks'], versions=['2.0'])
])
@extend_schema(methods=['DELETE'], summary='Method deletes all annotations for a specific task',
responses={
'204': OpenApiResponse(description='The annotation has been deleted'),
}, tags=['tasks'], versions=['2.0'])
})
@action(detail=True, methods=['GET', 'DELETE', 'PUT', 'PATCH'],
serializer_class=LabeledDataSerializer)
def annotations(self, request, pk):
@@ -863,7 +867,7 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
summary='When task is being created the method returns information about a status of the creation process',
responses={
'200': RqStatusSerializer,
}, tags=['tasks'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], serializer_class=RqStatusSerializer)
def status(self, request, pk):
self.get_object() # force to call check_object_permissions
@@ -896,7 +900,7 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
@extend_schema(summary='Method provides a meta information about media files which are related with the task',
responses={
'200': DataMetaSerializer,
}, tags=['tasks'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], serializer_class=DataMetaSerializer,
url_path='data/meta')
def data_info(request, pk):
@@ -940,7 +944,7 @@ class TaskViewSet(UploadMixin, viewsets.ModelViewSet):
'201': OpenApiResponse(description='Output file is ready for downloading'),
'202': OpenApiResponse(description='Exporting has been started'),
'405': OpenApiResponse(description='Format is not available'),
}, tags=['tasks'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], serializer_class=None,
url_path='dataset')
def dataset_export(self, request, pk):
@@ -968,26 +972,29 @@ class JobFilter(filters.FilterSet):
model = Job
fields = ("assignee", )
@extend_schema_view(retrieve=extend_schema(
summary='Method returns details of a job',
responses={
'200': JobReadSerializer,
}, tags=['jobs'], versions=['2.0']))
@extend_schema_view(list=extend_schema(
summary='Method returns a paginated list of jobs according to query parameters',
responses={
'200': JobReadSerializer(many=True),
}, tags=['jobs'], versions=['2.0']))
@extend_schema_view(update=extend_schema(
summary='Method updates a job by id',
responses={
'200': JobWriteSerializer,
}, tags=['jobs'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a job',
responses={
'200': JobWriteSerializer,
}, tags=['jobs'], versions=['2.0']))
@extend_schema(tags=['jobs'])
@extend_schema_view(
retrieve=extend_schema(
summary='Method returns details of a job',
responses={
'200': JobReadSerializer,
}),
list=extend_schema(
summary='Method returns a paginated list of jobs according to query parameters',
responses={
'200': JobReadSerializer(many=True),
}),
update=extend_schema(
summary='Method updates a job by id',
responses={
'200': JobWriteSerializer,
}),
partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a job',
responses={
'200': JobWriteSerializer,
})
)
class JobViewSet(viewsets.GenericViewSet, mixins.ListModelMixin,
mixins.RetrieveModelMixin, mixins.UpdateModelMixin):
queryset = Job.objects.all().order_by('id')
@@ -1011,13 +1018,13 @@ class JobViewSet(viewsets.GenericViewSet, mixins.ListModelMixin,
@extend_schema(methods=['GET'], summary='Method returns annotations for a specific job',
responses={
'200': LabeledDataSerializer(many=True),
}, tags=['jobs'], versions=['2.0'])
})
@extend_schema(methods=['PUT'], summary='Method performs an update of all annotations in a specific job',
request=AnnotationFileSerializer, responses={
'201': OpenApiResponse(description='Uploading has finished'),
'202': OpenApiResponse(description='Uploading has been started'),
'405': OpenApiResponse(description='Format is not available'),
}, tags=['jobs'], versions=['2.0'])
})
@extend_schema(methods=['PATCH'], summary='Method performs a partial update of annotations in a specific job',
parameters=[
OpenApiParameter('action', location=OpenApiParameter.QUERY, type=OpenApiTypes.STR,
@@ -1026,11 +1033,11 @@ class JobViewSet(viewsets.GenericViewSet, mixins.ListModelMixin,
responses={
#TODO
'200': OpenApiResponse(description=''),
}, tags=['jobs'], versions=['2.0'])
})
@extend_schema(methods=['DELETE'], summary='Method deletes all annotations for a specific job',
responses={
'204': OpenApiResponse(description='The annotation has been deleted'),
}, tags=['jobs'], versions=['2.0'])
})
@action(detail=True, methods=['GET', 'DELETE', 'PUT', 'PATCH'],
serializer_class=LabeledDataSerializer)
def annotations(self, request, pk):
@@ -1076,7 +1083,7 @@ class JobViewSet(viewsets.GenericViewSet, mixins.ListModelMixin,
summary='Method returns list of issues for the job',
responses={
'200': IssueReadSerializer(many=True)
}, tags=['jobs'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], serializer_class=IssueReadSerializer)
def issues(self, request, pk):
db_job = self.get_object()
@@ -1099,7 +1106,7 @@ class JobViewSet(viewsets.GenericViewSet, mixins.ListModelMixin,
],
responses={
'200': OpenApiResponse(description='Data of a specific type'),
}, tags=['jobs'], versions=['2.0'])
})
@action(detail=True, methods=['GET'])
def data(self, request, pk):
db_job = self.get_object() # call check_object_permissions as well
@@ -1113,36 +1120,39 @@ class JobViewSet(viewsets.GenericViewSet, mixins.ListModelMixin,
return data_getter(request, db_job.segment.start_frame,
db_job.segment.stop_frame, db_job.segment.task.data)
@extend_schema_view(retrieve=extend_schema(
summary='Method returns details of an issue',
responses={
'200': IssueReadSerializer,
}, tags=['issues'], versions=['2.0']))
@extend_schema_view(list=extend_schema(
summary='Method returns a paginated list of issues according to query parameters',
responses={
'200': IssueReadSerializer(many=True),
}, tags=['issues'], versions=['2.0']))
@extend_schema_view(update=extend_schema(
summary='Method updates an issue by id',
responses={
'200': IssueWriteSerializer,
}, tags=['issues'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in an issue',
responses={
'200': IssueWriteSerializer,
}, tags=['issues'], versions=['2.0']))
@extend_schema_view(create=extend_schema(
summary='Method creates an issue',
responses={
'201': IssueWriteSerializer,
}, tags=['issues'], versions=['2.0']))
@extend_schema_view(destroy=extend_schema(
summary='Method deletes an issue',
responses={
'204': OpenApiResponse(description='The issue has been deleted'),
}, tags=['issues'], versions=['2.0']))
@extend_schema(tags=['issues'])
@extend_schema_view(
retrieve=extend_schema(
summary='Method returns details of an issue',
responses={
'200': IssueReadSerializer,
}),
list=extend_schema(
summary='Method returns a paginated list of issues according to query parameters',
responses={
'200': IssueReadSerializer(many=True),
}),
update=extend_schema(
summary='Method updates an issue by id',
responses={
'200': IssueWriteSerializer,
}),
partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in an issue',
responses={
'200': IssueWriteSerializer,
}),
create=extend_schema(
summary='Method creates an issue',
responses={
'201': IssueWriteSerializer,
}),
destroy=extend_schema(
summary='Method deletes an issue',
responses={
'204': OpenApiResponse(description='The issue has been deleted'),
})
)
class IssueViewSet(viewsets.ModelViewSet):
queryset = Issue.objects.all().order_by('-id')
http_method_names = ['get', 'post', 'patch', 'delete', 'options']
@@ -1168,7 +1178,7 @@ class IssueViewSet(viewsets.ModelViewSet):
@extend_schema(summary='The action returns all comments of a specific issue',
responses={
'200': CommentReadSerializer(many=True),
}, tags=['issues'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], serializer_class=CommentReadSerializer)
def comments(self, request, pk):
db_issue = self.get_object()
@@ -1178,36 +1188,39 @@ class IssueViewSet(viewsets.ModelViewSet):
return Response(serializer.data)
@extend_schema_view(retrieve=extend_schema(
summary='Method returns details of a comment',
responses={
'200': CommentReadSerializer,
}, tags=['comments'], versions=['2.0']))
@extend_schema_view(list=extend_schema(
summary='Method returns a paginated list of comments according to query parameters',
responses={
'200':CommentReadSerializer(many=True),
}, tags=['comments'], versions=['2.0']))
@extend_schema_view(update=extend_schema(
summary='Method updates a comment by id',
responses={
'200': CommentWriteSerializer,
}, tags=['comments'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a comment',
responses={
'200': CommentWriteSerializer,
}, tags=['comments'], versions=['2.0']))
@extend_schema_view(create=extend_schema(
summary='Method creates a comment',
responses={
'201': CommentWriteSerializer,
}, tags=['comments'], versions=['2.0']))
@extend_schema_view(destroy=extend_schema(
summary='Method deletes a comment',
responses={
'204': OpenApiResponse(description='The comment has been deleted'),
}, tags=['comments'], versions=['2.0']))
@extend_schema(tags=['comments'])
@extend_schema_view(
retrieve=extend_schema(
summary='Method returns details of a comment',
responses={
'200': CommentReadSerializer,
}),
list=extend_schema(
summary='Method returns a paginated list of comments according to query parameters',
responses={
'200':CommentReadSerializer(many=True),
}),
update=extend_schema(
summary='Method updates a comment by id',
responses={
'200': CommentWriteSerializer,
}),
partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a comment',
responses={
'200': CommentWriteSerializer,
}),
create=extend_schema(
summary='Method creates a comment',
responses={
'201': CommentWriteSerializer,
}),
destroy=extend_schema(
summary='Method deletes a comment',
responses={
'204': OpenApiResponse(description='The comment has been deleted'),
})
)
class CommentViewSet(viewsets.ModelViewSet):
queryset = Comment.objects.all().order_by('-id')
http_method_names = ['get', 'post', 'patch', 'delete', 'options']
@@ -1235,41 +1248,44 @@ class UserFilter(filters.FilterSet):
model = User
fields = ("id", "is_active")
@extend_schema_view(list=extend_schema(
summary='Method provides a paginated list of users registered on the server',
parameters=[
OpenApiParameter('id', description='A unique number value identifying this user',
location=OpenApiParameter.QUERY, type=OpenApiTypes.NUMBER),
OpenApiParameter('is_active', description='Returns only active users',
location=OpenApiParameter.QUERY, type=OpenApiTypes.BOOL),
],
responses={
'200': PolymorphicProxySerializer(component_name='MetaUser',
serializers=[
UserSerializer, BasicUserSerializer,
], resource_type_field_name='username'),
}, tags=['users'], versions=['2.0']))
@extend_schema_view(retrieve=extend_schema(
summary='Method provides information of a specific user',
responses={
'200': PolymorphicProxySerializer(component_name='MetaUser',
serializers=[
UserSerializer, BasicUserSerializer,
], resource_type_field_name='username'),
}, tags=['users'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Method updates chosen fields of a user',
responses={
'200': PolymorphicProxySerializer(component_name='MetaUser',
serializers=[
UserSerializer, BasicUserSerializer,
], resource_type_field_name='username'),
}, tags=['users'], versions=['2.0']))
@extend_schema_view(destroy=extend_schema(
summary='Method deletes a specific user from the server',
responses={
'204': OpenApiResponse(description='The user has been deleted'),
}, tags=['users'], versions=['2.0']))
@extend_schema(tags=['users'])
@extend_schema_view(
list=extend_schema(
summary='Method provides a paginated list of users registered on the server',
parameters=[
OpenApiParameter('id', description='A unique number value identifying this user',
location=OpenApiParameter.QUERY, type=OpenApiTypes.NUMBER),
OpenApiParameter('is_active', description='Returns only active users',
location=OpenApiParameter.QUERY, type=OpenApiTypes.BOOL),
],
responses={
'200': PolymorphicProxySerializer(component_name='MetaUser',
serializers=[
UserSerializer, BasicUserSerializer,
], resource_type_field_name='username'),
}),
retrieve=extend_schema(
summary='Method provides information of a specific user',
responses={
'200': PolymorphicProxySerializer(component_name='MetaUser',
serializers=[
UserSerializer, BasicUserSerializer,
], resource_type_field_name='username'),
}),
partial_update=extend_schema(
summary='Method updates chosen fields of a user',
responses={
'200': PolymorphicProxySerializer(component_name='MetaUser',
serializers=[
UserSerializer, BasicUserSerializer,
], resource_type_field_name='username'),
}),
destroy=extend_schema(
summary='Method deletes a specific user from the server',
responses={
'204': OpenApiResponse(description='The user has been deleted'),
})
)
class UserViewSet(viewsets.GenericViewSet, mixins.ListModelMixin,
mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin):
queryset = User.objects.prefetch_related('groups').all().order_by('id')
@@ -1304,7 +1320,7 @@ class UserViewSet(viewsets.GenericViewSet, mixins.ListModelMixin,
serializers=[
UserSerializer, BasicUserSerializer,
], resource_type_field_name='username'),
}, tags=['users'], versions=['2.0'])
})
@action(detail=False, methods=['GET'])
def self(self, request):
"""
@@ -1337,49 +1353,52 @@ class CloudStorageFilter(filters.FilterSet):
model = models.CloudStorage
fields = ('id', 'display_name', 'provider_type', 'resource', 'credentials_type', 'description', 'owner')
@extend_schema_view(retrieve=extend_schema(
summary='Method returns details of a specific cloud storage',
responses={
'200': CloudStorageReadSerializer,
}, tags=['cloud storages'], versions=['2.0']))
@extend_schema_view(list=extend_schema(
summary='Returns a paginated list of storages according to query parameters',
parameters=[
OpenApiParameter('provider_type', description='A supported provider of cloud storages',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=CloudProviderChoice.list()),
OpenApiParameter('display_name', description='A display name of storage',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('resource', description='A name of bucket or container',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('owner', description='A resource owner',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('credentials_type', description='A type of a granting access',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=CredentialsTypeChoice.list()),
],
#FIXME
#field_inspectors=[RedefineDescriptionField]
responses={
'200': CloudStorageReadSerializer(many=True),
}, tags=['cloud storages'], versions=['2.0']))
@extend_schema_view(destroy=extend_schema(
summary='Method deletes a specific cloud storage',
responses={
'204': OpenApiResponse(description='The cloud storage has been removed'),
}, tags=['cloud storages'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a cloud storage instance',
# FIXME
#field_inspectors=[RedefineDescriptionField]
responses={
'200': CloudStorageWriteSerializer,
}, tags=['cloud storages'], versions=['2.0']))
@extend_schema_view(create=extend_schema(
summary='Method creates a cloud storage with a specified characteristics',
# FIXME
#field_inspectors=[RedefineDescriptionField],
responses={
'201': CloudStorageWriteSerializer,
}, tags=['cloud storages'], versions=['2.0']))
@extend_schema(tags=['cloud storages'])
@extend_schema_view(
retrieve=extend_schema(
summary='Method returns details of a specific cloud storage',
responses={
'200': CloudStorageReadSerializer,
}),
list=extend_schema(
summary='Returns a paginated list of storages according to query parameters',
parameters=[
OpenApiParameter('provider_type', description='A supported provider of cloud storages',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=CloudProviderChoice.list()),
OpenApiParameter('display_name', description='A display name of storage',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('resource', description='A name of bucket or container',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('owner', description='A resource owner',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR),
OpenApiParameter('credentials_type', description='A type of a granting access',
location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, enum=CredentialsTypeChoice.list()),
],
#FIXME
#field_inspectors=[RedefineDescriptionField]
responses={
'200': CloudStorageReadSerializer(many=True),
}),
destroy=extend_schema(
summary='Method deletes a specific cloud storage',
responses={
'204': OpenApiResponse(description='The cloud storage has been removed'),
}),
partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a cloud storage instance',
# FIXME
#field_inspectors=[RedefineDescriptionField]
responses={
'200': CloudStorageWriteSerializer,
}),
create=extend_schema(
summary='Method creates a cloud storage with a specified characteristics',
# FIXME
#field_inspectors=[RedefineDescriptionField],
responses={
'201': CloudStorageWriteSerializer,
})
)
class CloudStorageViewSet(viewsets.ModelViewSet):
http_method_names = ['get', 'post', 'patch', 'delete']
queryset = CloudStorageModel.objects.all().prefetch_related('data').order_by('-id')
@@ -1441,7 +1460,7 @@ class CloudStorageViewSet(viewsets.ModelViewSet):
],
responses={
'200': OpenApiResponse(response=OpenApiTypes.OBJECT, description='A manifest content'),
}, tags=['cloud storages'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], url_path='content')
def content(self, request, pk):
storage = None
@@ -1501,7 +1520,7 @@ class CloudStorageViewSet(viewsets.ModelViewSet):
@extend_schema(summary='Method returns a preview image from a cloud storage',
responses={
'200': OpenApiResponse(description='Cloud Storage preview'),
}, tags=['cloud storages'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], url_path='preview')
def preview(self, request, pk):
storage = None
@@ -1577,7 +1596,7 @@ class CloudStorageViewSet(viewsets.ModelViewSet):
@extend_schema(summary='Method returns a cloud storage status',
responses={
'200': OpenApiResponse(response=OpenApiTypes.STR, description='Cloud Storage status (AVAILABLE | NOT_FOUND | FORBIDDEN)'),
}, tags=['cloud storages'], versions=['2.0'])
})
@action(detail=True, methods=['GET'], url_path='status')
def status(self, request, pk):
try:

View File

@@ -79,6 +79,7 @@ class ContextMiddleware:
return self.get_response(request)
@extend_schema(tags=['auth'])
@extend_schema_view(post=extend_schema(
summary='This method signs URL for access to the server',
description='Signed URL contains a token which authenticates a user on the server.'
@@ -89,7 +90,7 @@ class ContextMiddleware:
'url': serializers.CharField(),
}
),
responses={'200': OpenApiResponse(response=OpenApiTypes.STR, description='text URL')}, tags=['auth'], versions=['2.0']))
responses={'200': OpenApiResponse(response=OpenApiTypes.STR, description='text URL')}))
class SigningView(views.APIView):
def post(self, request):

View File

@@ -630,14 +630,16 @@ def return_response(success_code=status.HTTP_200_OK):
return func_wrapper
return wrap_response
@extend_schema_view(retrieve=extend_schema(
summary='Method returns the information about the function',
responses={
'200': OpenApiResponse(response=OpenApiTypes.OBJECT, description='Information about the function'),
},
tags=['lambda'], versions=['2.0']))
@extend_schema_view(list=extend_schema(
summary='Method returns a list of functions', tags=['lambda'], versions=['2.0']))
@extend_schema(tags=['lambda'])
@extend_schema_view(
retrieve=extend_schema(
summary='Method returns the information about the function',
responses={
'200': OpenApiResponse(response=OpenApiTypes.OBJECT, description='Information about the function'),
}),
list=extend_schema(
summary='Method returns a list of functions')
)
class FunctionViewSet(viewsets.ViewSet):
lookup_value_regex = '[a-zA-Z0-9_.-]+'
lookup_field = 'func_id'
@@ -672,21 +674,23 @@ class FunctionViewSet(viewsets.ViewSet):
return lambda_func.invoke(db_task, request.data)
@extend_schema_view(retrieve=extend_schema(
summary='Method returns the status of the request',
parameters=[
# specify correct type
OpenApiParameter('id', location=OpenApiParameter.PATH, type=OpenApiTypes.INT,
description='Request id'),
],
tags=['lambda'], versions=['2.0']))
@extend_schema_view(list=extend_schema(
summary='Method returns a list of requests', tags=['lambda'], versions=['2.0']))
#TODO
@extend_schema_view(create=extend_schema(
summary='Method calls the function', tags=['lambda'], versions=['2.0']))
@extend_schema_view(delete=extend_schema(
summary='Method cancels the request', tags=['lambda'], versions=['2.0']))
@extend_schema(tags=['lambda'])
@extend_schema_view(
retrieve=extend_schema(
summary='Method returns the status of the request',
parameters=[
# specify correct type
OpenApiParameter('id', location=OpenApiParameter.PATH, type=OpenApiTypes.INT,
description='Request id'),
]),
list=extend_schema(
summary='Method returns a list of requests'),
#TODO
create=extend_schema(
summary='Method calls the function'),
delete=extend_schema(
summary='Method cancels the request')
)
class RequestViewSet(viewsets.ViewSet):
iam_organization_field = None
serializer_class = None

View File

@@ -19,36 +19,39 @@ from .serializers import (
OrganizationReadSerializer, OrganizationWriteSerializer)
@extend_schema_view(retrieve=extend_schema(
summary='Method returns details of an organization',
responses={
'200': OrganizationReadSerializer,
}, tags=['organizations'], versions=['2.0']))
@extend_schema_view(list=extend_schema(
summary='Method returns a paginated list of organizatins according to query parameters',
responses={
'200': OrganizationReadSerializer(many=True),
}, tags=['organizations'], versions=['2.0']))
@extend_schema_view(update=extend_schema(
summary='Method updates an organization by id',
responses={
'200': OrganizationWriteSerializer,
}, tags=['organizations'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in an organization',
responses={
'200': OrganizationWriteSerializer,
}, tags=['organizations'], versions=['2.0']))
@extend_schema_view(create=extend_schema(
summary='Method creates an organization',
responses={
'201': OrganizationWriteSerializer,
}, tags=['organizations'], versions=['2.0']))
@extend_schema_view(destroy=extend_schema(
summary='Method deletes an organization',
responses={
'204': OpenApiResponse(description='The organization has been deleted'),
}, tags=['organizations'], versions=['2.0']))
@extend_schema(tags=['organizations'])
@extend_schema_view(
retrieve=extend_schema(
summary='Method returns details of an organization',
responses={
'200': OrganizationReadSerializer,
}),
list=extend_schema(
summary='Method returns a paginated list of organizatins according to query parameters',
responses={
'200': OrganizationReadSerializer(many=True),
}),
update=extend_schema(
summary='Method updates an organization by id',
responses={
'200': OrganizationWriteSerializer,
}),
partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in an organization',
responses={
'200': OrganizationWriteSerializer,
}),
create=extend_schema(
summary='Method creates an organization',
responses={
'201': OrganizationWriteSerializer,
}),
destroy=extend_schema(
summary='Method deletes an organization',
responses={
'204': OpenApiResponse(description='The organization has been deleted'),
})
)
class OrganizationViewSet(viewsets.ModelViewSet):
queryset = Organization.objects.all()
ordering = ['-id']
@@ -79,31 +82,35 @@ class MembershipFilter(filters.FilterSet):
class Meta:
model = Membership
fields = ("user", )
@extend_schema_view(retrieve=extend_schema(
summary='Method returns details of a membership',
responses={
'200': MembershipReadSerializer,
}, tags=['memberships'], versions=['2.0']))
@extend_schema_view(list=extend_schema(
summary='Method returns a paginated list of memberships according to query parameters',
responses={
'200': MembershipReadSerializer(many=True),
}, tags=['memberships'], versions=['2.0']))
@extend_schema_view(update=extend_schema(
summary='Method updates a membership by id',
responses={
'200': MembershipWriteSerializer,
}, tags=['memberships'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a membership',
responses={
'200': MembershipWriteSerializer,
}, tags=['memberships'], versions=['2.0']))
@extend_schema_view(destroy=extend_schema(
summary='Method deletes a membership',
responses={
'204': OpenApiResponse(description='The membership has been deleted'),
}, tags=['memberships'], versions=['2.0']))
@extend_schema(tags=['memberships'])
@extend_schema_view(
retrieve=extend_schema(
summary='Method returns details of a membership',
responses={
'200': MembershipReadSerializer,
}),
list=extend_schema(
summary='Method returns a paginated list of memberships according to query parameters',
responses={
'200': MembershipReadSerializer(many=True),
}),
update=extend_schema(
summary='Method updates a membership by id',
responses={
'200': MembershipWriteSerializer,
}),
partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in a membership',
responses={
'200': MembershipWriteSerializer,
}),
destroy=extend_schema(
summary='Method deletes a membership',
responses={
'204': OpenApiResponse(description='The membership has been deleted'),
})
)
class MembershipViewSet(mixins.RetrieveModelMixin, mixins.DestroyModelMixin,
mixins.ListModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
queryset = Membership.objects.all()
@@ -123,37 +130,39 @@ class MembershipViewSet(mixins.RetrieveModelMixin, mixins.DestroyModelMixin,
permission = MembershipPermission(self.request, self)
return permission.filter(queryset)
# TODO
@extend_schema_view(retrieve=extend_schema(
summary='Method returns details of an invitation',
responses={
'200': InvitationReadSerializer,
}, tags=['invitations'], versions=['2.0']))
@extend_schema_view(list=extend_schema(
summary='Method returns a paginated list of invitations according to query parameters',
responses={
'200': InvitationReadSerializer(many=True),
}, tags=['invitations'], versions=['2.0']))
@extend_schema_view(update=extend_schema(
summary='Method updates an invitation by id',
responses={
'200': InvitationWriteSerializer,
}, tags=['invitations'], versions=['2.0']))
@extend_schema_view(partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in an invitation',
responses={
'200': InvitationWriteSerializer,
}, tags=['invitations'], versions=['2.0']))
@extend_schema_view(create=extend_schema(
summary='Method creates an invitation',
responses={
'201': InvitationWriteSerializer,
}, tags=['invitations'], versions=['2.0']))
@extend_schema_view(destroy=extend_schema(
summary='Method deletes an invitation',
responses={
'204': OpenApiResponse(description='The invitation has been deleted'),
}, tags=['invitations'], versions=['2.0']))
@extend_schema(tags=['invitations'])
@extend_schema_view(
retrieve=extend_schema(
summary='Method returns details of an invitation',
responses={
'200': InvitationReadSerializer,
}),
list=extend_schema(
summary='Method returns a paginated list of invitations according to query parameters',
responses={
'200': InvitationReadSerializer(many=True),
}),
update=extend_schema(
summary='Method updates an invitation by id',
responses={
'200': InvitationWriteSerializer,
}),
partial_update=extend_schema(
summary='Methods does a partial update of chosen fields in an invitation',
responses={
'200': InvitationWriteSerializer,
}),
create=extend_schema(
summary='Method creates an invitation',
responses={
'201': InvitationWriteSerializer,
}),
destroy=extend_schema(
summary='Method deletes an invitation',
responses={
'204': OpenApiResponse(description='The invitation has been deleted'),
})
)
class InvitationViewSet(viewsets.ModelViewSet):
queryset = Invitation.objects.all()
ordering = ['-created_date']

View File

@@ -13,6 +13,7 @@ from drf_spectacular.utils import OpenApiResponse, extend_schema
from cvat.apps.restrictions.serializers import UserAgreementSerializer
@extend_schema(tags=['restrictions'])
class RestrictionsViewSet(viewsets.ViewSet):
serializer_class = None
permission_classes = [AllowAny]
@@ -26,8 +27,7 @@ class RestrictionsViewSet(viewsets.ViewSet):
@staticmethod
@extend_schema(summary='Method provides user agreements that the user must accept to register',
responses={'200': UserAgreementSerializer},
tags=['restrictions'], versions=['2.0'])
responses={'200': UserAgreementSerializer})
@action(detail=False, methods=['GET'], serializer_class=UserAgreementSerializer, url_path='user-agreements')
def user_agreements(request):
user_agreements = settings.RESTRICTIONS['user_agreements']
@@ -37,8 +37,7 @@ class RestrictionsViewSet(viewsets.ViewSet):
@staticmethod
@extend_schema(summary='Method provides CVAT terms of use',
responses={'200': OpenApiResponse(description='CVAT terms of use')},
tags=['restrictions'], versions=['2.0'])
responses={'200': OpenApiResponse(description='CVAT terms of use')})
@action(detail=False, methods=['GET'], renderer_classes=(TemplateHTMLRenderer,),
url_path='terms-of-use')
def terms_of_use(request):