diff --git a/netbox/core/tables/tasks.py b/netbox/core/tables/tasks.py
index 4dc7d56ae..f84f23c48 100644
--- a/netbox/core/tables/tasks.py
+++ b/netbox/core/tables/tasks.py
@@ -1,5 +1,7 @@
import django_tables2 as tables
from django_tables2.utils import A # alias for Accessor
+from django.urls import reverse
+from django.utils.html import mark_safe
from django.utils.translation import gettext_lazy as _
from netbox.tables import NetBoxTable, columns
@@ -29,7 +31,7 @@ class BackgroundTasksTable(tables.Table):
class BackgroundTasksQueueTable(tables.Table):
# id = tables.LinkColumn("core:background_tasks_queues", args=[A("index")], verbose_name=_("ID"))
- id = tables.Column(verbose_name=_("ID"))
+ id = tables.Column(empty_values=(), verbose_name=_("ID"))
created_at = tables.Column(verbose_name=_("Created"))
enqueued_at = tables.Column(verbose_name=_("Enqueued"))
ended_at = tables.Column(verbose_name=_("Ended"))
@@ -41,6 +43,12 @@ class BackgroundTasksQueueTable(tables.Table):
'class': 'table table-hover object-list',
}
+ def render_id(self, value, record):
+ return mark_safe('' + value + ''
+ )
+
def render_status(self, value, record):
return record.get_status
@@ -49,3 +57,7 @@ class BackgroundTasksQueueTable(tables.Table):
return record.func_name
except Exception as e:
return repr(e)
+
+ def __init__(self, queue_index, *args, **kwargs):
+ self.queue_index = queue_index
+ super().__init__(*args, **kwargs)
diff --git a/netbox/core/urls.py b/netbox/core/urls.py
index 00df16f05..b47be8a56 100644
--- a/netbox/core/urls.py
+++ b/netbox/core/urls.py
@@ -28,6 +28,7 @@ urlpatterns = (
# Background Tasks
path('background-tasks/', views.BackgroundTasksListView.as_view(), name='background_tasks_list'),
path('background-tasks/queues//', views.BackgroundTasksQueueListView.as_view(), name='background_tasks_queues'),
+ path('background-tasks/queues///', views.BackgroundTasksJobDetailView.as_view(), name='background_tasks_job_detail'),
# Config revisions
path('config-revisions/', views.ConfigRevisionListView.as_view(), name='configrevision_list'),
diff --git a/netbox/core/views.py b/netbox/core/views.py
index 9a692a23f..9c78243a8 100644
--- a/netbox/core/views.py
+++ b/netbox/core/views.py
@@ -1,16 +1,17 @@
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.cache import cache
-from django.http import HttpResponseForbidden
+from django.http import HttpResponseForbidden, Http404
from django_rq.queues import get_queue_by_index
from django_rq.utils import get_scheduler_statistics, get_statistics
-
from django.shortcuts import get_object_or_404, redirect, render
from django.views.generic import View
from netbox.config import get_config, PARAMS
from netbox.views import generic
from netbox.views.generic.base import BaseObjectView
+from rq.exceptions import NoSuchJobError
+from rq.job import Job as RQ_Job
from utilities.utils import count_related
from utilities.views import ContentTypePermissionRequiredMixin, register_model_view
from . import filtersets, forms, tables
@@ -262,8 +263,25 @@ class BackgroundTasksQueueListView(LoginRequiredMixin, View):
else:
jobs = []
- table = tables.BackgroundTasksQueueTable(jobs)
+ table = tables.BackgroundTasksQueueTable(data=jobs, queue_index=queue_index)
return render(request, 'core/background_tasks_queue.html', {
'table': table,
'queue': queue,
})
+
+
+class BackgroundTasksJobDetailView(LoginRequiredMixin, View):
+
+ def get(self, request, queue_index, job_id):
+ queue_index = int(queue_index)
+ queue = get_queue_by_index(queue_index)
+
+ try:
+ job = RQ_Job.fetch(job_id, connection=queue.connection, serializer=queue.serializer)
+ except NoSuchJobError:
+ raise Http404("Couldn't find job with this ID: %s" % job_id)
+
+ return render(request, 'core/background_tasks_job.html', {
+ 'queue': queue,
+ 'job': job,
+ })