def logs(request): serializer = LogEventSerializer(many=True, data=request.data) if serializer.is_valid(raise_exception=True): user = { "username": request.user.username } for event in serializer.data: message = JSONRenderer().render({**event, **user}).decode('UTF-8') jid = event.get("job_id") tid = event.get("task_id") if jid: clogger.job[jid].info(message) elif tid: clogger.task[tid].info(message) else: clogger.glob.info(message) return Response(serializer.data, status=status.HTTP_201_CREATED)
class ServerViewSet(viewsets.ViewSet): serializer_class = None # To get nice documentation about ServerViewSet actions it is necessary # to implement the method. By default, ViewSet doesn't provide it. def get_serializer(self, *args, **kwargs): pass @staticmethod @swagger_auto_schema( method='get', operation_summary='Method provides basic CVAT information', responses={'200': AboutSerializer}) @action(detail=False, methods=['GET'], serializer_class=AboutSerializer) def about(request): from cvat import __version__ as cvat_version about = { "name": "Computer Vision Annotation Tool", "version": cvat_version, "description": "CVAT is completely re-designed and re-implemented " + "version of Video Annotation Tool from Irvine, California " + "tool. It is free, online, interactive video and image annotation " + "tool for computer vision. It is being used by our team to " + "annotate million of objects with different properties. Many UI " + "and UX decisions are based on feedbacks from professional data " + "annotation team." } serializer = AboutSerializer(data=about) if serializer.is_valid(raise_exception=True): return Response(data=serializer.data) @staticmethod @swagger_auto_schema(method='post', request_body=ExceptionSerializer) @action(detail=False, methods=['POST'], serializer_class=ExceptionSerializer) def exception(request): """ Saves an exception from a client on the server Sends logs to the ELK if it is connected """ serializer = ExceptionSerializer(data=request.data) if serializer.is_valid(raise_exception=True): additional_info = { "username": request.user.username, "name": "Send exception", } message = JSONRenderer().render({ **serializer.data, **additional_info }).decode('UTF-8') jid = serializer.data.get("job_id") tid = serializer.data.get("task_id") if jid: clogger.job[jid].error(message) elif tid: clogger.task[tid].error(message) else: clogger.glob.error(message) return Response(serializer.data, status=status.HTTP_201_CREATED) @staticmethod @swagger_auto_schema(method='post', request_body=LogEventSerializer(many=True)) @action(detail=False, methods=['POST'], serializer_class=LogEventSerializer) def logs(request): """ Saves logs from a client on the server Sends logs to the ELK if it is connected """ serializer = LogEventSerializer(many=True, data=request.data) if serializer.is_valid(raise_exception=True): user = {"username": request.user.username} for event in serializer.data: message = JSONRenderer().render({ **event, **user }).decode('UTF-8') jid = event.get("job_id") tid = event.get("task_id") if jid: clogger.job[jid].info(message) elif tid: clogger.task[tid].info(message) else: clogger.glob.info(message) return Response(serializer.data, status=status.HTTP_201_CREATED) @staticmethod @swagger_auto_schema( method='get', operation_summary= 'Returns all files and folders that are on the server along specified path', manual_parameters=[ openapi.Parameter('directory', openapi.IN_QUERY, type=openapi.TYPE_STRING, description='Directory to browse') ], responses={'200': FileInfoSerializer(many=True)}) @action(detail=False, methods=['GET'], serializer_class=FileInfoSerializer) def share(request): param = request.query_params.get('directory', '/') if param.startswith("/"): param = param[1:] directory = os.path.abspath(os.path.join(settings.SHARE_ROOT, param)) if directory.startswith( settings.SHARE_ROOT) and os.path.isdir(directory): data = [] content = os.scandir(directory) for entry in content: entry_type = None if entry.is_file(): entry_type = "REG" elif entry.is_dir(): entry_type = "DIR" if entry_type: data.append({"name": entry.name, "type": entry_type}) serializer = FileInfoSerializer(many=True, data=data) if serializer.is_valid(raise_exception=True): return Response(serializer.data) else: return Response("{} is an invalid directory".format(param), status=status.HTTP_400_BAD_REQUEST) @staticmethod @swagger_auto_schema( method='get', operation_summary= 'Method provides the list of supported annotations formats', responses={'200': DatasetFormatsSerializer()}) @action(detail=False, methods=['GET'], url_path='annotation/formats') def annotation_formats(request): data = dm.views.get_all_formats() return Response(DatasetFormatsSerializer(data).data)