diff --git a/cvat-core/src/server-proxy.ts b/cvat-core/src/server-proxy.ts index 156f1f28ba38..d2e337af2d68 100644 --- a/cvat-core/src/server-proxy.ts +++ b/cvat-core/src/server-proxy.ts @@ -291,14 +291,20 @@ class ServerProxy { const { backendAPI } = config; let response = null; try { - response = await Axios.get(`${backendAPI}/restrictions/user-agreements`, { + response = await Axios.get(`${backendAPI}/user-agreements`, { proxy: config.proxy, + validateStatus: (status) => status === 200 || status === 404, }); + + if (response.status === 200) { + return response.data; + } + + return []; } catch (errorData) { + throw generateError(errorData); } - - return response.data; } async function register(username, firstName, lastName, email, password1, password2, confirmations) { diff --git a/cvat-ui/src/components/register-page/register-form.tsx b/cvat-ui/src/components/register-page/register-form.tsx index b81e3f91ceda..c1972b5ba5ba 100644 --- a/cvat-ui/src/components/register-page/register-form.tsx +++ b/cvat-ui/src/components/register-page/register-form.tsx @@ -90,7 +90,7 @@ const validateAgreement: ((userAgreements: UserAgreement[]) => RuleRender) = ( const [agreement] = userAgreements .filter((userAgreement: UserAgreement): boolean => userAgreement.name === name); if (agreement.required && !value) { - return Promise.reject(new Error(`You must accept ${agreement.displayText} to continue!`)); + return Promise.reject(new Error(`You must accept ${agreement.urlDisplayText} to continue!`)); } return Promise.resolve(); @@ -252,10 +252,12 @@ function RegisterFormComponent(props: Props): JSX.Element { ]} > - I read and accept the - - {` ${userAgreement.displayText}`} - + {userAgreement.textPrefix} + {!!userAgreement.url && + + {` ${userAgreement.urlDisplayText}`} + + } ))} diff --git a/cvat-ui/src/reducers/index.ts b/cvat-ui/src/reducers/index.ts index acbd52454b75..5926941d8b1e 100644 --- a/cvat-ui/src/reducers/index.ts +++ b/cvat-ui/src/reducers/index.ts @@ -277,8 +277,9 @@ export interface AboutState { export interface UserAgreement { name: string; - displayText: string; + urlDisplayText: string; url: string; + textPrefix: string; required: boolean; } diff --git a/cvat/apps/engine/urls.py b/cvat/apps/engine/urls.py index aa2537a04c77..67a0ceadeb93 100644 --- a/cvat/apps/engine/urls.py +++ b/cvat/apps/engine/urls.py @@ -9,7 +9,6 @@ from django.views.generic import RedirectView from django.conf import settings -from cvat.apps.restrictions.views import RestrictionsViewSet from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView @@ -21,7 +20,6 @@ router.register('server', views.ServerViewSet, basename='server') router.register('issues', views.IssueViewSet) router.register('comments', views.CommentViewSet) -router.register('restrictions', RestrictionsViewSet, basename='restrictions') router.register('cloudstorages', views.CloudStorageViewSet) urlpatterns = [ diff --git a/cvat/apps/iam/rules/restrictions.csv b/cvat/apps/iam/rules/restrictions.csv deleted file mode 100644 index c542bfcf0db7..000000000000 --- a/cvat/apps/iam/rules/restrictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -Scope,Resource,Context,Ownership,Limit,Method,URL,Privilege,Membership -view:user-agreements,N/A,N/A,N/A,,POST,/restrictions/user-agreements,N/A,N/A -view:terms-of-use,N/A,N/A,N/A,,GET,/restrictions/terms-of-use,N/A,N/A \ No newline at end of file diff --git a/cvat/apps/restrictions/__init__.py b/cvat/apps/restrictions/__init__.py deleted file mode 100644 index eed408493991..000000000000 --- a/cvat/apps/restrictions/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (C) 2020-2022 Intel Corporation -# -# SPDX-License-Identifier: MIT diff --git a/cvat/apps/restrictions/apps.py b/cvat/apps/restrictions/apps.py deleted file mode 100644 index 0d05194af464..000000000000 --- a/cvat/apps/restrictions/apps.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (C) 2020-2022 Intel Corporation -# -# SPDX-License-Identifier: MIT - - -from django.apps import AppConfig - - -class RestrictionsConfig(AppConfig): - name = 'cvat.apps.restrictions' diff --git a/cvat/apps/restrictions/serializers.py b/cvat/apps/restrictions/serializers.py deleted file mode 100644 index ca9eb2a7ceef..000000000000 --- a/cvat/apps/restrictions/serializers.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) 2020-2022 Intel Corporation -# -# SPDX-License-Identifier: MIT - - -from rest_framework import serializers -from django.conf import settings - -from cvat.apps.iam.serializers import RegisterSerializerEx - -class UserAgreementSerializer(serializers.Serializer): - name = serializers.CharField(max_length=256) - display_text = serializers.CharField(max_length=2048, default='') - url = serializers.CharField(max_length=2048, default='') - required = serializers.BooleanField(default=False) - value = serializers.BooleanField(default=False) - - # pylint: disable=no-self-use - def to_representation(self, instance): - instance_ = instance.copy() - instance_['displayText'] = instance_.pop('display_text') - return instance_ - -class RestrictedRegisterSerializer(RegisterSerializerEx): - confirmations = UserAgreementSerializer(many=True, required=False) - - def validate(self, data): - validated_data = super().validate(data) - server_user_agreements = settings.RESTRICTIONS['user_agreements'] - for server_agreement in server_user_agreements: - if server_agreement['required']: - is_confirmed = False - for confirmation in validated_data['confirmations']: - if confirmation['name'] == server_agreement['name'] \ - and confirmation['value']: - is_confirmed = True - - if not is_confirmed: - raise serializers.ValidationError( - 'Agreement {} must be accepted'.format(server_agreement['name']) - ) - - return validated_data diff --git a/cvat/apps/restrictions/templates/restrictions/terms_of_use.html b/cvat/apps/restrictions/templates/restrictions/terms_of_use.html deleted file mode 100644 index 63bf28c5622b..000000000000 --- a/cvat/apps/restrictions/templates/restrictions/terms_of_use.html +++ /dev/null @@ -1,19 +0,0 @@ - - -

CVAT terms of use

-

- PLEASE READ THE FOLLOWING TERMS CAREFULLY. IF YOU CLICK TO ACCEPT THIS AGREEMENT, DOWNLOAD, - OR INSTALL THE CVAT SOFTWARE, YOU ARE AGREEING TO BE LEGALLY BOUND BY THIS AGREEMENT - IN ADDITION TO ANY OTHER TERMS PROVIDED. IF YOU DO NOT AGREE TO THESE TERMS, DO NOT USE - THE CVAT SOFTWARE AND DESTROY ALL COPIES IN YOUR POSSESSION. -

-

- You understand and acknowledge that you are responsible for your use of the CVAT Software - and any content which you may alter with use of the CVAT Software. -

-

- You further understand and acknowledge that any content you may elect to use may be subject to privacy, - data and intellectual property rights and that you are responsible to your compliance with such laws and regulations. -

- - \ No newline at end of file diff --git a/cvat/apps/restrictions/tests.py b/cvat/apps/restrictions/tests.py deleted file mode 100644 index c88490ce1ca5..000000000000 --- a/cvat/apps/restrictions/tests.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright (C) 2020-2022 Intel Corporation -# -# SPDX-License-Identifier: MIT - - -from rest_framework.test import APITestCase, APIClient -from rest_framework import status -from django.conf import settings - -class UserAgreementsTest(APITestCase): - def setUp(self): - self.client = APIClient() - self.user_agreements = settings.RESTRICTIONS['user_agreements'] - settings.RESTRICTIONS['user_agreements'] = [ - { - 'name': 'agreement_1', - 'display_text': 'some display text 1', - 'url': 'https://example.com', - 'required': True, - }, - { - 'name': 'agreement_2', - 'display_text': 'some display text 2', - 'url': 'https://example2.com', - 'required': True, - }, - { - 'name': 'agreement_3', - 'display_text': 'some display text 3', - 'url': 'https://example3.com', - 'required': False, - }, - ] - - def tearDown(self): - settings.RESTRICTIONS['user_agreements'] = self.user_agreements - - def _get_user_agreements(self): - response = self.client.get('/api/restrictions/user-agreements') - assert response.status_code == status.HTTP_200_OK - for agreements in response.data: - assert 'name' in agreements, agreements['name'] - assert 'displayText' in agreements - assert 'required' in agreements - return response.data - - def _register_user(self, data): - response = self.client.post('/api/auth/register', data=data, format="json") - return response - - - def test_user_agreements(self): - self._get_user_agreements() - - def test_register_user_with_required_confirmations(self): - agreements = self._get_user_agreements() - data = { - 'username': 'some_username1', - 'first_name': 'some first name 1', - 'last_name': 'some last name 1', - 'email': 'user1@example.com', - 'password1': 'FnvL4YdF24NAmnQ8', - 'password2': 'FnvL4YdF24NAmnQ8', - 'confirmations':[], - } - for agreement in agreements: - if agreement['required']: - data['confirmations'].append({ - 'name': agreement['name'], - 'value': True, - }) - response = self._register_user(data) - assert response.status_code == status.HTTP_201_CREATED - - def test_register_user_without_confirmations(self): - data = { - 'username': 'some_username2', - 'first_name': 'some first name 2', - 'last_name': 'some last name 2', - 'email': 'user2@example.com', - 'password1': 'FnvL4YdF24NAmnQ8', - 'password2': 'FnvL4YdF24NAmnQ8', - 'confirmations':[], - } - - response = self._register_user(data) - assert response.status_code == status.HTTP_400_BAD_REQUEST - - def test_register_user_with_all_confirmations(self): - agreements = self._get_user_agreements() - data = { - 'username': 'some_username3', - 'first_name': 'some first name 3', - 'last_name': 'some last name 3', - 'email': 'user3@example.com', - 'password1': 'FnvL4YdF24NAmnQ8', - 'password2': 'FnvL4YdF24NAmnQ8', - 'confirmations':[], - } - - for agreement in agreements: - data['confirmations'].append({ - 'name': agreement['name'], - 'value': True, - }) - - response = self._register_user(data) - assert response.status_code == status.HTTP_201_CREATED diff --git a/cvat/apps/restrictions/urls.py b/cvat/apps/restrictions/urls.py deleted file mode 100644 index b1220197cf2a..000000000000 --- a/cvat/apps/restrictions/urls.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (C) 2021-2022 Intel Corporation -# -# SPDX-License-Identifier: MIT - diff --git a/cvat/apps/restrictions/views.py b/cvat/apps/restrictions/views.py deleted file mode 100644 index 0555e2952a52..000000000000 --- a/cvat/apps/restrictions/views.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (C) 2020-2022 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.conf import settings -from rest_framework.response import Response -from rest_framework.decorators import action -from rest_framework import viewsets -from rest_framework.permissions import AllowAny -from rest_framework.renderers import TemplateHTMLRenderer -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] - authentication_classes = [] - iam_organization_field = 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 - @extend_schema(summary='Method provides user agreements that the user must accept to register', - 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'] - serializer = UserAgreementSerializer(data=user_agreements, many=True) - serializer.is_valid(raise_exception=True) - return Response(data=serializer.data) - - @staticmethod - @extend_schema(summary='Method provides CVAT terms of use', - 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): - return Response(template_name='restrictions/terms_of_use.html') diff --git a/cvat/settings/base.py b/cvat/settings/base.py index a783941a21b6..1a5bcd18c8d7 100644 --- a/cvat/settings/base.py +++ b/cvat/settings/base.py @@ -126,7 +126,6 @@ def add_ssh_keys(): 'cvat.apps.organizations', 'cvat.apps.engine', 'cvat.apps.dataset_repo', - 'cvat.apps.restrictions', 'cvat.apps.lambda_manager', 'cvat.apps.opencv', 'cvat.apps.webhooks', @@ -184,7 +183,7 @@ def add_ssh_keys(): } REST_AUTH_REGISTER_SERIALIZERS = { - 'REGISTER_SERIALIZER': 'cvat.apps.restrictions.serializers.RestrictedRegisterSerializer', + 'REGISTER_SERIALIZER': 'cvat.apps.iam.serializers.RegisterSerializerEx', } REST_AUTH_SERIALIZERS = { @@ -460,11 +459,6 @@ def add_ssh_keys(): LOCAL_LOAD_MAX_FILES_SIZE = 512 * 1024 * 1024 # 512 MB RESTRICTIONS = { - 'user_agreements': [], - - # this setting reduces task visibility to owner and assignee only - 'reduce_task_visibility': False, - # allow access to analytics component to users with business role # otherwise, only the administrator has access 'analytics_visibility': True, diff --git a/site/config.toml b/site/config.toml index a343c86bdfaf..da20a36b2381 100644 --- a/site/config.toml +++ b/site/config.toml @@ -87,9 +87,8 @@ weight = 1 section = ["HTML", "print"] [params] -intel_terms_of_use = "https://www.intel.com/content/www/us/en/legal/terms-of-use.html" -intel_privacy_notice = "https://www.intel.com/content/www/us/en/privacy/intel-privacy-notice.html" -cvat_terms_of_use = "https://cvat.org/api/restrictions/terms-of-use" +cvat_ai_terms_of_use = "https://www.cvat.ai/terms-of-use" +cvat_privacy_notice = "https://www.cvat.ai/privacy" # First one is picked as the Twitter card image if not set on page. # images = ["images/project-illustration.png"] diff --git a/site/content/en/docs/administration/basics/REST_API_guide.md b/site/content/en/docs/administration/basics/REST_API_guide.md index ee1634ba26a5..09e5c18c2003 100644 --- a/site/content/en/docs/administration/basics/REST_API_guide.md +++ b/site/content/en/docs/administration/basics/REST_API_guide.md @@ -24,7 +24,6 @@ Requests are divided into groups: - `jobs` -requests to manage the job - `lambda` - requests to work with lambda function - `projects` - project management queries -- `restrictions` - requests for restrictions - `reviews` -adding and removing the review of the job - `server` - server information requests - `tasks` - requests to manage tasks diff --git a/site/i18n/en.toml b/site/i18n/en.toml index 575945e15373..52f5b274299f 100644 --- a/site/i18n/en.toml +++ b/site/i18n/en.toml @@ -1,15 +1,6 @@ # Footer text -[footer_intel_privacy_notice] +[footer_cvat_ai_privacy_notice] other = "Privacy Policy" -[footer_intel_terms_of_use] +[footer_cvat_ai_terms_of_use] other = "Terms of Use" - -[footer_cvat_terms_of_use] -other = "CVAT terms of Use" - -[footer_notices_and_disclaimers] -other = "Notices and Disclaimers" - -[footer_human_rights_principles] -other = "Human Rights Principles" diff --git a/site/layouts/partials/footer.html b/site/layouts/partials/footer.html index fe872c19f0cf..51293ad20d02 100644 --- a/site/layouts/partials/footer.html +++ b/site/layouts/partials/footer.html @@ -17,14 +17,9 @@ {{ end }}
- {{ with .Site.Params.intel_privacy_notice }}{{ T "footer_intel_privacy_notice" }}{{ end }} + {{ with .Site.Params.cvat_ai_privacy_notice }}{{ T "footer_cvat_ai_privacy_notice" }}{{ end }} | - {{ with .Site.Params.intel_terms_of_use }}{{ T "footer_intel_terms_of_use" }}{{ end }} - | - {{ with .Site.Params.cvat_terms_of_use }}{{ T "footer_cvat_terms_of_use" }}{{ end }} -
- {{ if not .Site.Params.ui.footer_about_disable }} {{ with .Site.GetPage "about" }}

{{ .Title }}

{{ end }} diff --git a/tests/python/rest_api/test_auth.py b/tests/python/rest_api/test_auth.py index 7bf104f19bda..7941edb7a0cd 100644 --- a/tests/python/rest_api/test_auth.py +++ b/tests/python/rest_api/test_auth.py @@ -94,7 +94,7 @@ def test_can_register(self): email = "123@456.com" with ApiClient(Configuration(host=BASE_URL)) as api_client: (user, response) = api_client.auth_api.create_register( - models.RestrictedRegisterRequest( + models.RegisterSerializerExRequest( username=username, password1=USER_PASS, password2=USER_PASS, email=email ) )