diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index 360e7d8e5..1ac7fce6c 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -15,5 +15,6 @@ urlpatterns = [ # Reports url(r'^reports/$', views.ReportListView.as_view(), name='report_list'), url(r'^reports/(?P[^/]+\.[^/]+)/$', views.ReportView.as_view(), name='report'), + url(r'^reports/(?P[^/]+\.[^/]+)/run/$', views.ReportRunView.as_view(), name='report_run'), ] diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 42bc10e6d..e92b28187 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1,13 +1,16 @@ from __future__ import unicode_literals from django.contrib.auth.mixins import PermissionRequiredMixin +from django.contrib import messages from django.http import Http404 -from django.shortcuts import get_object_or_404, render +from django.shortcuts import get_object_or_404, redirect, render +from django.utils.safestring import mark_safe from django.views.generic import View +from utilities.forms import ConfirmationForm from utilities.views import ObjectDeleteView, ObjectEditView from .forms import ImageAttachmentForm -from .models import ImageAttachment, ReportResult +from .models import ImageAttachment, ReportResult, UserAction from .reports import get_report, get_reports @@ -84,4 +87,32 @@ class ReportView(View): return render(request, 'extras/report.html', { 'report': report, + 'run_form': ConfirmationForm(), }) + + +class ReportRunView(PermissionRequiredMixin, View): + """ + Run a Report and record a new ReportResult. + """ + permission_required = 'extras.add_reportresult' + + def post(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 + + form = ConfirmationForm(request.POST) + if form.is_valid(): + + # Run the Report. A new ReportResult is created. + report.run() + result = 'failed' if report.failed else 'passed' + msg = "Ran report {} ({})".format(report.full_name, result) + messages.success(request, mark_safe(msg)) + UserAction.objects.log_create(request.user, report.result, msg) + + return redirect('extras:report', name=report.full_name) diff --git a/netbox/templates/extras/report.html b/netbox/templates/extras/report.html index 19cf24257..cb3e716f5 100644 --- a/netbox/templates/extras/report.html +++ b/netbox/templates/extras/report.html @@ -5,16 +5,23 @@ {% block content %}
-
+ -
-
+ {% if perms.extras.add_reportresult %} +
+
+ {% csrf_token %} + {{ run_form }} + +
+
+ {% endif %}

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