Skip to content
Snippets Groups Projects
Commit 34ce5544 authored by Valentin Rigal's avatar Valentin Rigal Committed by Erwan Rouchet
Browse files

Suggestions

parent 751d1806
No related branches found
No related tags found
1 merge request!2266RestartTask endpoint
This commit is part of merge request !2266. Comments created here will be created in the context of that merge request.
...@@ -184,7 +184,7 @@ class TaskUpdate(UpdateAPIView): ...@@ -184,7 +184,7 @@ class TaskUpdate(UpdateAPIView):
tags=["ponos"], tags=["ponos"],
description=dedent( description=dedent(
""" """
Restart a task by creating a fresh copy and moves dependent tasks to the new one. Restart a task by creating a fresh copy and moving dependent tasks to the new one.
Scenario restarting `my_worker` task: Scenario restarting `my_worker` task:
``` ```
...@@ -196,7 +196,7 @@ class TaskUpdate(UpdateAPIView): ...@@ -196,7 +196,7 @@ class TaskUpdate(UpdateAPIView):
my_worker_2 → other worker my_worker_2 → other worker
``` ```
Requires an **admin** access to task's process. Requires an **admin** access to the task's process.
The task must be in a final state to be restarted. The task must be in a final state to be restarted.
""" """
), ),
...@@ -209,7 +209,7 @@ class TaskRestart(ProcessACLMixin, CreateAPIView): ...@@ -209,7 +209,7 @@ class TaskRestart(ProcessACLMixin, CreateAPIView):
def get_task(self): def get_task(self):
task = get_object_or_404( task = get_object_or_404(
Task.objects.prefetch_related("parents").select_related("process"), Task.objects.prefetch_related("parents").select_related("process__corpus"),
pk=self.kwargs["pk"], pk=self.kwargs["pk"],
) )
access_level = self.process_access_level(task.process) access_level = self.process_access_level(task.process)
...@@ -223,6 +223,12 @@ class TaskRestart(ProcessACLMixin, CreateAPIView): ...@@ -223,6 +223,12 @@ class TaskRestart(ProcessACLMixin, CreateAPIView):
raise ValidationError( raise ValidationError(
detail="Task's state must be in a final state to be restarted." detail="Task's state must be in a final state to be restarted."
) )
# TODO Check the original_task_id field directly once it is implemented
# https://gitlab.teklia.com/arkindex/frontend/-/issues/1383
if task.process.tasks.filter(run=task.run, slug=self.increment(task.slug)).exists():
raise ValidationError(
detail="This task has already been restarted"
)
return task return task
def increment(self, name): def increment(self, name):
......
...@@ -581,13 +581,12 @@ class TestAPI(FixtureAPITestCase): ...@@ -581,13 +581,12 @@ class TestAPI(FixtureAPITestCase):
) )
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
@expectedFailure @patch("arkindex.project.mixins.get_max_level")
def test_restart_task_forbidden(self): def test_restart_task_forbidden(self, get_max_level_mock):
"""An admin access to the process is required""" """An admin access to the process is required"""
get_max_level_mock.return_value = Role.Guest.value
self.client.force_login(self.user) self.client.force_login(self.user)
self.corpus.memberships.filter(user=self.user).update(level=Role.Guest.value) with self.assertNumQueries(7):
self.process.save()
with self.assertNumQueries(10):
response = self.client.post( response = self.client.post(
reverse("api:task-restart", kwargs={"pk": str(self.task1.id)}) reverse("api:task-restart", kwargs={"pk": str(self.task1.id)})
) )
...@@ -599,7 +598,7 @@ class TestAPI(FixtureAPITestCase): ...@@ -599,7 +598,7 @@ class TestAPI(FixtureAPITestCase):
def test_restart_task_non_final_state(self): def test_restart_task_non_final_state(self):
self.client.force_login(self.user) self.client.force_login(self.user)
with self.assertNumQueries(8): with self.assertNumQueries(7):
response = self.client.post( response = self.client.post(
reverse("api:task-restart", kwargs={"pk": str(self.task1.id)}) reverse("api:task-restart", kwargs={"pk": str(self.task1.id)})
) )
...@@ -609,6 +608,22 @@ class TestAPI(FixtureAPITestCase): ...@@ -609,6 +608,22 @@ class TestAPI(FixtureAPITestCase):
["Task's state must be in a final state to be restarted."], ["Task's state must be in a final state to be restarted."],
) )
def test_restart_task_already_restarted(self):
self.client.force_login(self.user)
self.task2.slug = self.task1.slug + "_restart1"
self.task2.save()
self.task1.state = State.Completed.value
self.task1.save()
with self.assertNumQueries(8):
response = self.client.post(
reverse("api:task-restart", kwargs={"pk": str(self.task1.id)})
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertListEqual(
response.json(),
["This task has already been restarted"],
)
@patch("arkindex.project.aws.s3") @patch("arkindex.project.aws.s3")
def test_restart_task(self, s3_mock): def test_restart_task(self, s3_mock):
""" """
......
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