diff --git a/kobo/admin/templates/hub/menu.py.template b/kobo/admin/templates/hub/menu.py.template index 31018612..da019647 100644 --- a/kobo/admin/templates/hub/menu.py.template +++ b/kobo/admin/templates/hub/menu.py.template @@ -35,6 +35,7 @@ menu = ( MenuItem("Tasks", "task/index", menu=( MenuItem("All", "task/index"), MenuItem("Running", "task/running"), + MenuItem("Failed", "task/failed"), MenuItem("Finished", "task/finished"), )), MenuItem("Info", "worker/list", menu=( diff --git a/kobo/hub/urls/task.py b/kobo/hub/urls/task.py index 87096802..b87ed3f9 100644 --- a/kobo/hub/urls/task.py +++ b/kobo/hub/urls/task.py @@ -17,6 +17,7 @@ url(r"^$", TaskListView.as_view(), name="task/index"), url(r"^(?P\d+)/$", TaskDetail.as_view(), name="task/detail"), url(r"^running/$", TaskListView.as_view(state=(TASK_STATES["FREE"], TASK_STATES["ASSIGNED"], TASK_STATES["OPEN"]), title=_("Running tasks"), order_by=["id"]), name="task/running"), + url(r"^failed/$", TaskListView.as_view(state=(TASK_STATES["FAILED"],), title=_("Failed tasks"), order_by=["-dt_created", "id"]), name="task/failed"), url(r"^finished/$", TaskListView.as_view(state=(TASK_STATES["CLOSED"], TASK_STATES["INTERRUPTED"], TASK_STATES["CANCELED"], TASK_STATES["FAILED"]), title=_("Finished tasks"), order_by=["-dt_created", "id"]), name="task/finished"), url(r"^(?P\d+)/log/(?P.+)$", kobo.hub.views.task_log, name="task/log"), url(r"^(?P\d+)/log-json/(?P.+)$", kobo.hub.views.task_log_json, name="task/log-json"), diff --git a/tests/test_views.py b/tests/test_views.py index 03a69b88..d2b4c3d4 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -134,6 +134,15 @@ def test_list_running(self): self.assertTrue(self.task3.method not in str(response.content)) self.assertTrue(self.task4.method not in str(response.content)) + def test_list_failed(self): + response = self.client.get('/task/failed/') + self.assertEqual(response.status_code, 200) + # make sure only failed tasks are listed + self.assertTrue(self.task1.get_state_display() not in str(response.content)) + self.assertTrue(self.task2.get_state_display() not in str(response.content)) + self.assertTrue(self.task3.get_state_display() not in str(response.content)) + self.assertTrue(self.task4.get_state_display() in str(response.content)) + def test_list_finished(self): response = self.client.get('/task/finished/') self.assertEqual(response.status_code, 200)