Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions docs/customization/custom-scripts.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:

* `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.

Expand Down
2 changes: 2 additions & 0 deletions netbox/extras/scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
21 changes: 20 additions & 1 deletion netbox/extras/tables/tables.py
Original file line number Diff line number Diff line change
@@ -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 *
Expand Down Expand Up @@ -545,16 +546,28 @@ class ScriptResultsTable(BaseTable):
template_code="""{% load log_levels %}{% log_level record.status %}""",
verbose_name=_('Level')
)
object = tables.Column(
verbose_name=_('Object')
)
message = columns.MarkdownColumn(
verbose_name=_('Message')
)

class Meta(BaseTable.Meta):
empty_text = _(EMPTY_TABLE_TEXT)
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):
index = tables.Column(
Expand Down Expand Up @@ -585,3 +598,9 @@ class Meta(BaseTable.Meta):
fields = (
'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 changes: 2 additions & 0 deletions netbox/extras/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion netbox/templates/extras/script_result.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
{# Object table controls #}
<div class="row mb-3">
<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">
<button type="button" data-bs-toggle="modal" title="{% trans "Configure Table" %}" data-bs-target="#ObjectTable_config"
class="btn">
Expand Down