diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4c7b2b5c97f..4d718074293 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -135,9 +135,6 @@ jobs: with: python-version: '3.8' - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Download CVAT server image uses: actions/download-artifact@v3 with: @@ -195,9 +192,6 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Download CVAT server image uses: actions/download-artifact@v3 with: @@ -265,9 +259,6 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - uses: actions/setup-node@v3 with: node-version: '16.x' diff --git a/Dockerfile.ci b/Dockerfile.ci index ab01eb72da5..5bd67c12914 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -1,4 +1,4 @@ -FROM cvat/server +FROM cvat/server:local ENV DJANGO_CONFIGURATION=testing USER root diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index 4256bfa9e28..2c871499475 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -20,7 +20,7 @@ from cvat.apps.engine.log import slogger from cvat.apps.engine.utils import parse_specific_attributes -from drf_spectacular.utils import OpenApiExample, extend_schema_serializer +from drf_spectacular.utils import OpenApiExample, extend_schema_field, extend_schema_serializer class BasicUserSerializer(serializers.ModelSerializer): def validate(self, attrs): @@ -926,6 +926,13 @@ class FrameMetaSerializer(serializers.Serializer): name = serializers.CharField(max_length=1024) related_files = serializers.IntegerField() + # for compatibility with version 2.3.0 + has_related_context = serializers.SerializerMethodField() + + @extend_schema_field(serializers.BooleanField) + def get_has_related_context(self, obj: dict) -> bool: + return obj['related_files'] != 0 + class PluginsSerializer(serializers.Serializer): GIT_INTEGRATION = serializers.BooleanField() ANALYTICS = serializers.BooleanField() diff --git a/cvat/apps/iam/tests/test_rest_api.py b/cvat/apps/iam/tests/test_rest_api.py index 8a309d8af72..acd899c166c 100644 --- a/cvat/apps/iam/tests/test_rest_api.py +++ b/cvat/apps/iam/tests/test_rest_api.py @@ -150,7 +150,7 @@ def test_can_report_denial_reason(self): ForceLogin(user=self.user, client=self.client): response = self.client.get(self.ENDPOINT_WITH_AUTH) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEqual(response.json(), expected_reasons) + self.assertTrue(all([reason in str(response.content) for reason in expected_reasons])) def test_can_report_merged_denial_reasons(self): expected_reasons = [["hello", "world"], ["hi", "there"]] @@ -159,7 +159,14 @@ def test_can_report_merged_denial_reasons(self): ForceLogin(user=self.user, client=self.client): response = self.client.get(self.ENDPOINT_WITH_AUTH) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEqual(response.json(), list(itertools.chain.from_iterable(expected_reasons))) + self.assertTrue( + all( + [ + reason in str(response.content) + for reason in itertools.chain(*expected_reasons) + ] + ) + ) def test_can_allow_if_no_permission_matches(self): with self._mock_permissions(), ForceLogin(user=self.user, client=self.client): @@ -179,4 +186,4 @@ def test_can_deny_if_some_permissions_deny(self): ForceLogin(user=self.user, client=self.client): response = self.client.get(self.ENDPOINT_WITH_AUTH) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEqual(response.json(), expected_reasons) + self.assertTrue(all([reason in str(response.content) for reason in expected_reasons]))