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

Attach object modification signals before running a custom script

This commit is contained in:
Jeremy Stretch
2020-08-17 13:43:48 -04:00
parent ff5a3c1055
commit 81c72739b5
2 changed files with 23 additions and 3 deletions

View File

@ -12,16 +12,19 @@ from django import forms
from django.conf import settings
from django.core.validators import RegexValidator
from django.db import transaction
from django.db.models.signals import m2m_changed, pre_delete, post_save
from django.utils.functional import classproperty
from django_rq import job
from extras.api.serializers import ScriptOutputSerializer
from extras.choices import JobResultStatusChoices, LogLevelChoices
from extras.models import JobResult
from extras.signals import _handle_changed_object, _handle_deleted_object
from ipam.formfields import IPAddressFormField, IPNetworkFormField
from ipam.validators import MaxPrefixLengthValidator, MinPrefixLengthValidator, prefix_validator
from utilities.exceptions import AbortTransaction
from utilities.forms import DynamicModelChoiceField, DynamicModelMultipleChoiceField
from utilities.utils import curry
from .forms import ScriptForm
__all__ = [
@ -435,8 +438,19 @@ def run_script(data, request, commit=True, *args, **kwargs):
if 'commit' in inspect.signature(script.run).parameters:
kwargs['commit'] = commit
else:
warnings.warn(f"The run() method of script {script} should support a 'commit' argument. This will be required "
f"beginning with NetBox v2.10.")
warnings.warn(
f"The run() method of script {script} should support a 'commit' argument. This will be required beginning "
f"with NetBox v2.10."
)
# Curry changelog signal receivers to pass the current request
handle_changed_object = curry(_handle_changed_object, request)
handle_deleted_object = curry(_handle_deleted_object, request)
# Connect object modification signals to their respective receivers
post_save.connect(handle_changed_object)
m2m_changed.connect(handle_changed_object)
pre_delete.connect(handle_deleted_object)
try:
with transaction.atomic():
@ -470,6 +484,11 @@ def run_script(data, request, commit=True, *args, **kwargs):
logger.info(f"Script completed in {job_result.duration}")
# Disconnect signals
post_save.disconnect(handle_changed_object)
m2m_changed.disconnect(handle_changed_object)
pre_delete.disconnect(handle_deleted_object)
# Delete any previous terminal state results
JobResult.objects.filter(
obj_type=job_result.obj_type,

View File

@ -312,5 +312,6 @@ def copy_safe_request(request):
'GET': request.GET,
'FILES': request.FILES,
'user': request.user,
'path': request.path
'path': request.path,
'id': getattr(request, 'id', None), # UUID assigned by middleware
})