Procházet zdrojové kódy

16149 add (optional) obj hyperlink to script list table (#16271)

* 16149 add (optional) obj hyperlink to script list table

* 16149 add (optional) obj hyperlink to script list table

* 16149 review feedback

* 16149 review changes
Arthur Hanson před 1 rokem
rodič
revize
85fd232614

+ 5 - 5
docs/customization/custom-scripts.md

@@ -138,11 +138,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:
 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.
 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.
 
 

+ 2 - 0
netbox/extras/scripts.py

@@ -500,6 +500,8 @@ class BaseScript:
                 'time': timezone.now().isoformat(),
                 'time': timezone.now().isoformat(),
                 'status': level,
                 'status': level,
                 'message': str(message),
                 '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
             # Record to the system log

+ 20 - 1
netbox/extras/tables/tables.py

@@ -1,6 +1,7 @@
 import json
 import json
 
 
 import django_tables2 as tables
 import django_tables2 as tables
+from django.utils.html import format_html
 from django.utils.translation import gettext_lazy as _
 from django.utils.translation import gettext_lazy as _
 
 
 from extras.models import *
 from extras.models import *
@@ -545,6 +546,9 @@ class ScriptResultsTable(BaseTable):
         template_code="""{% load log_levels %}{% log_level record.status %}""",
         template_code="""{% load log_levels %}{% log_level record.status %}""",
         verbose_name=_('Level')
         verbose_name=_('Level')
     )
     )
+    object = tables.Column(
+        verbose_name=_('Object')
+    )
     message = columns.MarkdownColumn(
     message = columns.MarkdownColumn(
         verbose_name=_('Message')
         verbose_name=_('Message')
     )
     )
@@ -552,9 +556,18 @@ class ScriptResultsTable(BaseTable):
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         empty_text = _(EMPTY_TABLE_TEXT)
         empty_text = _(EMPTY_TABLE_TEXT)
         fields = (
         fields = (
-            'index', 'time', 'status', 'message',
+            'index', 'time', 'status', 'object', 'message',
+        )
+        default_columns = (
+            'index', 'time', 'status', 'object', 'message',
         )
         )
 
 
+    def render_object(self, value, record):
+        return format_html("<a href='{}'>{}</a>", record['url'], value)
+
+    def render_url(self, value):
+        return format_html("<a href='{}'>{}</a>", value, value)
+
 
 
 class ReportResultsTable(BaseTable):
 class ReportResultsTable(BaseTable):
     index = tables.Column(
     index = tables.Column(
@@ -585,3 +598,9 @@ class ReportResultsTable(BaseTable):
         fields = (
         fields = (
             'index', 'method', 'time', 'status', 'object', 'url', 'message',
             'index', 'method', 'time', 'status', 'object', 'url', 'message',
         )
         )
+
+    def render_object(self, value, record):
+        return format_html("<a href='{}'>{}</a>", record['url'], value)
+
+    def render_url(self, value):
+        return format_html("<a href='{}'>{}</a>", value, value)

+ 2 - 0
netbox/extras/views.py

@@ -1201,6 +1201,8 @@ class ScriptResultView(TableMixin, generic.ObjectView):
                         'time': log.get('time'),
                         'time': log.get('time'),
                         'status': log.get('status'),
                         'status': log.get('status'),
                         'message': log.get('message'),
                         'message': log.get('message'),
+                        'object': log.get('obj'),
+                        'url': log.get('url'),
                     }
                     }
                     data.append(result)
                     data.append(result)
 
 

+ 1 - 1
netbox/templates/extras/script_result.html

@@ -44,7 +44,7 @@
       {# Object table controls #}
       {# Object table controls #}
       <div class="row mb-3">
       <div class="row mb-3">
         <div class="col-auto ms-auto d-print-none">
         <div class="col-auto ms-auto d-print-none">
-          {% if request.user.is_authenticated %}
+          {% if request.user.is_authenticated and job.completed %}
             <div class="table-configure input-group">
             <div class="table-configure input-group">
               <button type="button" data-bs-toggle="modal" title="{% trans "Configure Table" %}" data-bs-target="#ObjectTable_config"
               <button type="button" data-bs-toggle="modal" title="{% trans "Configure Table" %}" data-bs-target="#ObjectTable_config"
                 class="btn">
                 class="btn">