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, + })