diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 9b5c77fcb..f3810e7c5 100644 --- a/netbox/extras/models/models.py +++ b/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. """ - class Meta: managed = False @@ -585,7 +584,6 @@ class Report(models.Model): """ Dummy model used to generate permissions for reports. Does not exist in the database. """ - class Meta: managed = False @@ -606,7 +604,7 @@ class JobResult(models.Model): related_name='job_results', verbose_name='Object types', 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, ) created = models.DateTimeField( diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 9f3715953..cd813d280 100644 --- a/netbox/extras/views.py +++ b/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). """ @@ -362,7 +351,9 @@ class ReportView(GetReportMixin, ContentTypePermissionRequiredMixin, View): 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.result = JobResult.objects.filter( @@ -382,50 +373,48 @@ class ReportView(GetReportMixin, ContentTypePermissionRequiredMixin, View): if not request.user.has_perm('extras.run_report'): 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 if not Worker.count(get_connection('default')): 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. - 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, - }) + 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): return 'extras.view_report' 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') - 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', { 'report': report, - 'result': result, - 'class_name': report.name, - 'run_form': ConfirmationForm(), + 'result': jobresult, }) diff --git a/netbox/templates/extras/report.html b/netbox/templates/extras/report.html index 58bee4059..355c21c00 100644 --- a/netbox/templates/extras/report.html +++ b/netbox/templates/extras/report.html @@ -3,7 +3,7 @@ {% block title %}{{ report.name }}{% endblock %} -{% block content %} +{% block header %}