diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index e5fa24553..7af639e49 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -24,6 +24,8 @@ def get_report(module_name, report_name): """ module = importlib.import_module('reports.{}'.format(module_name)) report = getattr(module, report_name, None) + if report is None: + return None return report() diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index 3828d696e..360e7d8e5 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -14,5 +14,6 @@ urlpatterns = [ # Reports url(r'^reports/$', views.ReportListView.as_view(), name='report_list'), + url(r'^reports/(?P[^/]+\.[^/]+)/$', views.ReportView.as_view(), name='report'), ] diff --git a/netbox/extras/views.py b/netbox/extras/views.py index d9549bd19..42bc10e6d 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1,16 +1,14 @@ from __future__ import unicode_literals -from collections import OrderedDict from django.contrib.auth.mixins import PermissionRequiredMixin +from django.http import Http404 from django.shortcuts import get_object_or_404, render -from django.urls import reverse from django.views.generic import View -from . import reports from utilities.views import ObjectDeleteView, ObjectEditView from .forms import ImageAttachmentForm from .models import ImageAttachment, ReportResult -from .reports import get_reports +from .reports import get_report, get_reports # @@ -55,17 +53,35 @@ class ReportListView(View): reports = get_reports() results = {r.report: r for r in ReportResult.objects.all()} - foo = [] + ret = [] for module, report_list in reports: module_reports = [] for report in report_list: - module_reports.append({ - 'name': report.name, - 'description': report.description, - 'results': results.get(report.full_name, None) - }) - foo.append((module, module_reports)) + report.result = results.get(report.full_name, None) + module_reports.append(report) + ret.append((module, module_reports)) return render(request, 'extras/report_list.html', { - 'reports': foo, + 'reports': ret, + }) + + +class ReportView(View): + """ + Display a single Report and its associated ReportResult (if any). + """ + + def get(self, request, name): + + # Retrieve the Report by "." + module_name, report_name = name.split('.') + report = get_report(module_name, report_name) + if report is None: + raise Http404 + + # Attach the ReportResult (if any) + report.result = ReportResult.objects.filter(report=report.full_name).first() + + return render(request, 'extras/report.html', { + 'report': report, }) diff --git a/netbox/templates/extras/inc/report_label.html b/netbox/templates/extras/inc/report_label.html index 8e2a2a5b5..67fc0556b 100644 --- a/netbox/templates/extras/inc/report_label.html +++ b/netbox/templates/extras/inc/report_label.html @@ -1,6 +1,6 @@ -{% if report.results.failed %} +{% if report.result.failed %} -{% elif report.results %} +{% elif report.result %} {% else %} diff --git a/netbox/templates/extras/report.html b/netbox/templates/extras/report.html new file mode 100644 index 000000000..19cf24257 --- /dev/null +++ b/netbox/templates/extras/report.html @@ -0,0 +1,31 @@ +{% extends '_base.html' %} +{% load helpers %} + +{% block title %}{{ report.name }}{% endblock %} + +{% block content %} +
+
+ +
+
+
+
+

{{ report.name }}{% include 'extras/inc/report_label.html' %}

+
+
+ {% if report.description %} +

{{ report.description }}

+ {% endif %} + {% if report.result %} +

Last run: {{ report.result.created }}

+ {% else %} +

Last run: Never

+ {% endif %} +
+
+{% endblock %} diff --git a/netbox/templates/extras/report_list.html b/netbox/templates/extras/report_list.html index 947e22fb5..251394f33 100644 --- a/netbox/templates/extras/report_list.html +++ b/netbox/templates/extras/report_list.html @@ -20,20 +20,19 @@ {% for report in module_reports %} - - {{ report.name }} + {{ report.name }} {% include 'extras/inc/report_label.html' %} {{ report.description|default:"" }} - {% if report.results %} - {{ report.results.created }} + {% if report.result %} + {{ report.result.created }} {% else %} Never {% endif %} - {% for method, stats in report.results.data.items %} + {% for method, stats in report.result.data.items %} {{ method }}