diff --git a/netbox/extras/models/reports.py b/netbox/extras/models/reports.py
index aaa785696..f1e336df5 100644
--- a/netbox/extras/models/reports.py
+++ b/netbox/extras/models/reports.py
@@ -1,7 +1,7 @@
import inspect
+import logging
from functools import cached_property
-from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
from django.urls import reverse
@@ -12,6 +12,8 @@ from netbox.models.features import JobsMixin, WebhooksMixin
from utilities.querysets import RestrictedQuerySet
from .mixins import PythonModuleMixin
+logger = logging.getLogger('netbox.reports')
+
__all__ = (
'Report',
'ReportModule',
@@ -56,7 +58,8 @@ class ReportModule(PythonModuleMixin, JobsMixin, ManagedFile):
try:
module = self.get_module()
- except ImportError:
+ except (ImportError, SyntaxError) as e:
+ logger.error(f"Unable to load report module {self.name}, exception: {e}")
return {}
reports = {}
ordered = getattr(module, 'report_order', [])
diff --git a/netbox/templates/extras/report_list.html b/netbox/templates/extras/report_list.html
index 0c27eefda..7867fdbbe 100644
--- a/netbox/templates/extras/report_list.html
+++ b/netbox/templates/extras/report_list.html
@@ -38,71 +38,77 @@
{% include 'inc/sync_warning.html' with object=module %}
-
-
-
- Name |
- Description |
- Last Run |
- Status |
- |
-
-
-
- {% with jobs=module.get_latest_jobs %}
- {% for report_name, report in module.reports.items %}
- {% with last_job=jobs|get_key:report.name %}
-
-
- {{ report.name }}
- |
- {{ report.description|markdown|placeholder }} |
- {% if last_job %}
-
- {{ last_job.created|annotated_date }}
- |
-
- {% badge last_job.get_status_display last_job.get_status_color %}
- |
- {% else %}
- Never |
- {{ ''|placeholder }} |
- {% endif %}
-
- {% if perms.extras.run_report %}
-
-
-
- {% endif %}
- |
-
- {% for method, stats in last_job.data.items %}
+ {% if module.reports %}
+
+
+
+ Name |
+ Description |
+ Last Run |
+ Status |
+ |
+
+
+
+ {% with jobs=module.get_latest_jobs %}
+ {% for report_name, report in module.reports.items %}
+ {% with last_job=jobs|get_key:report.name %}
-
- {{ method }}
+ |
+ {{ report.name }}
|
-
- {{ stats.success }}
- {{ stats.info }}
- {{ stats.warning }}
- {{ stats.failure }}
+ | {{ report.description|markdown|placeholder }} |
+ {% if last_job %}
+
+ {{ last_job.created|annotated_date }}
+ |
+
+ {% badge last_job.get_status_display last_job.get_status_color %}
+ |
+ {% else %}
+ Never |
+ {{ ''|placeholder }} |
+ {% endif %}
+
+ {% if perms.extras.run_report %}
+
+
+
+ {% endif %}
|
- {% endfor %}
- {% endwith %}
- {% endfor %}
- {% endwith %}
-
-
+ {% for method, stats in last_job.data.items %}
+
+
+ {{ method }}
+ |
+
+ {{ stats.success }}
+ {{ stats.info }}
+ {{ stats.warning }}
+ {{ stats.failure }}
+ |
+
+ {% endfor %}
+ {% endwith %}
+ {% endfor %}
+ {% endwith %}
+
+
+ {% else %}
+
+ Could not load reports from {{ module.name }}
+
+ {% endif %}
{% empty %}