"""This file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license. """ import logging from core.permissions import all_permissions from django.conf import settings from django.utils.decorators import method_decorator from drf_spectacular.utils import OpenApiResponse, extend_schema from rest_framework import generics from rest_framework.parsers import FormParser, JSONParser, MultiPartParser from rest_framework.response import Response from rest_framework.views import APIView from label_studio.core.utils.common import load_func from .localfiles.api import LocalFilesExportStorageListAPI, LocalFilesImportStorageListAPI logger = logging.getLogger(__name__) # TODO: replace hardcoded apps lists with search over included storage apps get_storage_list = load_func(settings.GET_STORAGE_LIST) def _get_common_storage_list(): storage_list = get_storage_list() if settings.ENABLE_LOCAL_FILES_STORAGE: storage_list += [ { 'name': 'localfiles', 'title': 'Local files', 'import_list_api': LocalFilesImportStorageListAPI, 'export_list_api': LocalFilesExportStorageListAPI, } ] return storage_list _common_storage_list = _get_common_storage_list() @method_decorator( name='get', decorator=extend_schema( tags=['Storage'], summary='List all import storages types', description='Retrieve a list of the import storages types.', responses={ 200: OpenApiResponse( response={ 'type': 'array', 'items': { 'type': 'object', 'properties': { 'name': {'type': 'string'}, 'title': {'type': 'string'}, }, }, }, description='List of import storage types', ), }, extensions={ 'x-fern-sdk-group-name': ['import_storage'], 'x-fern-sdk-method-name': 'list_types', 'x-fern-audiences': ['public'], }, ), ) class AllImportStorageTypesAPI(APIView): permission_required = all_permissions.storages_view def get(self, request, **kwargs): return Response([{'name': s['name'], 'title': s['title']} for s in _common_storage_list]) @method_decorator( name='get', decorator=extend_schema( tags=['Storage'], summary='List all export storages types', description='Retrieve a list of the export storages types.', responses={ 200: OpenApiResponse( response={ 'type': 'array', 'items': { 'type': 'object', 'properties': { 'name': {'type': 'string'}, 'title': {'type': 'string'}, }, }, }, description='List of export storage types', ), }, extensions={ 'x-fern-sdk-group-name': ['export_storage'], 'x-fern-sdk-method-name': 'list_types', 'x-fern-audiences': ['public'], }, ), ) class AllExportStorageTypesAPI(APIView): permission_required = all_permissions.storages_view def get(self, request, **kwargs): return Response([{'name': s['name'], 'title': s['title']} for s in _common_storage_list]) @method_decorator( name='get', decorator=extend_schema( tags=['Storage'], summary='List all import storages from the project', description='Retrieve a list of the import storages of all types with their IDs.', responses={200: 'List of ImportStorageSerializer'}, extensions={ 'x-fern-sdk-group-name': ['import_storage'], 'x-fern-sdk-method-name': 'list', 'x-fern-audiences': ['internal'], }, ), ) class AllImportStorageListAPI(generics.ListAPIView): parser_classes = (JSONParser, FormParser, MultiPartParser) permission_required = all_permissions.storages_view def _get_response(self, api, request, *args, **kwargs): try: view = api.as_view() response = view(request._request, *args, **kwargs) payload = response.data if not isinstance(payload, list): raise ValueError(f'Response is not list: {payload}') return payload except Exception: logger.error(f"Can't process {api.__class__.__name__}", exc_info=True) return [] def list(self, request, *args, **kwargs): list_responses = sum( [self._get_response(s['import_list_api'], request, *args, **kwargs) for s in _common_storage_list], [] ) return Response(list_responses) @method_decorator( name='get', decorator=extend_schema( tags=['Storage'], summary='List all export storages from the project', description='Retrieve a list of the export storages of all types with their IDs.', responses={200: 'List of ExportStorageSerializer'}, extensions={ 'x-fern-sdk-group-name': ['export_storage'], 'x-fern-sdk-method-name': 'list', 'x-fern-audiences': ['internal'], }, ), ) class AllExportStorageListAPI(generics.ListAPIView): parser_classes = (JSONParser, FormParser, MultiPartParser) permission_required = all_permissions.storages_view def _get_response(self, api, request, *args, **kwargs): try: view = api.as_view() response = view(request._request, *args, **kwargs) payload = response.data if not isinstance(payload, list): raise ValueError(f'Response is not list: {payload}') return payload except Exception: logger.error(f"Can't process {api.__class__.__name__}", exc_info=True) return [] def list(self, request, *args, **kwargs): list_responses = sum( [self._get_response(s['export_list_api'], request, *args, **kwargs) for s in _common_storage_list], [] ) return Response(list_responses)