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.conf import settings
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from django.db import transaction 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.utils.functional import classproperty
from django_rq import job from django_rq import job
from extras.api.serializers import ScriptOutputSerializer from extras.api.serializers import ScriptOutputSerializer
from extras.choices import JobResultStatusChoices, LogLevelChoices from extras.choices import JobResultStatusChoices, LogLevelChoices
from extras.models import JobResult from extras.models import JobResult
from extras.signals import _handle_changed_object, _handle_deleted_object
from ipam.formfields import IPAddressFormField, IPNetworkFormField from ipam.formfields import IPAddressFormField, IPNetworkFormField
from ipam.validators import MaxPrefixLengthValidator, MinPrefixLengthValidator, prefix_validator from ipam.validators import MaxPrefixLengthValidator, MinPrefixLengthValidator, prefix_validator
from utilities.exceptions import AbortTransaction from utilities.exceptions import AbortTransaction
from utilities.forms import DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms import DynamicModelChoiceField, DynamicModelMultipleChoiceField
from utilities.utils import curry
from .forms import ScriptForm from .forms import ScriptForm
__all__ = [ __all__ = [
@ -435,8 +438,19 @@ def run_script(data, request, commit=True, *args, **kwargs):
if 'commit' in inspect.signature(script.run).parameters: if 'commit' in inspect.signature(script.run).parameters:
kwargs['commit'] = commit kwargs['commit'] = commit
else: else:
warnings.warn(f"The run() method of script {script} should support a 'commit' argument. This will be required " warnings.warn(
f"beginning with NetBox v2.10.") 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: try:
with transaction.atomic(): 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}") 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 # Delete any previous terminal state results
JobResult.objects.filter( JobResult.objects.filter(
obj_type=job_result.obj_type, obj_type=job_result.obj_type,

View File

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