diff --git a/arkindex/dataimport/models.py b/arkindex/dataimport/models.py index 29c91598dd19e2af289b857708eafa007c5cf67a..754059443e0eafb70f74fbc1f2a3a0d53123b0ca 100644 --- a/arkindex/dataimport/models.py +++ b/arkindex/dataimport/models.py @@ -3,6 +3,7 @@ from django.contrib.postgres.fields import JSONField from django.template.defaultfilters import slugify from django.conf import settings from django.utils.functional import cached_property +from rest_framework.exceptions import ValidationError from enumfields import EnumField, Enum from arkindex.project.models import IndexableModel from arkindex.documents.models import Element, ElementType @@ -51,6 +52,8 @@ class DataImport(IndexableModel): Create a ponos workflow with a recipe according to configuration ''' assert self.workflow is None, 'A workflow is already setup' + if self.mode == DataImportMode.Repository and self.revision is not None and not self.revision.repo.enabled: + raise ValidationError('Git repository does not have any valid credentials') # Import data in Arkindex, then do the ML analysis tasks = { @@ -75,6 +78,8 @@ class DataImport(IndexableModel): self.save() def retry(self): + if self.mode == DataImportMode.Repository and self.revision is not None and not self.revision.repo.enabled: + raise ValidationError('Git repository does not have any valid credentials') if self.workflow: self.workflow.retry() else: diff --git a/arkindex/dataimport/tests/test_imports.py b/arkindex/dataimport/tests/test_imports.py index 1787d5ffe980532daaf138b9091b71a15ad91631..2fe9e385a7791bac92e56e2e902109f6e26c749d 100644 --- a/arkindex/dataimport/tests/test_imports.py +++ b/arkindex/dataimport/tests/test_imports.py @@ -172,6 +172,19 @@ class TestImports(FixtureAPITestCase): self.dataimport.refresh_from_db() self.assertEqual(self.dataimport.state, State.Unscheduled) + def test_retry_repo_disabled(self): + self.client.force_login(self.user) + self.dataimport.mode = DataImportMode.Repository + self.dataimport.revision = self.rev + self.dataimport.save() + self.dataimport.start() + self.dataimport.workflow.tasks.all().update(state=State.Error) + self.assertEqual(self.dataimport.state, State.Error) + self.creds.delete() + response = self.client.post(reverse('api:import-retry', kwargs={'pk': self.dataimport.id})) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.creds.save() + def test_failures_requires_login(self): self.dataimport.failures.create(path='path/to/file', message='something') response = self.client.get(reverse('api:import-failures', kwargs={'pk': self.dataimport.id})) diff --git a/arkindex/dataimport/tests/test_repos.py b/arkindex/dataimport/tests/test_repos.py index 60caf2031e82612bdfcbc0e63730e50d929f3810..0d2b6d538489e7a0c0f2b5be2b5006a87ac15b90 100644 --- a/arkindex/dataimport/tests/test_repos.py +++ b/arkindex/dataimport/tests/test_repos.py @@ -1,6 +1,7 @@ from arkindex.project.tests import FixtureTestCase from arkindex.dataimport.models import Repository, DataImport, DataImportMode from ponos.models import Workflow +from rest_framework.exceptions import ValidationError class TestRepositories(FixtureTestCase): @@ -29,13 +30,18 @@ class TestRepositories(FixtureTestCase): self.creds.delete() self.assertEqual(Workflow.objects.count(), 0) - with self.assertRaises(Exception): - DataImport.objects.create( - mode=DataImportMode.Repository, - revision=self.rev, - creator=self.superuser, - corpus=self.corpus, - ).start_import() + di = DataImport.objects.create( + mode=DataImportMode.Repository, + revision=self.rev, + creator=self.superuser, + corpus=self.corpus, + ) + + with self.assertRaises(ValidationError): + di.start() + + with self.assertRaises(ValidationError): + di.retry() self.assertEqual(Workflow.objects.count(), 0) self.creds.save()