Skip to content
Snippets Groups Projects
Commit b9c3f63e authored by Bastien Abadie's avatar Bastien Abadie
Browse files

Merge branch 'corpus-worker-version-list' into 'master'

Add ListCorpusWorkerVersions endpoint

Closes #537

See merge request !1095
parents a554d9bd 281fc119
No related branches found
No related tags found
1 merge request!1095Add ListCorpusWorkerVersions endpoint
......@@ -4,7 +4,7 @@ from uuid import UUID
from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.db import transaction
from django.db.models import F, Max, Q
from django.db.models import Count, F, Max, Q
from django.http.response import Http404
from django.shortcuts import get_object_or_404
from rest_framework import status
......@@ -743,6 +743,27 @@ class WorkerVersionList(ListCreateAPIView):
return Response(WorkerVersionSerializer(version).data, status=reponse_status)
class CorpusWorkerVersionList(CorpusACLMixin, ListAPIView):
"""
List worker versions used by elements of a given corpus.
"""
permission_classes = (IsVerified, )
pagination_class = None
serializer_class = WorkerVersionSerializer
openapi_overrides = {
'operationId': 'ListCorpusWorkerVersions',
'tags': ['ml'],
}
def get_queryset(self):
return WorkerVersion.objects \
.filter(elements__corpus_id=self.kwargs['pk']) \
.select_related('revision__repo', 'worker__repository') \
.prefetch_related('revision__refs', 'revision__versions') \
.order_by('-revision__created') \
.annotate(element_count=Count('id'))
class WorkerVersionRetrieve(CorpusACLMixin, RetrieveUpdateAPIView):
"""
Retrieve a specific worker version
......
......@@ -34,6 +34,7 @@ class WorkerVersionSerializer(serializers.ModelSerializer):
# ModelSerializer does not yet support Django 3.1's JSONField
# https://github.com/encode/django-rest-framework/pull/7467
configuration = serializers.JSONField()
element_count = serializers.IntegerField(read_only=True)
class Meta:
model = WorkerVersion
......@@ -46,6 +47,7 @@ class WorkerVersionSerializer(serializers.ModelSerializer):
'docker_image_name',
'state',
'worker',
'element_count',
)
read_only_fields = ('docker_image_name',)
# Avoid loading all revisions and all Ponos artifacts when opening this endpoint in a browser
......
from unittest import expectedFailure
from django.urls import reverse
from rest_framework import status
......@@ -489,3 +491,58 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
self.version_1.configuration = {'docker': {'command': 'mysupercommand'}}
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)
self.assertListEqual(response.json(), [
{
'id': str(self.version_1.id),
'configuration': {'test': 42},
'revision': {
'id': str(self.version_1.revision_id),
'state': 'available',
'hash': '1337',
'author': 'Test user',
'message': 'My w0rk3r',
'created': '2020-02-02T01:23:45.678000Z',
'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
'refs': []
},
'docker_image': str(self.version_1.docker_image_id),
'docker_image_iid': None,
'docker_image_name': self.version_1.docker_image_name,
'state': 'available',
'worker': {
'id': str(self.worker_1.id),
'name': 'Recognizer',
'slug': 'reco',
'type': 'recognizer'
},
'element_count': 9
}
])
......@@ -6,6 +6,7 @@ from rest_framework.schemas import get_schema_view
from arkindex.dataimport.api import (
AvailableRepositoriesList,
CorpusWorkerVersionList,
CorpusWorkflow,
DataFileCreate,
DataFileList,
......@@ -139,6 +140,7 @@ api = [
path('corpus/<uuid:pk>/roles/', CorpusRoles.as_view(), name='corpus-roles'),
path('corpus/<uuid:pk>/ml-stats/', CorpusMLStats.as_view(), name='corpus-ml-stats'),
path('corpus/<uuid:pk>/allowed-metadata/', CorpusAllowedMetaData.as_view(), name='corpus-allowed-metadata'),
path('corpus/<uuid:pk>/versions/', CorpusWorkerVersionList.as_view(), name='corpus-versions'),
# Moderation
path('ml-classes/', MLClassList.as_view(), name='mlclass-list'),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment