diff --git a/netbox/extras/models/scripts.py b/netbox/extras/models/scripts.py
index 1a7559e53..de48aae8e 100644
--- a/netbox/extras/models/scripts.py
+++ b/netbox/extras/models/scripts.py
@@ -1,4 +1,5 @@
import inspect
+import logging
from functools import cached_property
from django.db import models
@@ -16,6 +17,8 @@ __all__ = (
'ScriptModule',
)
+logger = logging.getLogger('netbox.data_backends')
+
class Script(WebhooksMixin, models.Model):
"""
@@ -53,7 +56,12 @@ class ScriptModule(PythonModuleMixin, JobsMixin, ManagedFile):
# For child objects in submodules use the full import path w/o the root module as the name
return cls.full_name.split(".", maxsplit=1)[1]
- module = self.get_module()
+ try:
+ module = self.get_module()
+ except Exception as e:
+ logger.debug(f"Failed to load script: {self.python_name} error: {e}")
+ module = None
+
scripts = {}
ordered = getattr(module, 'script_order', [])
diff --git a/netbox/extras/views.py b/netbox/extras/views.py
index 286ec76cd..c7b7793a0 100644
--- a/netbox/extras/views.py
+++ b/netbox/extras/views.py
@@ -1033,7 +1033,6 @@ class ScriptView(ContentTypePermissionRequiredMixin, View):
return 'extras.view_script'
def get(self, request, module, name):
- print(module)
module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module)
script = module.scripts[name]()
form = script.as_form(initial=normalize_querydict(request.GET))
diff --git a/netbox/templates/extras/script_list.html b/netbox/templates/extras/script_list.html
index bccbce589..9a67e2b10 100644
--- a/netbox/templates/extras/script_list.html
+++ b/netbox/templates/extras/script_list.html
@@ -37,43 +37,49 @@
{% include 'inc/sync_warning.html' with object=module %}
-
-
-
- Name |
- Description |
- Last Run |
- Status |
-
-
-
- {% with jobs=module.get_latest_jobs %}
- {% for script_name, script_class in module.scripts.items %}
-
-
- {{ script_class.name }}
- |
-
- {{ script_class.Meta.description|markdown|placeholder }}
- |
- {% with last_result=jobs|get_key:script_class.name %}
- {% if last_result %}
-
- {{ last_result.created|annotated_date }}
- |
-
- {% badge last_result.get_status_display last_result.get_status_color %}
- |
- {% else %}
- Never |
- {{ ''|placeholder }} |
- {% endif %}
- {% endwith %}
-
- {% endfor %}
- {% endwith %}
-
-
+ {% if not module.scripts %}
+
+ Script file at: {{module.full_path}} could not be loaded.
+
+ {% else %}
+
+
+
+ Name |
+ Description |
+ Last Run |
+ Status |
+
+
+
+ {% with jobs=module.get_latest_jobs %}
+ {% for script_name, script_class in module.scripts.items %}
+
+
+ {{ script_class.name }}
+ |
+
+ {{ script_class.Meta.description|markdown|placeholder }}
+ |
+ {% with last_result=jobs|get_key:script_class.name %}
+ {% if last_result %}
+
+ {{ last_result.created|annotated_date }}
+ |
+
+ {% badge last_result.get_status_display last_result.get_status_color %}
+ |
+ {% else %}
+ Never |
+ {{ ''|placeholder }} |
+ {% endif %}
+ {% endwith %}
+
+ {% endfor %}
+ {% endwith %}
+
+
+ {% endif %}
{% empty %}