From c5d911c48b391f195a938b120109a88a97a29d34 Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 30 Mar 2026 15:20:38 -0700 Subject: [PATCH] Return 400 instead of 500 on duplicate script module upload Catch IntegrityError from the unique (file_root, file_path) constraint and re-raise as a ValidationError so the API returns a 400 with a clear message rather than a 500. Co-Authored-By: Claude Sonnet 4.6 --- netbox/extras/api/serializers_/scripts.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/netbox/extras/api/serializers_/scripts.py b/netbox/extras/api/serializers_/scripts.py index 58f395a70..f4430dad5 100644 --- a/netbox/extras/api/serializers_/scripts.py +++ b/netbox/extras/api/serializers_/scripts.py @@ -1,4 +1,5 @@ from django.core.files.storage import storages +from django.db import IntegrityError from django.utils.translation import gettext_lazy as _ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers @@ -66,7 +67,12 @@ class ScriptModuleSerializer(ValidatedModelSerializer): upload_file = validated_data.pop('upload_file', None) if upload_file: self._save_upload(upload_file, validated_data) - return super().create(validated_data) + try: + return super().create(validated_data) + except IntegrityError: + raise serializers.ValidationError( + _("A script module with this file name already exists.") + ) def update(self, instance, validated_data): upload_file = validated_data.pop('upload_file', None)