From 64340ab33bdf9af515686e5655d0a2a1c40c1e12 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 31 Jan 2024 11:35:09 -0500 Subject: [PATCH] Clean up tables --- netbox/core/constants.py | 26 +++++++ netbox/core/tables/columns.py | 16 +++++ netbox/core/tables/tasks.py | 125 +++++++++++++++++++++++++--------- 3 files changed, 135 insertions(+), 32 deletions(-) create mode 100644 netbox/core/constants.py diff --git a/netbox/core/constants.py b/netbox/core/constants.py new file mode 100644 index 000000000..3c3382dcc --- /dev/null +++ b/netbox/core/constants.py @@ -0,0 +1,26 @@ +from dataclasses import dataclass + +from django.utils.translation import gettext_lazy as _ +from rq.job import JobStatus + +__all__ = ( + 'RQ_TASK_STATUSES', +) + + +@dataclass +class Status: + label: str + color: str + + +RQ_TASK_STATUSES = { + JobStatus.QUEUED: Status(_('Queued'), 'cyan'), + JobStatus.FINISHED: Status(_('Finished'), 'green'), + JobStatus.FAILED: Status(_('Failed'), 'red'), + JobStatus.STARTED: Status(_('Started'), 'blue'), + JobStatus.DEFERRED: Status(_('Deferred'), 'gray'), + JobStatus.SCHEDULED: Status(_('Scheduled'), 'purple'), + JobStatus.STOPPED: Status(_('Stopped'), 'orange'), + JobStatus.CANCELED: Status(_('Cancelled'), 'yellow'), +} diff --git a/netbox/core/tables/columns.py b/netbox/core/tables/columns.py index 93f1e3901..f3d985bc3 100644 --- a/netbox/core/tables/columns.py +++ b/netbox/core/tables/columns.py @@ -1,9 +1,12 @@ import django_tables2 as tables +from django.utils.safestring import mark_safe +from core.constants import RQ_TASK_STATUSES from netbox.registry import registry __all__ = ( 'BackendTypeColumn', + 'RQJobStatusColumn', ) @@ -18,3 +21,16 @@ class BackendTypeColumn(tables.Column): def value(self, value): return value + + +class RQJobStatusColumn(tables.Column): + """ + Render a colored label for the status of an RQ job. + """ + def render(self, value): + status = RQ_TASK_STATUSES.get(value) + return mark_safe(f'{status.label}') + + def value(self, value): + status = RQ_TASK_STATUSES.get(value) + return status.label diff --git a/netbox/core/tables/tasks.py b/netbox/core/tables/tasks.py index ff6d08f99..531ec6375 100644 --- a/netbox/core/tables/tasks.py +++ b/netbox/core/tables/tasks.py @@ -1,48 +1,100 @@ 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 django_tables2.utils import A -from netbox.tables import BaseTable, columns -from utilities.templatetags.helpers import annotated_date +from core.tables.columns import RQJobStatusColumn +from netbox.tables import BaseTable class BackgroundQueueTable(BaseTable): - name = tables.LinkColumn("core:background_task_list", args=[A("index"), "queued"], verbose_name=_("Name")) - jobs = tables.LinkColumn("core:background_task_list", args=[A("index"), "queued"], verbose_name=_("Queued")) - oldest_job_timestamp = tables.Column(verbose_name=_("Oldest Queued")) - started_jobs = tables.LinkColumn("core:background_task_list", args=[A("index"), "started"], verbose_name=_("Active")) - deferred_jobs = tables.LinkColumn("core:background_task_list", args=[A("index"), "deferred"], verbose_name=_("Deferred")) - finished_jobs = tables.LinkColumn("core:background_task_list", args=[A("index"), "finished"], verbose_name=_("Finished")) - failed_jobs = tables.LinkColumn("core:background_task_list", args=[A("index"), "failed"], verbose_name=_("Failed")) - scheduled_jobs = tables.LinkColumn("core:background_task_list", args=[A("index"), "scheduled"], verbose_name=_("Scheduled")) - workers = tables.LinkColumn("core:worker_list", args=[A("index")], verbose_name=_("Workers")) - host = tables.Column(accessor="connection_kwargs__host", verbose_name=_("Host")) - port = tables.Column(accessor="connection_kwargs__port", verbose_name=_("Port")) - db = tables.Column(accessor="connection_kwargs__db", verbose_name=_("DB")) - pid = tables.Column(accessor="scheduler__pid", verbose_name=_("Scheduler PID")) + name = tables.Column( + verbose_name=_("Name") + ) + jobs = tables.Column( + linkify=("core:background_task_list", [A("index"), "queued"]), + verbose_name=_("Queued") + ) + oldest_job_timestamp = tables.Column( + verbose_name=_("Oldest Task") + ) + started_jobs = tables.Column( + linkify=("core:background_task_list", [A("index"), "started"]), + verbose_name=_("Active") + ) + deferred_jobs = tables.Column( + linkify=("core:background_task_list", [A("index"), "deferred"]), + verbose_name=_("Deferred") + ) + finished_jobs = tables.Column( + linkify=("core:background_task_list", [A("index"), "finished"]), + verbose_name=_("Finished") + ) + failed_jobs = tables.Column( + linkify=("core:background_task_list", [A("index"), "failed"]), + verbose_name=_("Failed") + ) + scheduled_jobs = tables.Column( + linkify=("core:background_task_list", [A("index"), "scheduled"]), + verbose_name=_("Scheduled") + ) + workers = tables.Column( + linkify=("core:worker_list", [A("index")]), + verbose_name=_("Workers") + ) + host = tables.Column( + accessor="connection_kwargs__host", + verbose_name=_("Host") + ) + port = tables.Column( + accessor="connection_kwargs__port", + verbose_name=_("Port") + ) + db = tables.Column( + accessor="connection_kwargs__db", + verbose_name=_("DB") + ) + pid = tables.Column( + accessor="scheduler__pid", + verbose_name=_("Scheduler PID") + ) class Meta(BaseTable.Meta): - empty_text = _('No tasks found') + empty_text = _('No queues found') fields = ( - 'name', 'jobs', 'oldest_job_timestamp', 'started_jobs', 'deferred_jobs', 'finished_jobs', 'failed_jobs', 'scheduled_jobs', 'workers', 'host', 'port', 'db', 'pid', + 'name', 'jobs', 'oldest_job_timestamp', 'started_jobs', 'deferred_jobs', 'finished_jobs', 'failed_jobs', + 'scheduled_jobs', 'workers', 'host', 'port', 'db', 'pid', ) default_columns = ( - 'name', 'jobs', 'started_jobs', 'deferred_jobs', 'finished_jobs', 'failed_jobs', 'scheduled_jobs', 'workers', + 'name', 'jobs', 'started_jobs', 'deferred_jobs', 'finished_jobs', 'failed_jobs', 'scheduled_jobs', + 'workers', ) class BackgroundTaskTable(BaseTable): - id = tables.LinkColumn("core:background_task", args=[A("id")], verbose_name=_("ID")) - created_at = tables.DateTimeColumn(verbose_name=_("Created")) - enqueued_at = tables.DateTimeColumn(verbose_name=_("Enqueued")) - ended_at = tables.DateTimeColumn(verbose_name=_("Ended")) - status = columns.ChoiceFieldColumn(verbose_name=_("Status"), accessor='get_status') - callable = tables.Column(empty_values=(), verbose_name=_("Callable")) + id = tables.Column( + linkify=("core:background_task", [A("id")]), + verbose_name=_("ID") + ) + created_at = tables.DateTimeColumn( + verbose_name=_("Created") + ) + enqueued_at = tables.DateTimeColumn( + verbose_name=_("Enqueued") + ) + ended_at = tables.DateTimeColumn( + verbose_name=_("Ended") + ) + status = RQJobStatusColumn( + verbose_name=_("Status"), + accessor='get_status' + ) + callable = tables.Column( + empty_values=(), + verbose_name=_("Callable") + ) class Meta(BaseTable.Meta): - empty_text = _('No jobs found') + empty_text = _('No tasks found') fields = ( 'id', 'created_at', 'enqueued_at', 'ended_at', 'status', 'callable', ) @@ -58,10 +110,19 @@ class BackgroundTaskTable(BaseTable): class WorkerTable(BaseTable): - name = tables.LinkColumn("core:worker", args=[A("name")], verbose_name=_("Name")) - state = tables.Column(verbose_name=_("State")) - birth_date = tables.DateTimeColumn(verbose_name=_("Birth")) - pid = tables.Column(verbose_name=_("PID")) + name = tables.Column( + linkify=("core:worker", [A("name")]), + verbose_name=_("Name") + ) + state = tables.Column( + verbose_name=_("State") + ) + birth_date = tables.DateTimeColumn( + verbose_name=_("Birth") + ) + pid = tables.Column( + verbose_name=_("PID") + ) class Meta(BaseTable.Meta): empty_text = _('No workers found')