diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index e2f30e8b0..265cedf69 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -44,9 +44,6 @@ __all__ = ( 'ImageAttachmentSerializer', 'JournalEntrySerializer', 'ObjectChangeSerializer', - 'ReportDetailSerializer', - 'ReportSerializer', - 'ReportInputSerializer', 'SavedFilterSerializer', 'ScriptDetailSerializer', 'ScriptInputSerializer', @@ -510,66 +507,26 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer ] -# -# Reports -# - -class ReportSerializer(serializers.Serializer): - url = serializers.HyperlinkedIdentityField( - view_name='extras-api:report-detail', - lookup_field='full_name', - lookup_url_kwarg='pk' - ) - id = serializers.CharField(read_only=True, source="full_name") - module = serializers.CharField(max_length=255) - name = serializers.CharField(max_length=255) - description = serializers.CharField(max_length=255, required=False) - test_methods = serializers.ListField(child=serializers.CharField(max_length=255), read_only=True) - result = NestedJobSerializer() - display = serializers.SerializerMethodField(read_only=True) - - @extend_schema_field(serializers.CharField()) - def get_display(self, obj): - return f'{obj.name} ({obj.module})' - - -class ReportDetailSerializer(ReportSerializer): - result = JobSerializer() - - -class ReportInputSerializer(serializers.Serializer): - schedule_at = serializers.DateTimeField(required=False, allow_null=True) - interval = serializers.IntegerField(required=False, allow_null=True) - - def validate_schedule_at(self, value): - if value and not self.context['report'].scheduling_enabled: - raise serializers.ValidationError("Scheduling is not enabled for this report.") - return value - - def validate_interval(self, value): - if value and not self.context['report'].scheduling_enabled: - raise serializers.ValidationError("Scheduling is not enabled for this report.") - return value - - # # Scripts # -class ScriptSerializer(serializers.Serializer): - url = serializers.HyperlinkedIdentityField( - view_name='extras-api:script-detail', - lookup_field='full_name', - lookup_url_kwarg='pk' - ) - id = serializers.CharField(read_only=True, source="full_name") - module = serializers.CharField(max_length=255) - name = serializers.CharField(read_only=True) - description = serializers.CharField(read_only=True) - vars = serializers.SerializerMethodField(read_only=True) - result = NestedJobSerializer() +class ScriptSerializer(ValidatedModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail',) + # id = serializers.CharField(read_only=True) + # module = serializers.CharField(max_length=255) + # name = serializers.CharField(read_only=True) + # description = serializers.CharField(read_only=True) + # vars = serializers.SerializerMethodField(read_only=True) + # result = NestedJobSerializer() display = serializers.SerializerMethodField(read_only=True) + class Meta: + model = Script + fields = [ + 'id', 'url', 'module', 'name', 'display', + ] + @extend_schema_field(serializers.JSONField(allow_null=True)) def get_vars(self, instance): return { @@ -593,12 +550,12 @@ class ScriptInputSerializer(serializers.Serializer): def validate_schedule_at(self, value): if value and not self.context['script'].scheduling_enabled: - raise serializers.ValidationError("Scheduling is not enabled for this script.") + raise serializers.ValidationError(_("Scheduling is not enabled for this script.")) return value def validate_interval(self, value): if value and not self.context['script'].scheduling_enabled: - raise serializers.ValidationError("Scheduling is not enabled for this script.") + raise serializers.ValidationError(_("Scheduling is not enabled for this script.")) return value diff --git a/netbox/extras/migrations/0108_script_models.py b/netbox/extras/migrations/0108_script_models.py index 0098c17bf..323c7cbad 100644 --- a/netbox/extras/migrations/0108_script_models.py +++ b/netbox/extras/migrations/0108_script_models.py @@ -35,7 +35,7 @@ class Migration(migrations.Migration): fields=[ ('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.RESTRICT, related_name='scripts', to='extras.scriptmodule')), + ('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scripts', to='extras.scriptmodule')), ], options={ 'ordering': ('name', 'pk'), diff --git a/netbox/extras/models/scripts.py b/netbox/extras/models/scripts.py index b4e7ac4fc..f3a4aff6e 100644 --- a/netbox/extras/models/scripts.py +++ b/netbox/extras/models/scripts.py @@ -29,7 +29,7 @@ class Script(EventRulesMixin, JobsMixin, models.Model): ) module = models.ForeignKey( to='extras.ScriptModule', - on_delete=models.RESTRICT, + on_delete=models.CASCADE, related_name='scripts' ) is_valid = models.BooleanField( diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 2da19c795..ca0a9671a 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1093,7 +1093,7 @@ class ScriptView(BaseScriptView): form = None if self.script_class: - form = script_class.as_form(request.POST, request.FILES) + form = self.script_class.as_form(request.POST, request.FILES) # Allow execution only if RQ worker process is running if not get_workers_for_queue('default'):