#2006: Clean up report views

This commit is contained in:
Jeremy Stretch 2020-08-10 15:56:55 -04:00
parent 365b6f5e17
commit 93da6b6edf
5 changed files with 66 additions and 76 deletions

View File

@ -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(

View File

@ -342,18 +342,7 @@ class ReportListView(ContentTypePermissionRequiredMixin, View):
}) })
class GetReportMixin: class ReportView(ContentTypePermissionRequiredMixin, View):
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):
""" """
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) report = get_report(module, name)
form = ConfirmationForm(request.POST) 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
)
# Run the Report. A new JobResult is created. return redirect('extras:report_result', job_result_pk=job_result.pk)
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,
})
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: jobresult = get_object_or_404(JobResult.objects.all(), pk=job_result_pk, obj_type=report_content_type)
raise Http404
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, 'result': jobresult,
'class_name': report.name,
'run_form': ConfirmationForm(),
}) })

View File

@ -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">
<button type="submit" name="_run" class="btn btn-primary"><i class="fa fa-play"></i> Run Report</button> {% 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>

View File

@ -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">

View File

@ -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 %}