Jeremy Stretch 5 лет назад
Родитель
Сommit
93da6b6edf

+ 1 - 3
netbox/extras/models/models.py

@@ -571,7 +571,6 @@ class Script(models.Model):
     """
     """
     Dummy model used to generate permissions for custom scripts. Does not exist in the database.
     Dummy model used to generate permissions for custom scripts. Does not exist in the database.
     """
     """
-
     class Meta:
     class Meta:
         managed = False
         managed = False
 
 
@@ -585,7 +584,6 @@ class Report(models.Model):
     """
     """
     Dummy model used to generate permissions for reports. Does not exist in the database.
     Dummy model used to generate permissions for reports. Does not exist in the database.
     """
     """
-
     class Meta:
     class Meta:
         managed = False
         managed = False
 
 
@@ -606,7 +604,7 @@ class JobResult(models.Model):
         related_name='job_results',
         related_name='job_results',
         verbose_name='Object types',
         verbose_name='Object types',
         limit_choices_to=FeatureQuery('job_results'),
         limit_choices_to=FeatureQuery('job_results'),
-        help_text="The object type to which this job result applies.",
+        help_text="The object type to which this job result applies",
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
     )
     )
     created = models.DateTimeField(
     created = models.DateTimeField(

+ 29 - 40
netbox/extras/views.py

@@ -342,18 +342,7 @@ class ReportListView(ContentTypePermissionRequiredMixin, View):
         })
         })
 
 
 
 
-class GetReportMixin:
-    def _get_report(self, name, module=None):
-        if module is None:
-            module, name = name.split('.', 1)
-        report = get_report(module, name)
-        if report is None:
-            raise Http404
-
-        return report
-
-
-class ReportView(GetReportMixin, ContentTypePermissionRequiredMixin, View):
+class ReportView(ContentTypePermissionRequiredMixin, View):
     """
     """
     Display a single Report and its associated JobResult (if any).
     Display a single Report and its associated JobResult (if any).
     """
     """
@@ -362,7 +351,9 @@ class ReportView(GetReportMixin, ContentTypePermissionRequiredMixin, View):
 
 
     def get(self, request, module, name):
     def get(self, request, module, name):
 
 
-        report = self._get_report(name, module)
+        report = get_report(module, name)
+        if report is None:
+            raise Http404
 
 
         report_content_type = ContentType.objects.get(app_label='extras', model='report')
         report_content_type = ContentType.objects.get(app_label='extras', model='report')
         report.result = JobResult.objects.filter(
         report.result = JobResult.objects.filter(
@@ -382,50 +373,48 @@ class ReportView(GetReportMixin, ContentTypePermissionRequiredMixin, View):
         if not request.user.has_perm('extras.run_report'):
         if not request.user.has_perm('extras.run_report'):
             return HttpResponseForbidden()
             return HttpResponseForbidden()
 
 
-        report = self._get_report(name, module)
-        form = ConfirmationForm(request.POST)
+        report = get_report(module, name)
+        if report is None:
+            raise Http404
 
 
         # Allow execution only if RQ worker process is running
         # Allow execution only if RQ worker process is running
         if not Worker.count(get_connection('default')):
         if not Worker.count(get_connection('default')):
             messages.error(request, "Unable to run report: RQ worker process not running.")
             messages.error(request, "Unable to run report: RQ worker process not running.")
+            return render(request, 'extras/report.html', {
+                'report': report,
+            })
 
 
-        elif form.is_valid():
-
-            # Run the Report. A new JobResult is created.
-            report_content_type = ContentType.objects.get(app_label='extras', model='report')
-            job_result = JobResult.enqueue_job(
-                run_report,
-                report.full_name,
-                report_content_type,
-                request.user
-            )
-
-            return redirect('extras:report_result', job_result_pk=job_result.pk)
-
-        return render(request, 'extras/report.html', {
-            'report': report,
-            'run_form': form,
-        })
+        # Run the Report. A new JobResult is created.
+        report_content_type = ContentType.objects.get(app_label='extras', model='report')
+        job_result = JobResult.enqueue_job(
+            run_report,
+            report.full_name,
+            report_content_type,
+            request.user
+        )
 
 
+        return redirect('extras:report_result', job_result_pk=job_result.pk)
 
 
-class ReportResultView(ContentTypePermissionRequiredMixin, GetReportMixin, View):
 
 
+class ReportResultView(ContentTypePermissionRequiredMixin, View):
+    """
+    Display a JobResult pertaining to the execution of a Report.
+    """
     def get_required_permission(self):
     def get_required_permission(self):
         return 'extras.view_report'
         return 'extras.view_report'
 
 
     def get(self, request, job_result_pk):
     def get(self, request, job_result_pk):
-        result = get_object_or_404(JobResult.objects.all(), pk=job_result_pk)
         report_content_type = ContentType.objects.get(app_label='extras', model='report')
         report_content_type = ContentType.objects.get(app_label='extras', model='report')
-        if result.obj_type != report_content_type:
-            raise Http404
+        jobresult = get_object_or_404(JobResult.objects.all(), pk=job_result_pk, obj_type=report_content_type)
 
 
-        report = self._get_report(result.name)
+        # Retrieve the Report and attach the JobResult to it
+        module, report_name = jobresult.name.split('.')
+        report = get_report(module, report_name)
+        report.result = jobresult
 
 
         return render(request, 'extras/report_result.html', {
         return render(request, 'extras/report_result.html', {
             'report': report,
             'report': report,
-            'result': result,
-            'class_name': report.name,
-            'run_form': ConfirmationForm(),
+            'result': jobresult,
         })
         })
 
 
 
 

+ 16 - 8
netbox/templates/extras/report.html

@@ -3,7 +3,7 @@
 
 
 {% block title %}{{ report.name }}{% endblock %}
 {% block title %}{{ report.name }}{% endblock %}
 
 
-{% block content %}
+{% block header %}
     <div class="row noprint">
     <div class="row noprint">
         <div class="col-md-12">
         <div class="col-md-12">
             <ol class="breadcrumb">
             <ol class="breadcrumb">
@@ -17,21 +17,29 @@
         <div class="pull-right noprint">
         <div class="pull-right noprint">
             <form action="{% url 'extras:report' module=report.module name=report.class_name %}" method="post">
             <form action="{% url 'extras:report' module=report.module name=report.class_name %}" method="post">
                 {% csrf_token %}
                 {% csrf_token %}
-                {{ run_form }}
-                <button type="submit" name="_run" class="btn btn-primary"><i class="fa fa-play"></i> Run Report</button>
+                <button type="submit" name="_run" class="btn btn-primary">
+                    {% if report.result %}
+                        <i class="fa fa-refresh"></i> Run Again
+                    {% else %}
+                        <i class="fa fa-play"></i> Run Report
+                    {% endif %}
+                </button>
             </form>
             </form>
         </div>
         </div>
     {% endif %}
     {% endif %}
     <h1>{{ report.name }}</h1>
     <h1>{{ report.name }}</h1>
+    {% if report.description %}
+        <p class="lead">{{ report.description }}</p>
+    {% endif %}
+{% endblock %}
+
+{% block content %}
     <div class="row">
     <div class="row">
         <div class="col-md-12">
         <div class="col-md-12">
-            {% if report.description %}
-                <p class="lead">{{ report.description }}</p>
-            {% endif %}
             {% if report.result %}
             {% if report.result %}
-                <p>Last run: <a href="{% url 'extras:report_result' job_result_pk=report.result.pk %}">
+                Last run: <a href="{% url 'extras:report_result' job_result_pk=report.result.pk %}">
                     <strong>{{ report.result.created }}</strong>
                     <strong>{{ report.result.created }}</strong>
-                </a></p>
+                </a>
             {% endif %}
             {% endif %}
         </div>
         </div>
     </div>
     </div>

+ 18 - 1
netbox/templates/extras/report_list.html

@@ -15,6 +15,7 @@
                                 <th>Status</th>
                                 <th>Status</th>
                                 <th>Description</th>
                                 <th>Description</th>
                                 <th class="text-right">Last Run</th>
                                 <th class="text-right">Last Run</th>
+                                <th></th>
                             </tr>
                             </tr>
                         </thead>
                         </thead>
                         <tbody>
                         <tbody>
@@ -36,10 +37,26 @@
                                             <span class="text-muted">Never</span>
                                             <span class="text-muted">Never</span>
                                         {% endif %}
                                         {% endif %}
                                     </td>
                                     </td>
+                                <td>
+                                    {% if perms.extras.run_report %}
+                                        <div class="pull-right noprint">
+                                            <form action="{% url 'extras:report' module=report.module name=report.class_name %}" method="post">
+                                                {% csrf_token %}
+                                                <button type="submit" name="_run" class="btn btn-primary btn-xs">
+                                                    {% if report.result %}
+                                                        <i class="fa fa-refresh"></i> Run Again
+                                                    {% else %}
+                                                        <i class="fa fa-play"></i> Run Report
+                                                    {% endif %}
+                                                </button>
+                                            </form>
+                                        </div>
+                                    {% endif %}
+                                </td>
                                 </tr>
                                 </tr>
                                 {% for method, stats in report.result.data.items %}
                                 {% for method, stats in report.result.data.items %}
                                     <tr>
                                     <tr>
-                                        <td colspan="3" class="method">
+                                        <td colspan="4" class="method">
                                             {{ method }}
                                             {{ method }}
                                         </td>
                                         </td>
                                         <td class="text-right text-nowrap report-stats">
                                         <td class="text-right text-nowrap report-stats">

+ 2 - 24
netbox/templates/extras/report_result.html

@@ -1,34 +1,12 @@
-{% extends 'base.html' %}
+{% extends 'extras/report.html' %}
 {% load helpers %}
 {% load helpers %}
 {% load static %}
 {% load static %}
 
 
-{% block title %}{{ report.name }}{% endblock %}
+{% block title %}{{ report.name }} - {{ result.get_status_display }}{% endblock %}
 
 
 {% block content %}
 {% block content %}
-    <div class="row noprint">
-        <div class="col-md-12">
-            <ol class="breadcrumb">
-                <li><a href="{% url 'extras:report_list' %}">Reports</a></li>
-                <li><a href="{% url 'extras:report_list' %}#module.{{ report.module }}">{{ report.module|bettertitle }}</a></li>
-                <li>{{ report.name }}</li>
-            </ol>
-        </div>
-    </div>
-    {% if perms.extras.run_report %}
-        <div class="pull-right noprint">
-            <form action="{% url 'extras:report' module=report.module name=report.name %}" method="post">
-                {% csrf_token %}
-                {{ run_form }}
-                <button type="submit" name="_run" class="btn btn-primary"><i class="fa fa-play"></i> Run Report</button>
-            </form>
-        </div>
-    {% endif %}
-    <h1>{{ report.name }}</h1>
     <div class="row">
     <div class="row">
         <div class="col-md-12">
         <div class="col-md-12">
-            {% if report.description %}
-                <p class="lead">{{ report.description }}</p>
-            {% endif %}
             <p>
             <p>
                 Run: <strong>{{ result.created }}</strong>
                 Run: <strong>{{ result.created }}</strong>
                 {% if result.completed %}
                 {% if result.completed %}