diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 50d32c4cf..238037918 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -83,11 +83,8 @@ class EventRuleSerializer(NetBoxModelSerializer): # We need to manually instantiate the serializer for scripts if instance.action_type == EventRuleActionChoices.SCRIPT: script = instance.action_object - script_name = script.name - if script.python_class: - return NestedScriptSerializer(script.python_class(), context=context).data - else: - return NestedScriptSerializer(None, context=context).data + instance = script.python_class() if script.python_class else None + return NestedScriptSerializer(instance, context=context).data else: serializer = get_serializer_for_model( model=instance.action_object_type.model_class(), @@ -525,7 +522,7 @@ class ScriptSerializer(ValidatedModelSerializer): class Meta: model = Script fields = [ - 'id', 'url', 'module', 'name', 'description', 'vars', 'result', 'display', 'is_valid', + 'id', 'url', 'module', 'name', 'description', 'vars', 'result', 'display', 'is_executable', ] @extend_schema_field(serializers.JSONField(allow_null=True)) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 7759631e4..ffac6042a 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -300,7 +300,7 @@ class EventRuleForm(NetBoxModelForm): choices = [] for module in ScriptModule.objects.all(): script_list = [] - for script in module.scripts.all(): + for script in module.scripts.all().prefetch_related('scripts'): name = f"{str(script.pk)}:{script.name}" script_list.append((name, script.name)) if script_list: diff --git a/netbox/extras/migrations/0108_script_models.py b/netbox/extras/migrations/0108_script_models.py index 385745f47..2b0ccb5f2 100644 --- a/netbox/extras/migrations/0108_script_models.py +++ b/netbox/extras/migrations/0108_script_models.py @@ -57,16 +57,12 @@ class Migration(migrations.Migration): ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), ('name', models.CharField(max_length=79)), ('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scripts', to='extras.scriptmodule')), + ('is_executable', models.BooleanField(default=True)) ], options={ - 'ordering': ('name', 'pk'), + 'ordering': ('module', 'name'), }, ), - migrations.AddField( - model_name='script', - name='is_valid', - field=models.BooleanField(default=True), - ), migrations.AddConstraint( model_name='script', constraint=models.UniqueConstraint(fields=('name', 'module'), name='extras_script_unique_name_module'), diff --git a/netbox/extras/models/scripts.py b/netbox/extras/models/scripts.py index 540e01103..804531cf6 100644 --- a/netbox/extras/models/scripts.py +++ b/netbox/extras/models/scripts.py @@ -33,8 +33,9 @@ class Script(EventRulesMixin, JobsMixin, models.Model): on_delete=models.CASCADE, related_name='scripts' ) - is_valid = models.BooleanField( - default=True + is_executable = models.BooleanField( + default=True, + verbose_name=_('is executable') ) events = GenericRelation( 'extras.EventRule', @@ -46,7 +47,7 @@ class Script(EventRulesMixin, JobsMixin, models.Model): return self.name class Meta: - ordering = ('name', 'pk') + ordering = ('module', 'name') constraints = ( models.UniqueConstraint( fields=('name', 'module'), diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index ba7988954..b7da3926e 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -774,7 +774,7 @@ class ScriptTest(APITestCase): Script.objects.create( module=module, name="Test script", - is_valid=True, + is_executable=True, ) def python_class(self): diff --git a/netbox/templates/extras/script/base.html b/netbox/templates/extras/script/base.html index 501daa752..151c3f0ef 100644 --- a/netbox/templates/extras/script/base.html +++ b/netbox/templates/extras/script/base.html @@ -26,10 +26,10 @@ {% block tabs %}