diff --git a/app/api/tasks.py b/app/api/tasks.py index 5eb02670..3f8550dc 100644 --- a/app/api/tasks.py +++ b/app/api/tasks.py @@ -50,8 +50,8 @@ class TaskViewSet(viewsets.ViewSet): raise exceptions.NotFound() return project - def set_pending_action(self, pending_action, request, pk=None, project_pk=None): - self.get_and_check_project(request, project_pk, ('change_project',)) + def set_pending_action(self, pending_action, request, pk=None, project_pk=None, perms=('change_project', )): + self.get_and_check_project(request, project_pk, perms) try: task = self.queryset.get(pk=pk, project=project_pk) except ObjectDoesNotExist: @@ -76,8 +76,7 @@ class TaskViewSet(viewsets.ViewSet): @detail_route(methods=['post']) def remove(self, *args, **kwargs): - # TODO: this should check for delete_project perms - return self.set_pending_action(models.Task.PendingActions.REMOVE, *args, **kwargs) + return self.set_pending_action(models.Task.PendingActions.REMOVE, *args, perms=('delete_project', ), **kwargs) @detail_route(methods=['get']) def output(self, request, pk=None, project_pk=None): diff --git a/app/static/app/css/main.scss b/app/static/app/css/main.scss index f86584a9..7e329b0c 100644 --- a/app/static/app/css/main.scss +++ b/app/static/app/css/main.scss @@ -57,6 +57,7 @@ ul#side-menu.nav{ a{ color: #111; + word-break: break-all; } } diff --git a/app/tests/test_api.py b/app/tests/test_api.py index 05879848..aaff3738 100644 --- a/app/tests/test_api.py +++ b/app/tests/test_api.py @@ -1,6 +1,7 @@ from .classes import BootTestCase from rest_framework.test import APIClient from rest_framework import status +import datetime from app.models import Project, Task from nodeodm.models import ProcessingNode @@ -73,7 +74,7 @@ class TestApi(BootTestCase): # Create some tasks task = Task.objects.create(project=project) - task2 = Task.objects.create(project=project) + task2 = Task.objects.create(project=project, created_at=task.created_at + datetime.timedelta(0, 1)) other_task = Task.objects.create(project=other_project) # Can list project tasks to a project we have access to @@ -160,12 +161,23 @@ class TestApi(BootTestCase): self.assertTrue(task.last_error is None) self.assertTrue(task.pending_action == task.PendingActions.CANCEL) - # Cannot cancel a task for which we don't have permission - res = client.post('/api/projects/{}/tasks/{}/cancel/'.format(other_project.id, other_task.id)) - self.assertEqual(res.status_code, status.HTTP_404_NOT_FOUND) + res = client.post('/api/projects/{}/tasks/{}/restart/'.format(project.id, task.id)) + self.assertTrue(res.data["success"]) + task.refresh_from_db() + self.assertTrue(task.last_error is None) + self.assertTrue(task.pending_action == task.PendingActions.RESTART) - # TODO: test restart and delete operations + # Cannot cancel, restart or delete a task for which we don't have permission + for action in ['cancel', 'remove', 'restart']: + res = client.post('/api/projects/{}/tasks/{}/{}/'.format(other_project.id, other_task.id, action)) + self.assertEqual(res.status_code, status.HTTP_404_NOT_FOUND) + # Can delete + res = client.post('/api/projects/{}/tasks/{}/remove/'.format(project.id, task.id)) + self.assertTrue(res.data["success"]) + task.refresh_from_db() + self.assertTrue(task.last_error is None) + self.assertTrue(task.pending_action == task.PendingActions.REMOVE) def test_processingnodes(self): client = APIClient()