Skip to content
Snippets Groups Projects
Commit 7ab7acc5 authored by Manon Blanco's avatar Manon Blanco
Browse files

use the same endpoint

parent ce06e9d2
No related branches found
No related tags found
No related merge requests found
......@@ -24,7 +24,7 @@ from arkindex.dataimport.serializers.git import \
RepositorySerializer, RepositoryStartImportSerializer, ExternalRepositorySerializer, EventSerializer
from arkindex.dataimport.serializers.imports import (
DataImportLightSerializer, DataImportSerializer,
DataImportFromFilesSerializer, ElementsWorkflowSerializer, SelectionWorkflowSerializer
DataImportFromFilesSerializer, ElementsWorkflowSerializer
)
from arkindex.users.models import OAuthCredentials
from arkindex_common.ml_tool import MLTool
......@@ -174,7 +174,7 @@ class DataImportFromFiles(CreateAPIView):
self.dataimport.start()
class CorpusWorkflow(CreateAPIView):
class CorpusWorkflow(CreateAPIView, SelectionMixin):
"""
Start a Ponos ML workflow from Arkindex corpus elements
"""
......@@ -199,9 +199,9 @@ class CorpusWorkflow(CreateAPIView):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
ml_tools, corpus, element, name, elt_type = map(
ml_tools, corpus, element, name, elt_type, selection = map(
lambda key: serializer.validated_data.pop(key, None),
('ml_tools', 'corpus', 'element', 'name', 'type')
('ml_tools', 'corpus', 'element', 'name', 'type', 'selection')
)
payload = {
......@@ -212,6 +212,12 @@ class CorpusWorkflow(CreateAPIView):
**serializer.validated_data
}
if selection:
elements = [str(id) for id in self.get_selection(corpus.id).values_list('id', flat=True)]
if not elements:
raise ValidationError({'selection': 'No element match filtering'})
payload['elements'] = json.dumps(elements)
# Add filters
if name:
payload['name_contains'] = name
......@@ -244,61 +250,6 @@ class CorpusWorkflow(CreateAPIView):
)
class SelectionWorkflow(SelectionMixin, CreateAPIView):
"""
Start a Ponos ML workflow from Arkindex selection
"""
permission_classes = (IsVerified, )
serializer_class = SelectionWorkflowSerializer
openapi_overrides = {
'operationId': 'CreateSelectionWorkflow',
'description': 'Create a distributed workflow from selection of an Arkindex corpus',
'tags': ['imports'],
'responses': {
'201': {
'content': {
'application/json': {
'schema': AutoSchema()._map_serializer(DataImportSerializer())
}
}
}
}
}
def create(self, request, pk=None, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
ml_tools, corpus = map(
lambda key: serializer.validated_data.pop(key, None),
('ml_tools', 'corpus')
)
elements = [str(id) for id in self.get_selection(corpus.id).values_list('id', flat=True)]
payload = {
'corpus_id': str(corpus.id),
'elements': json.dumps(elements),
# Re-serialize ML tools as JSON
'ml_tools': MLToolTaskSerializer(ml_tools, many=True).data,
# Chunks and thumbnails parameters
**serializer.validated_data
}
dataimport = corpus.imports.create(
creator=self.request.user,
mode=DataImportMode.Elements,
payload=payload,
)
dataimport.start()
return Response(
status=status.HTTP_201_CREATED,
data=DataImportSerializer(
dataimport,
context=self.get_serializer_context()
).data,
)
class DataFileList(CorpusACLMixin, ListAPIView):
"""
List uploaded files
......@@ -348,7 +299,7 @@ class DataFileUpload(CorpusACLMixin, APIView):
try:
corpus = self.get_corpus(pk, right=Right.Write)
except Http404:
raise ValidationError({'corpus': ['Corpus not found']})
raise No element match filtering
file_obj = request.FILES['file']
......
......@@ -200,6 +200,7 @@ class ElementsWorkflowSerializer(serializers.Serializer):
element = serializers.PrimaryKeyRelatedField(queryset=Element.objects.none(), required=False)
name = serializers.CharField(required=False)
type = serializers.SlugField(required=False)
selection = serializers.BooleanField(default=False)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
......@@ -224,7 +225,12 @@ class ElementsWorkflowSerializer(serializers.Serializer):
element = data.get('element')
name = data.get('name')
elt_type = data.get('type')
selection = data.get('selection')
if selection and (element or name or elt_type):
raise serializers.ValidationError({
'__all__': ['Filtering parameters (element, name, type) cannot be used with selection parameter']
})
if element and (name or elt_type):
raise serializers.ValidationError({
'__all__': ['Filtering parameters (name, type) cannot be used with element parameter']
......@@ -252,19 +258,3 @@ class ElementsWorkflowSerializer(serializers.Serializer):
'__all__': ['No element match filtering']
})
return data
class SelectionWorkflowSerializer(serializers.Serializer):
ml_tools = MLToolTaskSerializer(many=True)
chunks = serializers.IntegerField(min_value=1, max_value=10, default=1)
corpus = serializers.PrimaryKeyRelatedField(queryset=Corpus.objects.none())
thumbnails = serializers.BooleanField(required=False)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if not self.context.get('request'):
# Do not raise Error in order to create OpenAPI schema
return
corpora = Corpus.objects.writable(self.context['request'].user)
self.fields['corpus'].queryset = corpora
......@@ -24,7 +24,7 @@ from arkindex.dataimport.api import (
DataFileList, DataFileRetrieve, DataFileUpload, DataImportFromFiles,
RepositoryList, RepositoryRetrieve, RepositoryStartImport, DataFileCreate,
GitRepositoryImportHook, AvailableRepositoriesList, ElementHistory, MLToolList,
CorpusWorkflow, SelectionWorkflow
CorpusWorkflow
)
from arkindex.images.api import ImageCreate, ImageRetrieve, ImageElements
from arkindex.users.api import (
......@@ -132,7 +132,6 @@ api = [
path('imports/file/<uuid:pk>/', DataFileRetrieve.as_view(), name='file-retrieve'),
path('imports/upload/<uuid:pk>/', DataFileUpload.as_view(), name='file-upload'),
path('imports/corpus/', CorpusWorkflow.as_view(), name='corpus-workflow'),
path('imports/selection/', SelectionWorkflow.as_view(), name='selection-workflow'),
# Image management
path('image/', ImageCreate.as_view(), name='image-create'),
......
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