From dabcf80e8bc3f0b16a1e4c02925ebc6e3c887a77 Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Mon, 2 Dec 2019 13:27:46 +0300 Subject: [PATCH 1/3] Added page_size parameter for all REST API methods which returns list of objects. Also it is possible to specify page_size=all to return all elements. --- cvat/apps/engine/pagination.py | 22 ++++++++++++++++++++++ cvat/settings/base.py | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 cvat/apps/engine/pagination.py diff --git a/cvat/apps/engine/pagination.py b/cvat/apps/engine/pagination.py new file mode 100644 index 00000000000..e18eeaf2ecd --- /dev/null +++ b/cvat/apps/engine/pagination.py @@ -0,0 +1,22 @@ +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import sys +from rest_framework.pagination import PageNumberPagination + +class CustomPagination(PageNumberPagination): + page_size_query_param = "page_size" + + def get_page_size(self, request): + page_size = 0 + try: + value = request.query_params[self.page_size_query_param] + if value == "all": + page_size = sys.maxsize + else: + page_size = int(value) + except (KeyError, ValueError): + pass + + return page_size if page_size > 0 else self.page_size diff --git a/cvat/settings/base.py b/cvat/settings/base.py index d6356464f24..54d2e281aa5 100644 --- a/cvat/settings/base.py +++ b/cvat/settings/base.py @@ -137,7 +137,7 @@ def generate_ssh_keys(): # Need to add 'api-docs' here as a workaround for include_docs_urls. 'ALLOWED_VERSIONS': ('v1', 'api-docs'), 'DEFAULT_PAGINATION_CLASS': - 'rest_framework.pagination.PageNumberPagination', + 'cvat.apps.engine.pagination.CustomPagination', 'PAGE_SIZE': 10, 'DEFAULT_FILTER_BACKENDS': ( 'rest_framework.filters.SearchFilter', From e4aa9250461b76041839e36641030b17fefeae67 Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Mon, 2 Dec 2019 13:31:11 +0300 Subject: [PATCH 2/3] Updated changelog.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07b6882a271..2dc20d6e16f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ https://github.com/opencv/cvat/issues/750). - Text Detection Auto Annoation Script in OpenVINO format for version 4 ### Changed -- +- page_size parameter for all REST API methods ### Deprecated - From fedbce363adf6a99456b31a742cbd2d0b1547862 Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Mon, 2 Dec 2019 23:22:39 +0300 Subject: [PATCH 3/3] Token authorization for non REST API apps (e.g. git, tf annotation, tf segmentation) --- cvat-ui/src/utils/plugin-checker.ts | 42 +++++++++++--------------- cvat/apps/authentication/decorators.py | 7 +++++ 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/cvat-ui/src/utils/plugin-checker.ts b/cvat-ui/src/utils/plugin-checker.ts index fb28e9fbebd..0a6a6a2f400 100644 --- a/cvat-ui/src/utils/plugin-checker.ts +++ b/cvat-ui/src/utils/plugin-checker.ts @@ -7,42 +7,34 @@ const core = getCore(); class PluginChecker { public static async check(plugin: SupportedPlugins): Promise { const serverHost = core.config.backendAPI.slice(0, -7); + const isReachable = async (url: string): Promise => { + try { + await core.server.request(url); + return true; + } catch (error) { + if (error.code === 404) { + return false; + } + + throw error; + } + }; switch (plugin) { case SupportedPlugins.GIT_INTEGRATION: { - const response = await fetch(`${serverHost}/git/repository/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/git/repository/meta/get`); } case SupportedPlugins.AUTO_ANNOTATION: { - const response = await fetch(`${serverHost}/auto_annotation/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/auto_annotation/meta/get`); } case SupportedPlugins.TF_ANNOTATION: { - const response = await fetch(`${serverHost}/tensorflow/annotation/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/tensorflow/annotation/meta/get`); } case SupportedPlugins.TF_SEGMENTATION: { - const response = await fetch(`${serverHost}/tensorflow/segmentation/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/tensorflow/segmentation/meta/get`); } case SupportedPlugins.ANALYTICS: { - const response = await fetch(`${serverHost}/analytics/app/kibana`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/analytics/app/kibana`); } default: return false; diff --git a/cvat/apps/authentication/decorators.py b/cvat/apps/authentication/decorators.py index dc0b107fee9..4557fd20d8c 100644 --- a/cvat/apps/authentication/decorators.py +++ b/cvat/apps/authentication/decorators.py @@ -10,6 +10,7 @@ from django.http import JsonResponse from django.contrib.auth.views import redirect_to_login from django.conf import settings +from rest_framework.authentication import TokenAuthentication def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None, redirect_methods=['GET']): @@ -19,6 +20,12 @@ def _wrapped_view(request, *args, **kwargs): if request.user.is_authenticated: return view_func(request, *args, **kwargs) else: + tokenAuth = TokenAuthentication() + auth = tokenAuth.authenticate(request) + if auth is not None: + request.user = auth[0] + return view_func(request, *args, **kwargs) + if request.method not in redirect_methods: return JsonResponse({'login_page_url': reverse('login')}, status=403)