From 7ee80a2770b2bcfbae18ef90e27e0cd1e2b9da2f Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 29 Mar 2023 10:38:55 -0400 Subject: [PATCH] Closes #12085: Add ReportSourceView --- 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 ++++++ 5 files changed, 35 insertions(+) create mode 100644 netbox/templates/extras/report/source.html diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index ed886f425d4..c7de9fd6a92 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 @@ def name(self): """ 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 400596c4075..f1a547f15f5 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -98,6 +98,7 @@ 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 bbc00d04522..ae3025c989d 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -887,6 +887,22 @@ def post(self, request, module, name): }) +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=f'{module}.py') + 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 218384f559a..8e9182bddd6 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 00000000000..2914f093d0c --- /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 %}