1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Implemented run_script() wrapper

This commit is contained in:
Jeremy Stretch
2019-08-12 13:51:25 -04:00
parent 19eb4c510c
commit 3e75da4307
2 changed files with 20 additions and 5 deletions

View File

@ -5,6 +5,7 @@ import pkgutil
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from django.db import transaction
from .constants import LOG_DEFAULT, LOG_FAILURE, LOG_INFO, LOG_SUCCESS, LOG_WARNING from .constants import LOG_DEFAULT, LOG_FAILURE, LOG_INFO, LOG_SUCCESS, LOG_WARNING
from .forms import ScriptForm from .forms import ScriptForm
@ -196,6 +197,23 @@ def is_variable(obj):
return isinstance(obj, ScriptVariable) return isinstance(obj, ScriptVariable)
def run_script(script, data=None):
"""
A wrapper for calling Script.run(). This performs error handling. It exists outside of the Script class to ensure
it cannot be overridden by a script author.
"""
try:
with transaction.atomic():
return script.run(data)
except Exception as e:
script.log_failure(
"An exception occurred: {}".format(e)
)
script.log_info(
"Database changes have been reverted automatically."
)
def get_scripts(): def get_scripts():
scripts = OrderedDict() scripts = OrderedDict()

View File

@ -3,7 +3,6 @@ from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db import transaction
from django.db.models import Count, Q from django.db.models import Count, Q
from django.http import Http404, HttpResponseForbidden from django.http import Http404, HttpResponseForbidden
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
@ -21,7 +20,7 @@ from .forms import (
) )
from .models import ConfigContext, ImageAttachment, ObjectChange, ReportResult, Tag, TaggedItem from .models import ConfigContext, ImageAttachment, ObjectChange, ReportResult, Tag, TaggedItem
from .reports import get_report, get_reports from .reports import get_report, get_reports
from .scripts import get_scripts from .scripts import get_scripts, run_script
from .tables import ConfigContextTable, ObjectChangeTable, TagTable, TaggedItemTable from .tables import ConfigContextTable, ObjectChangeTable, TagTable, TaggedItemTable
@ -405,9 +404,7 @@ class ScriptView(PermissionRequiredMixin, View):
output = None output = None
if form.is_valid(): if form.is_valid():
run_script(script)
with transaction.atomic():
output = script.run(form.cleaned_data)
return render(request, 'extras/script.html', { return render(request, 'extras/script.html', {
'module': module, 'module': module,