From c4891fe105705c59dce40d3da953782d7b3289c4 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 29 Mar 2023 16:58:35 -0400 Subject: [PATCH] Closes #12085: Add a file source view for reports --- docs/release-notes/version-3.5.md | 1 + netbox/extras/reports.py | 9 +++++++++ netbox/extras/urls.py | 1 + netbox/extras/views.py | 16 ++++++++++++++++ netbox/templates/extras/report/base.html | 3 +++ netbox/templates/extras/report/source.html | 6 ++++++ 6 files changed, 36 insertions(+) create mode 100644 netbox/templates/extras/report/source.html diff --git a/docs/release-notes/version-3.5.md b/docs/release-notes/version-3.5.md index 3ea8380de..856e53f3b 100644 --- a/docs/release-notes/version-3.5.md +++ b/docs/release-notes/version-3.5.md @@ -59,6 +59,7 @@ Two new webhook trigger events have been introduced: `job_start` and `job_end`. * [#11693](https://github.com/netbox-community/netbox/issues/11693) - Enable syncing export template content from remote sources * [#11780](https://github.com/netbox-community/netbox/issues/11780) - Enable loading import data from remote sources * [#11968](https://github.com/netbox-community/netbox/issues/11968) - Add navigation menu buttons to create device & VM components +* [#12085](https://github.com/netbox-community/netbox/issues/12085) - Add a file source view for reports ### Other Changes diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index ed886f425..c7de9fd6a 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -1,3 +1,4 @@ +import inspect import logging import traceback from datetime import timedelta @@ -127,6 +128,14 @@ class Report(object): """ return self.class_name + @property + def filename(self): + return inspect.getfile(self.__class__) + + @property + def source(self): + return inspect.getsource(self.__class__) + # # Logging methods # diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index a562f5a8e..482e0a554 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -98,6 +98,7 @@ urlpatterns = [ path('reports/results//', views.ReportResultView.as_view(), name='report_result'), path('reports//', include(get_model_urls('extras', 'reportmodule'))), path('reports///', views.ReportView.as_view(), name='report'), + path('reports///source/', views.ReportSourceView.as_view(), name='report_source'), path('reports///jobs/', views.ReportJobsView.as_view(), name='report_jobs'), # Scripts diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 22984e9ab..335d98db0 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -887,6 +887,22 @@ class ReportView(ContentTypePermissionRequiredMixin, View): }) +class ReportSourceView(ContentTypePermissionRequiredMixin, View): + + def get_required_permission(self): + return 'extras.view_report' + + def get(self, request, module, name): + module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module) + report = module.reports[name]() + + return render(request, 'extras/report/source.html', { + 'module': module, + 'report': report, + 'tab': 'source', + }) + + class ReportJobsView(ContentTypePermissionRequiredMixin, View): def get_required_permission(self): diff --git a/netbox/templates/extras/report/base.html b/netbox/templates/extras/report/base.html index 218384f55..8e9182bdd 100644 --- a/netbox/templates/extras/report/base.html +++ b/netbox/templates/extras/report/base.html @@ -28,6 +28,9 @@ + diff --git a/netbox/templates/extras/report/source.html b/netbox/templates/extras/report/source.html new file mode 100644 index 000000000..2914f093d --- /dev/null +++ b/netbox/templates/extras/report/source.html @@ -0,0 +1,6 @@ +{% extends 'extras/report/base.html' %} + +{% block content %} + {{ report.filename }} +
{{ report.source }}
+{% endblock %}