diff --git a/arkindex/dataimport/api.py b/arkindex/dataimport/api.py index 16d26ae6a7f0daff63ec13e75880b96b722efaa3..7b0ff3d2ef806de4cc97de4e1890981c1f74a2c4 100644 --- a/arkindex/dataimport/api.py +++ b/arkindex/dataimport/api.py @@ -51,7 +51,7 @@ from arkindex.documents.models import ClassificationState, Corpus, Element, Elem from arkindex.project.fields import ArrayRemove from arkindex.project.mixins import CorpusACLMixin, CustomPaginationViewMixin, DeprecatedMixin, SelectionMixin from arkindex.project.openapi import AutoSchema -from arkindex.project.permissions import IsVerified +from arkindex.project.permissions import IsVerified, IsVerifiedOrReadOnly from arkindex.users.models import OAuthCredentials, Role, User from arkindex_common.enums import DataImportMode from ponos.models import STATES_ORDERING, State @@ -744,7 +744,7 @@ class CorpusWorkerVersionList(CorpusACLMixin, ListAPIView): """ List worker versions used by elements of a given corpus. """ - permission_classes = (IsVerified, ) + permission_classes = (IsVerifiedOrReadOnly, ) pagination_class = None serializer_class = WorkerVersionSerializer openapi_overrides = { @@ -754,7 +754,7 @@ class CorpusWorkerVersionList(CorpusACLMixin, ListAPIView): def get_queryset(self): return WorkerVersion.objects \ - .filter(elements__corpus_id=self.kwargs['pk']) \ + .filter(elements__corpus=self.get_corpus(self.kwargs['pk'])) \ .select_related('revision__repo', 'worker__repository') \ .prefetch_related('revision__refs', 'revision__versions') \ .order_by('-revision__created') \ @@ -765,7 +765,7 @@ class WorkerVersionRetrieve(CorpusACLMixin, RetrieveUpdateAPIView): """ Retrieve a specific worker version """ - permission_classes = (IsVerified, ) + permission_classes = (IsVerifiedOrReadOnly, ) serializer_class = WorkerVersionSerializer openapi_overrides = { 'tags': ['repos'], diff --git a/arkindex/dataimport/tests/test_workers.py b/arkindex/dataimport/tests/test_workers.py index 62f8174513eb7079cc7097e93ecf6c8edf08589a..cb4253b2019d37277f485c124f911ffc1128ee27 100644 --- a/arkindex/dataimport/tests/test_workers.py +++ b/arkindex/dataimport/tests/test_workers.py @@ -1,5 +1,3 @@ -from unittest import expectedFailure - from django.urls import reverse from rest_framework import status @@ -275,10 +273,6 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): 'configuration': ['This field is required.'] }) - def test_retrieve_version_requires_login(self): - response = self.client.get(reverse('api:version-retrieve', kwargs={'pk': str(self.version_1.id)})) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - def test_retrieve_version_invalid_id(self): self.client.force_login(self.user) response = self.client.get( @@ -286,6 +280,23 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + def test_retrieve_version_no_login(self): + response = self.client.get(reverse('api:version-retrieve', kwargs={'pk': str(self.version_1.id)})) + self.assertEqual(response.status_code, status.HTTP_200_OK) + data = response.json() + revision = data.pop('revision') + self.assertEqual(revision['id'], str(self.rev.id)) + worker = data.pop('worker') + self.assertEqual(worker['id'], str(self.worker_1.id)) + self.assertDictEqual(data, { + 'id': str(self.version_1.id), + 'configuration': {"test": 42}, + 'docker_image': str(self.version_1.docker_image.id), + 'docker_image_iid': None, + 'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}', + 'state': 'available', + }) + def test_retrieve_version(self): self.client.force_login(self.user) response = self.client.get(reverse('api:version-retrieve', kwargs={'pk': str(self.version_1.id)})) @@ -295,7 +306,6 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertEqual(revision['id'], str(self.rev.id)) worker = data.pop('worker') self.assertEqual(worker['id'], str(self.worker_1.id)) - self.maxDiff = None self.assertDictEqual(data, { 'id': str(self.version_1.id), 'configuration': {"test": 42}, @@ -491,33 +501,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertEqual(self.version_1.docker_command, 'mysupercommand') self.version_1.configuration = {"test": "test1"} - def test_corpus_worker_version_requires_login(self): - with self.assertNumQueries(0): - response = self.client.get(reverse('api:corpus-versions', kwargs={'pk': self.corpus.id})) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - @expectedFailure - def test_corpus_worker_version_requires_verified(self): - """ - This test fails due to a bug in the IsVerified permission class. - https://gitlab.com/arkindex/backend/-/issues/554 - """ - self.user.verified_email = False - self.user.save() - self.client.force_login(self.user) - with self.assertNumQueries(2): - response = self.client.get(reverse('api:corpus-versions', kwargs={'pk': self.corpus.id})) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_corpus_worker_version_list(self): - self.client.force_login(self.user) - - self.corpus.elements.filter(type__slug='word').update(worker_version=self.version_1) - - with self.assertNumQueries(5): - response = self.client.get(reverse('api:corpus-versions', kwargs={'pk': self.corpus.id})) - self.assertEqual(response.status_code, status.HTTP_200_OK) - + def _assert_corpus_worker_version_list(self, response): self.assertListEqual(response.json(), [ { 'id': str(self.version_1.id), @@ -545,3 +529,31 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): 'element_count': 9 } ]) + + def test_corpus_worker_version_no_login(self): + self.corpus.elements.filter(type__slug='word').update(worker_version=self.version_1) + + with self.assertNumQueries(6): + response = self.client.get(reverse('api:corpus-versions', kwargs={'pk': self.corpus.id})) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self._assert_corpus_worker_version_list(response) + + def test_corpus_worker_version_not_verified(self): + self.user.verified_email = False + self.user.save() + self.client.force_login(self.user) + self.corpus.elements.filter(type__slug='word').update(worker_version=self.version_1) + + with self.assertNumQueries(8): + response = self.client.get(reverse('api:corpus-versions', kwargs={'pk': self.corpus.id})) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self._assert_corpus_worker_version_list(response) + + def test_corpus_worker_version_list(self): + self.client.force_login(self.user) + self.corpus.elements.filter(type__slug='word').update(worker_version=self.version_1) + + with self.assertNumQueries(8): + response = self.client.get(reverse('api:corpus-versions', kwargs={'pk': self.corpus.id})) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self._assert_corpus_worker_version_list(response)