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

Merge branch 'retrieve-specific-worker' into 'master'

Retrieve a worker and serialize worker in repo

See merge request !906
parents a2c09331 67f6cb17
No related branches found
No related tags found
1 merge request!906Retrieve a worker and serialize worker in repo
......@@ -22,13 +22,13 @@ from arkindex.dataimport.models import \
from arkindex.dataimport.serializers.ml_tool import MLToolSerializer, MLToolTaskSerializer
from arkindex.dataimport.serializers.files import DataFileSerializer, DataFileCreateSerializer
from arkindex.dataimport.serializers.git import \
RepositorySerializer, ExternalRepositorySerializer, RevisionSerializer
ExternalRepositorySerializer, RevisionSerializer
from arkindex.dataimport.serializers.imports import (
DataImportLightSerializer, DataImportSerializer,
DataImportFromFilesSerializer, ElementsWorkflowSerializer, WorkerRunLightSerializer, WorkerRunSerializer,
ImportTranskribusSerializer
)
from arkindex.dataimport.serializers.workers import WorkerSerializer, WorkerVersionSerializer
from arkindex.dataimport.serializers.workers import WorkerSerializer, WorkerVersionSerializer, RepositorySerializer
from arkindex.users.models import OAuthCredentials, User
from arkindex.project.fields import ArrayRemove
from arkindex_common.ml_tool import MLTool, MLToolType
......@@ -665,6 +665,22 @@ class WorkerVersionRetrieve(CorpusACLMixin, RetrieveUpdateAPIView):
)
class WorkerRetrieve(RetrieveAPIView):
"""
Retrieve a specific worker
"""
permission_classes = (IsVerified, )
serializer_class = WorkerSerializer
openapi_overrides = {
'tags': ['repos'],
}
def get_queryset(self):
return Worker.objects.filter(
repository__corpus__in=Corpus.objects.readable(self.request.user),
)
class WorkerRunList(ListCreateAPIView):
"""
List worker runs for a given dataimport UUID
......
from rest_framework import serializers
from arkindex.project.serializer_fields import EnumField
from arkindex.documents.models import Corpus
from arkindex.dataimport.models import Repository, Revision, GitRef, GitRefType, WorkerVersionState
from arkindex.dataimport.models import Revision, GitRef, GitRefType, WorkerVersionState
import gitlab.v4.objects
import urllib
class GitRefSerializer(serializers.ModelSerializer):
......@@ -64,34 +63,6 @@ class RevisionWithRefsSerializer(serializers.ModelSerializer):
)
class RepositorySerializer(serializers.ModelSerializer):
"""
Serialize a repository
"""
enabled = serializers.BooleanField(read_only=True)
git_clone_url = serializers.SerializerMethodField()
def get_git_clone_url(self, repository):
if self.context['request'].user.is_internal and isinstance(self.instance, Repository) and self.instance.enabled:
url = urllib.parse.urlparse(self.instance.url)
return f"https://oauth2:{repository.credentials.token}@{url.netloc}{url.path}"
return None
class Meta:
model = Repository
fields = (
'id',
'url',
'enabled',
'corpus',
'git_clone_url',
)
extra_kwargs = {
'id': {'read_only': True},
'url': {'read_only': True},
}
class ExternalRepositorySerializer(serializers.Serializer):
"""
Serialize a Git repository from an external API
......
from rest_framework import serializers
from arkindex.dataimport.models import Worker, WorkerVersion, WorkerVersionState
from arkindex.dataimport.models import Worker, WorkerVersion, WorkerVersionState, Repository
from arkindex.project.serializer_fields import EnumField
from arkindex_common.ml_tool import MLToolType
from arkindex.dataimport.serializers.git import RevisionWithRefsSerializer
import urllib
class WorkerSerializer(serializers.ModelSerializer):
......@@ -47,3 +48,33 @@ class WorkerVersionSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
self.fields['revision'] = RevisionWithRefsSerializer(read_only=True)
return super(WorkerVersionSerializer, self).to_representation(instance)
class RepositorySerializer(serializers.ModelSerializer):
"""
Serialize a repository
"""
enabled = serializers.BooleanField(read_only=True)
git_clone_url = serializers.SerializerMethodField()
workers = WorkerSerializer(many=True, read_only=True)
def get_git_clone_url(self, repository):
if self.context['request'].user.is_internal and isinstance(self.instance, Repository) and self.instance.enabled:
url = urllib.parse.urlparse(self.instance.url)
return f"https://oauth2:{repository.credentials.token}@{url.netloc}{url.path}"
return None
class Meta:
model = Repository
fields = (
'id',
'url',
'enabled',
'corpus',
'git_clone_url',
'workers',
)
extra_kwargs = {
'id': {'read_only': True},
'url': {'read_only': True},
}
......@@ -53,6 +53,32 @@ class TestRepositories(FixtureTestCase):
response = self.client.get(reverse('api:repository-list'))
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_list_repository_with_workers(self):
worker = Worker.objects.create(
name="my worker",
slug="my_worker",
type=MLToolType.Classifier,
repository=self.repo
)
self.client.force_login(self.user)
response = self.client.get(reverse('api:repository-list'))
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
self.assertEqual(len(data['results']), 1)
self.assertDictEqual(data['results'][0], {
'id': str(self.repo.id),
'corpus': str(self.repo.corpus.id),
'enabled': True,
'git_clone_url': None,
'url': self.repo.url,
'workers': [{
'id': str(worker.id),
'name': worker.name,
'slug': worker.slug,
'type': worker.type.value,
}],
})
def test_list_repository_external_user(self):
self.client.force_login(self.user)
response = self.client.get(reverse('api:repository-list'))
......@@ -65,6 +91,7 @@ class TestRepositories(FixtureTestCase):
'enabled': True,
'git_clone_url': None,
'url': self.repo.url,
'workers': [],
})
def test_list_repository_internal_user(self):
......@@ -79,6 +106,7 @@ class TestRepositories(FixtureTestCase):
'enabled': True,
'git_clone_url': None,
'url': self.repo.url,
'workers': [],
})
def test_repository_retrieve_requires_login(self):
......@@ -109,6 +137,7 @@ class TestRepositories(FixtureTestCase):
'enabled': True,
'git_clone_url': None,
'url': self.repo.url,
'workers': [],
})
def test_repository_retrieve_internal_user(self):
......@@ -124,6 +153,7 @@ class TestRepositories(FixtureTestCase):
'enabled': True,
'git_clone_url': 'https://oauth2:oauth-token@gitlab/repo',
'url': self.repo.url,
'workers': [],
})
def test_repository_retrieve_disabled_repo(self):
......@@ -145,6 +175,7 @@ class TestRepositories(FixtureTestCase):
'enabled': False,
'git_clone_url': None,
'url': self.repo.url,
'workers': [],
})
def test_revision_retrieve_requires_login(self):
......
......@@ -2,6 +2,7 @@ from django.urls import reverse
from rest_framework import status
from arkindex_common.ml_tool import MLToolType
from arkindex.dataimport.models import Repository, Revision, Worker, WorkerVersion
from arkindex.documents.models import Corpus
from arkindex.project.tests import FixtureAPITestCase
from ponos.models import Workflow
......@@ -86,6 +87,42 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
worker = data[0]
self.assertEqual(worker['id'], str(worker_2.id))
# Tests on get_query_set for WorkerRetrieve
def test_workers_retrieve(self):
self.client.force_login(self.user)
response = self.client.get(reverse('api:worker-retrieve', kwargs={'pk': str(self.worker_1.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertDictEqual(response.json(), {
'id': str(self.worker_1.id),
'name': self.worker_1.name,
'slug': self.worker_1.slug,
'type': self.worker_1.type.value
})
def test_workers_retrieve_required_login(self):
response = self.client.get(reverse('api:worker-retrieve', kwargs={'pk': str(self.worker_1.id)}))
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_workers_retrieve_no_access(self):
self.client.force_login(self.user)
private_corpus = Corpus.objects.create(name='private')
repo2 = Repository.objects.create(
url='http://gitlab/repo2',
hook_token='hook-token2',
corpus=private_corpus,
credentials=self.creds,
provider_name='GitLabProvider'
)
worker_2 = Worker.objects.create(
repository=repo2,
name='Worker 2',
slug='worker_2',
type=MLToolType.Classifier
)
response = self.client.get(reverse('api:worker-retrieve', kwargs={'pk': str(worker_2.id)}))
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
# Test on post for WorkerList
def test_workers_post_requires_login(self):
response = self.client.post(
......
......@@ -28,7 +28,7 @@ from arkindex.dataimport.api import (
RepositoryList, RepositoryRetrieve, DataFileCreate,
GitRepositoryImportHook, AvailableRepositoriesList, RevisionRetrieve,
MLToolList, CorpusWorkflow, WorkerList, WorkerVersionList, WorkerVersionRetrieve,
WorkerRunList, WorkerRunDetails, ImportTranskribus
WorkerRunList, WorkerRunDetails, ImportTranskribus, WorkerRetrieve
)
from arkindex.images.api import ImageCreate, IIIFURLCreate, IIIFInformationCreate, ImageRetrieve, ImageElements
from arkindex.users.api import (
......@@ -131,6 +131,7 @@ api = [
# Workers
path('imports/repos/<uuid:pk>/workers/', WorkerList.as_view(), name='repository-workers'),
path('workers/<uuid:pk>/', WorkerRetrieve.as_view(), name='worker-retrieve'),
path('workers/<uuid:pk>/versions/', WorkerVersionList.as_view(), name='worker-versions'),
path('workers/versions/<uuid:pk>/', WorkerVersionRetrieve.as_view(), name='version-retrieve'),
......
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