diff --git a/arkindex/dataimport/admin.py b/arkindex/dataimport/admin.py index 9e3efcea107d1fcf7ee0807775ea6e55291b9a69..d775bb5ce2131e5852fb340a839ce598e5dc8452 100644 --- a/arkindex/dataimport/admin.py +++ b/arkindex/dataimport/admin.py @@ -36,12 +36,12 @@ class DataImportAdmin(admin.ModelAdmin): list_display = ('id', 'creator', 'corpus', 'state', 'mode') list_filter = [('mode', EnumFieldListFilter), ] fieldsets = ( - (None, {'fields': ('id', 'creator', 'corpus', 'state', 'mode', 'workflow', 'activity_state')}), + (None, {'fields': ('id', 'creator', 'corpus', 'state', 'mode', 'workflow', 'activity_state', 'template')}), ('Elements filters', { 'fields': ('element', 'element_type', 'folder_type', 'name_contains', 'best_class') }), ) - readonly_fields = ('id', 'workflow', 'state', 'activity_state') + readonly_fields = ('id', 'workflow', 'state', 'activity_state', 'template') raw_id_fields = ('element', ) inlines = [DataFileInline, WorkerRunInline, ElementInline] diff --git a/arkindex/dataimport/migrations/0043_dataimport_template.py b/arkindex/dataimport/migrations/0043_dataimport_template.py new file mode 100644 index 0000000000000000000000000000000000000000..11b20cf56b891f40017e6c51139110b82c082f73 --- /dev/null +++ b/arkindex/dataimport/migrations/0043_dataimport_template.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.6 on 2021-11-18 12:13 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dataimport', '0042_alter_workeractivity_constraints'), + ] + + operations = [ + migrations.AddField( + model_name='dataimport', + name='template', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='applications', to='dataimport.dataimport'), + ), + ] diff --git a/arkindex/dataimport/models.py b/arkindex/dataimport/models.py index 6660737e8026400adedd3dbe5ac1037a62447e24..14f9575d58fad82f27cedd67a6acc8b049128f48 100644 --- a/arkindex/dataimport/models.py +++ b/arkindex/dataimport/models.py @@ -42,6 +42,7 @@ class DataImportMode(Enum): IIIF = 'iiif' Workers = 'workers' Transkribus = 'transkribus' + Template = 'template' class DataImport(IndexableModel): @@ -106,8 +107,18 @@ class DataImport(IndexableModel): # Use elements cache executing the workflow use_cache = models.BooleanField(default=False) + # Allows to use a GPU when executing the workflow use_gpu = models.BooleanField(default=False, blank=True) + # Refers a workflow template + template = models.ForeignKey( + 'dataimport.DataImport', + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name='applications', + ) + class Meta: ordering = ['corpus', '-created'] diff --git a/arkindex/dataimport/serializers/imports.py b/arkindex/dataimport/serializers/imports.py index a99ad4f04b1c023b914af8eb0a3a4e1085af3af5..c21bd09a33a04507de50beb65e25a5db860a337f 100644 --- a/arkindex/dataimport/serializers/imports.py +++ b/arkindex/dataimport/serializers/imports.py @@ -72,6 +72,13 @@ class DataImportSerializer(DataImportLightSerializer): max_length=250 ) + template_id = serializers.PrimaryKeyRelatedField( + queryset=DataImport.objects.none(), + allow_null=True, + source='template', + style={'base_template': 'input.html'} + ) + class Meta(DataImportLightSerializer.Meta): fields = DataImportLightSerializer.Meta.fields + ( 'files', @@ -84,6 +91,7 @@ class DataImportSerializer(DataImportLightSerializer): 'load_children', 'use_cache', 'use_gpu', + 'template_id' ) read_only_fields = DataImportLightSerializer.Meta.read_only_fields + ( 'files', @@ -92,6 +100,7 @@ class DataImportSerializer(DataImportLightSerializer): 'folder_type', 'use_cache', 'use_gpu', + 'template_id' ) def __init__(self, *args, **kwargs): diff --git a/arkindex/dataimport/tests/test_imports.py b/arkindex/dataimport/tests/test_imports.py index 658402008631856108ac90b66ce26dea47240343..3c936c4c38e83e0a5b8f2a5c26322d029f9c33f5 100644 --- a/arkindex/dataimport/tests/test_imports.py +++ b/arkindex/dataimport/tests/test_imports.py @@ -451,7 +451,7 @@ class TestImports(FixtureAPITestCase): If no activities exists for this process, it is deleted directly. """ self.client.force_login(self.user) - with self.assertNumQueries(12): + with self.assertNumQueries(13): response = self.client.delete(reverse('api:import-details', kwargs={'pk': self.elts_process.id})) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) with self.assertRaises(DataImport.DoesNotExist): @@ -462,7 +462,7 @@ class TestImports(FixtureAPITestCase): A superuser is allowed to delete any dataimport """ self.client.force_login(self.superuser) - with self.assertNumQueries(9): + with self.assertNumQueries(10): response = self.client.delete(reverse('api:import-details', kwargs={'pk': self.user_img_process.id})) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) with self.assertRaises(DataImport.DoesNotExist): @@ -508,7 +508,7 @@ class TestImports(FixtureAPITestCase): worker_version=WorkerVersion.objects.get(worker__slug='reco'), state=WorkerActivityState.Processed, ) - with self.assertNumQueries(11): + with self.assertNumQueries(12): response = self.client.delete(reverse('api:import-details', kwargs={'pk': self.elts_process.id})) self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) with self.assertRaises(DataImport.DoesNotExist): @@ -770,6 +770,7 @@ class TestImports(FixtureAPITestCase): 'revision': None, 'state': 'unscheduled', 'workflow': None, + 'template_id': None, }) def test_retry_requires_login(self): diff --git a/arkindex/dataimport/tests/test_repos.py b/arkindex/dataimport/tests/test_repos.py index 8659c5323959fb299d033412aeeefa894292298d..3748e1509cd8ef48e1a10045ae71140bc6e9494c 100644 --- a/arkindex/dataimport/tests/test_repos.py +++ b/arkindex/dataimport/tests/test_repos.py @@ -359,7 +359,8 @@ class TestRepositories(FixtureTestCase): 'mode': DataImportMode.Repository.value, 'revision': self.serialized_revision, 'state': State.Unscheduled.value, - 'workflow': None + 'workflow': None, + 'template_id': None, }) # Thumbnails are not generated for Workers imports @@ -402,7 +403,8 @@ class TestRepositories(FixtureTestCase): 'mode': DataImportMode.Repository.value, 'revision': self.serialized_revision, 'state': State.Unscheduled.value, - 'workflow': None + 'workflow': None, + 'template_id': None }) # Thumbnails are generated for IIIF imports diff --git a/arkindex/dataimport/tests/test_workflows_api.py b/arkindex/dataimport/tests/test_workflows_api.py index 4d2cbda2eae1f16c3cb317cf42e063e3db5a43f3..5f53cf935c40310f985af2c84cd7f9f141ccd7a5 100644 --- a/arkindex/dataimport/tests/test_workflows_api.py +++ b/arkindex/dataimport/tests/test_workflows_api.py @@ -94,6 +94,7 @@ class TestWorkflows(FixtureAPITestCase): 'folder_type': None, 'element_type': 'page', 'element': None, + 'template_id': None, 'load_children': False, 'use_cache': False, 'use_gpu': False, @@ -148,6 +149,7 @@ class TestWorkflows(FixtureAPITestCase): 'workflow': None, 'folder_type': None, 'element_type': None, + 'template_id': None, 'load_children': True, 'use_cache': True, 'use_gpu': False,