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

Merge branch 'workerversion-fk-on-element' into 'master'

Add a FK on Element towards a WorkerVersion

Closes #365

See merge request !871
parents 4bae108d 73ddb2ab
No related branches found
No related tags found
1 merge request!871Add a FK on Element towards a WorkerVersion
# Generated by Django 2.2.13 on 2020-08-10 10:00
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('dataimport', '0015_clear_payload'),
('documents', '0017_remove_elementtype_default_view'),
]
operations = [
migrations.AddField(
model_name='element',
name='worker_version',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='elements', to='dataimport.WorkerVersion'),
),
]
......@@ -147,6 +147,13 @@ class Element(IndexableModel):
null=True,
blank=True,
)
worker_version = models.ForeignKey(
'dataimport.WorkerVersion',
on_delete=models.SET_NULL,
related_name='elements',
null=True,
blank=True,
)
es_document = ESElement
objects = ElementManager()
......
......@@ -2,6 +2,7 @@ from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from arkindex_common.ml_tool import MLToolType
from arkindex_common.enums import MetaType
from arkindex.dataimport.models import WorkerVersion
from arkindex.documents.models import Corpus, Element, ElementPath, ElementType, MetaData, Entity
from arkindex.images.serializers import ZoneSerializer
from arkindex.images.models import Image, Zone
......@@ -304,10 +305,11 @@ class ElementCreateSerializer(ElementLightSerializer):
'`image` must be set when this field is set. Defaults to a rectangle taking up the whole image.',
)
source = DataSourceSlugField(tool_type=MLToolType.DLAnalyser, required=False)
worker_version = serializers.PrimaryKeyRelatedField(queryset=WorkerVersion.objects.all(), required=False, allow_null=True)
class Meta(ElementLightSerializer.Meta):
model = Element
fields = ElementLightSerializer.Meta.fields + ('image', 'corpus', 'parent', 'polygon', 'source')
fields = ElementLightSerializer.Meta.fields + ('image', 'corpus', 'parent', 'polygon', 'source', 'worker_version')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
......@@ -343,6 +345,10 @@ class ElementCreateSerializer(ElementLightSerializer):
# will lead to many errors everywhere as this would create impossible polygons
errors['image'].append('This image does not have valid dimensions.')
if data.get('source') and data.get('worker_version'):
errors['source'].append('You can only refer to a DataSource XOR a WorkerVersion on an element')
errors['worker_version'].append('You can only refer to a DataSource XOR a WorkerVersion on an element')
if errors:
raise ValidationError(errors)
return data
......@@ -373,6 +379,7 @@ class ElementCreateSerializer(ElementLightSerializer):
type=validated_data['type'],
name=validated_data['name'],
source=validated_data.get('source'),
worker_version=validated_data.get('worker_version'),
zone_id=zone_id,
)
......
from django.urls import reverse
from rest_framework import status
from arkindex_common.ml_tool import MLToolType
from arkindex.dataimport.models import Worker, WorkerVersion
from arkindex.documents.models import \
Element, DataSource, Corpus
from arkindex.images.models import ImageServer
......@@ -24,6 +25,9 @@ class TestCreateElements(FixtureAPITestCase):
width=42,
height=42,
)
cls.creds = cls.user.credentials.get()
cls.repo = cls.creds.repos.get()
cls.rev = cls.repo.revisions.get()
def make_create_request(self, name='default', corpus=None, elt_type='volume', **options):
request = {
......@@ -150,6 +154,70 @@ class TestCreateElements(FixtureAPITestCase):
self.assertEqual(act.name, 'Castle story')
self.assertEqual(act.type, self.act_type)
self.assertEqual(act.source, source)
self.assertEqual(act.worker_version, None)
def test_create_element_worker_version(self):
# Create an element with a worker version
self.client.force_login(self.user)
worker = Worker.objects.create(
repository=self.repo,
name='Worker 1',
slug='worker_1',
type=MLToolType.Classifier
)
version = WorkerVersion.objects.create(
worker=worker,
revision=self.rev,
configuration={"test": "test1"}
)
request = self.make_create_request(
name='Castle story',
elt_type='act',
worker_version=str(version.id),
)
with self.assertNumQueries(8):
response = self.client.post(**request)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
act = Element.objects.get(id=response.json()['id'])
self.assertEqual(act.name, 'Castle story')
self.assertEqual(act.type, self.act_type)
self.assertEqual(act.source, None)
self.assertEqual(act.worker_version, version)
def test_create_element_source_and_worker_version_returns_error(self):
# Create an element with a source and a worker version (not allowed)
self.client.force_login(self.user)
DataSource.objects.create(
type=MLToolType.DLAnalyser,
slug='fairy_tale_detector',
internal=False,
)
worker = Worker.objects.create(
repository=self.repo,
name='Worker 1',
slug='worker_1',
type=MLToolType.Classifier
)
version = WorkerVersion.objects.create(
worker=worker,
revision=self.rev,
configuration={"test": "test1"}
)
request = self.make_create_request(
name='Castle story',
elt_type='act',
source='fairy_tale_detector',
worker_version=str(version.id),
)
with self.assertNumQueries(6):
response = self.client.post(**request)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(response.json(), {
'source': ['You can only refer to a DataSource XOR a WorkerVersion on an '
'element'],
'worker_version': ['You can only refer to a DataSource XOR a WorkerVersion on '
'an element']
})
def test_create_element_polygon(self):
# Create an element with a polygon to an existing volume
......
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