From bc248208e27d2360403710f06e41e5a96d88ac28 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 23 May 2024 13:13:37 -0700 Subject: [PATCH 1/4] 16149 add (optional) obj hyperlink to script list table --- docs/customization/custom-scripts.md | 10 +++++----- netbox/extras/scripts.py | 4 +++- netbox/extras/tables/tables.py | 9 +++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/docs/customization/custom-scripts.md b/docs/customization/custom-scripts.md index 21ae20f0558..3becd891093 100644 --- a/docs/customization/custom-scripts.md +++ b/docs/customization/custom-scripts.md @@ -144,11 +144,11 @@ These two methods will load data in YAML or JSON format, respectively, from file The Script object provides a set of convenient functions for recording messages at different severity levels: -* `log_debug(message, object=None)` -* `log_success(message, object=None)` -* `log_info(message, object=None)` -* `log_warning(message, object=None)` -* `log_failure(message, object=None)` +* `log_debug(message, obj=None)` +* `log_success(message, obj=None)` +* `log_info(message, obj=None)` +* `log_warning(message, obj=None)` +* `log_failure(message, obj=None)` Log messages are returned to the user upon execution of the script. Markdown rendering is supported for log messages. A message may optionally be associated with a particular object by passing it as the second argument to the logging method. diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index 0e74c3f0de3..d33743cd4a3 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -505,7 +505,9 @@ def _log(self, message, obj=None, level=LogLevelChoices.LOG_DEFAULT): # Record to the system log if obj: message = f"{obj}: {message}" - self.logger.log(LogLevelChoices.SYSTEM_LEVELS[level], message) + self.logger.log(LogLevelChoices.SYSTEM_LEVELS[level], f"{obj}: {message}") + else: + self.logger.log(LogLevelChoices.SYSTEM_LEVELS[level], message) def log_debug(self, message, obj=None): self._log(message, obj, level=LogLevelChoices.LOG_DEBUG) diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 8c78ad0dec1..2dbf93b2f7b 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -545,6 +545,12 @@ class ScriptResultsTable(BaseTable): template_code="""{% load log_levels %}{% log_level record.status %}""", verbose_name=_('Level') ) + object = tables.Column( + verbose_name=_('Object') + ) + url = tables.Column( + verbose_name=_('URL') + ) message = columns.MarkdownColumn( verbose_name=_('Message') ) @@ -552,6 +558,9 @@ class ScriptResultsTable(BaseTable): class Meta(BaseTable.Meta): empty_text = _(EMPTY_TABLE_TEXT) fields = ( + 'index', 'time', 'status', 'object', 'url', 'message', + ) + default_columns = ( 'index', 'time', 'status', 'message', ) From 422bfdafd6a7795aa9ced5970a038b2208464605 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 23 May 2024 15:05:12 -0700 Subject: [PATCH 2/4] 16149 add (optional) obj hyperlink to script list table --- netbox/extras/scripts.py | 2 ++ netbox/extras/tables/tables.py | 13 +++++++++++++ netbox/extras/views.py | 2 ++ 3 files changed, 17 insertions(+) diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index d33743cd4a3..e836477111e 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -500,6 +500,8 @@ def _log(self, message, obj=None, level=LogLevelChoices.LOG_DEFAULT): 'time': timezone.now().isoformat(), 'status': level, 'message': str(message), + 'obj': str(obj) if obj else None, + 'url': obj.get_absolute_url() if hasattr(obj, 'get_absolute_url') else None, }) # Record to the system log diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 2dbf93b2f7b..c243ac00045 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -1,6 +1,7 @@ import json import django_tables2 as tables +from django.utils.html import format_html from django.utils.translation import gettext_lazy as _ from extras.models import * @@ -564,6 +565,12 @@ class Meta(BaseTable.Meta): 'index', 'time', 'status', 'message', ) + def render_object(self, value, record): + return format_html("{}", record['url'], value) + + def render_url(self, value): + return format_html("{}", value, value) + class ReportResultsTable(BaseTable): index = tables.Column( @@ -594,3 +601,9 @@ class Meta(BaseTable.Meta): fields = ( 'index', 'method', 'time', 'status', 'object', 'url', 'message', ) + + def render_object(self, value, record): + return format_html("{}", record['url'], value) + + def render_url(self, value): + return format_html("{}", value, value) diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 3a82539fb9f..b9fbf6803ad 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1201,6 +1201,8 @@ def get_table(self, job, request, bulk_actions=True): 'time': log.get('time'), 'status': log.get('status'), 'message': log.get('message'), + 'object': log.get('obj'), + 'url': log.get('url'), } data.append(result) From dc337375a5fa4f5342f493ac5bb1f3b13f854351 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 11 Jun 2024 12:01:06 -0700 Subject: [PATCH 3/4] 16149 review feedback --- netbox/extras/tables/tables.py | 2 +- netbox/templates/extras/script_result.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index c243ac00045..4a9d09aa1a2 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -562,7 +562,7 @@ class Meta(BaseTable.Meta): 'index', 'time', 'status', 'object', 'url', 'message', ) default_columns = ( - 'index', 'time', 'status', 'message', + 'index', 'time', 'status', 'object', 'message', ) def render_object(self, value, record): diff --git a/netbox/templates/extras/script_result.html b/netbox/templates/extras/script_result.html index ccc7f4d2351..1b297673b6c 100644 --- a/netbox/templates/extras/script_result.html +++ b/netbox/templates/extras/script_result.html @@ -44,7 +44,7 @@ {# Object table controls #}
- {% if request.user.is_authenticated %} + {% if request.user.is_authenticated and job.completed %}