diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index b1a53a886..bb56103ac 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -82,9 +82,9 @@ class EventRuleSerializer(NetBoxModelSerializer): context = {'request': self.context['request']} # We need to manually instantiate the serializer for scripts if instance.action_type == EventRuleActionChoices.SCRIPT: - script_name = instance.action_parameters['script_name'] - script = instance.action_object.scripts[script_name]() - return NestedScriptSerializer(script, context=context).data + script = instance.action_object + script_name = script.name + return NestedScriptSerializer(script.python_class(), context=context).data else: serializer = get_serializer_for_model( model=instance.action_object_type.model_class(), diff --git a/netbox/extras/events.py b/netbox/extras/events.py index c50f4488d..6648a9bee 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -115,15 +115,13 @@ def process_event_rules(event_rules, model_name, event, data, username=None, sna # Scripts elif event_rule.action_type == EventRuleActionChoices.SCRIPT: # Resolve the script from action parameters - script_module = event_rule.action_object - script_name = event_rule.action_parameters['script_name'] - script = script_module.scripts[script_name]() + script = event_rule.action_object.python_class() # Enqueue a Job to record the script's execution Job.enqueue( "extras.scripts.run_script", - instance=script_module, - name=script.class_name, + instance=script.module, + name=script.name, user=user, data=data ) diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index f8d3ffb7f..dfd4133ef 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -212,11 +212,8 @@ class EventRuleImportForm(NetBoxModelImportForm): module, script = get_module_and_script(module_name, script_name) except ObjectDoesNotExist: raise forms.ValidationError(f"Script {action_object} not found") - self.instance.action_object = module - self.instance.action_object_type = ContentType.objects.get_for_model(module, for_concrete_model=False) - self.instance.action_parameters = { - 'script_name': script_name, - } + self.instance.action_object = script + self.instance.action_object_type = ContentType.objects.get_for_model(script, for_concrete_model=False) class TagImportForm(CSVModelForm): diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 067119aa4..7759631e4 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -299,18 +299,17 @@ class EventRuleForm(NetBoxModelForm): def init_script_choice(self): choices = [] for module in ScriptModule.objects.all(): - scripts = [] - for script_name in module.scripts.keys(): - name = f"{str(module.pk)}:{script_name}" - scripts.append((name, script_name)) - if scripts: - choices.append((str(module), scripts)) + script_list = [] + for script in module.scripts.all(): + name = f"{str(script.pk)}:{script.name}" + script_list.append((name, script.name)) + if script_list: + choices.append((str(module), script_list)) self.fields['action_choice'].choices = choices - if self.instance.action_type == EventRuleActionChoices.SCRIPT and self.instance.action_parameters: - scriptmodule_id = self.instance.action_object_id - script_name = self.instance.action_parameters.get('script_name') - self.fields['action_choice'].initial = f'{scriptmodule_id}:{script_name}' + if self.instance.action_type == EventRuleActionChoices.SCRIPT: + script = self.instance.action_object + self.fields['action_choice'].initial = f'{script.id}:{script.name}' def init_webhook_choice(self): initial = None @@ -348,26 +347,14 @@ class EventRuleForm(NetBoxModelForm): # Script elif self.cleaned_data.get('action_type') == EventRuleActionChoices.SCRIPT: self.cleaned_data['action_object_type'] = ContentType.objects.get_for_model( - ScriptModule, + Script, for_concrete_model=False ) - module_id, script_name = action_choice.split(":", maxsplit=1) - self.cleaned_data['action_object_id'] = module_id + script_id, script_name = action_choice.split(":", maxsplit=1) + self.cleaned_data['action_object_id'] = script_id return self.cleaned_data - def save(self, *args, **kwargs): - # Set action_parameters on the instance - if self.cleaned_data['action_type'] == EventRuleActionChoices.SCRIPT: - module_id, script_name = self.cleaned_data.get('action_choice').split(":", maxsplit=1) - self.instance.action_parameters = { - 'script_name': script_name, - } - else: - self.instance.action_parameters = None - - return super().save(*args, **kwargs) - class TagForm(forms.ModelForm): slug = SlugField() diff --git a/netbox/templates/extras/eventrule.html b/netbox/templates/extras/eventrule.html index 5a8aeab72..d3c483819 100644 --- a/netbox/templates/extras/eventrule.html +++ b/netbox/templates/extras/eventrule.html @@ -83,13 +83,7 @@ {% trans "Object" %} - {% if object.action_type == 'script' %} - - {{ object.action_object }} / {{ object.action_parameters.script_name }} - - {% else %} {{ object.action_object|linkify }} - {% endif %}