From a2086e799587ebf95262b16bddcac76f401d2d88 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Wed, 17 Jan 2024 23:56:42 -0600 Subject: [PATCH] Move function to method on PythonModuleMixin --- netbox/extras/models/mixins.py | 5 +++ netbox/extras/views.py | 52 ++++++++++-------------- netbox/templates/extras/report/base.html | 2 +- netbox/templates/extras/script/base.html | 2 +- 4 files changed, 28 insertions(+), 33 deletions(-) diff --git a/netbox/extras/models/mixins.py b/netbox/extras/models/mixins.py index cb1d31837..b391cdffc 100644 --- a/netbox/extras/models/mixins.py +++ b/netbox/extras/models/mixins.py @@ -8,6 +8,11 @@ __all__ = ( class PythonModuleMixin: + def get_jobs(self, name): + return self.jobs.filter( + name=name + ) + @property def path(self): return os.path.splitext(self.file_path)[0] diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 8b4467f19..25492b6c8 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1007,23 +1007,6 @@ class DashboardWidgetDeleteView(LoginRequiredMixin, View): return redirect(reverse('home')) -# -# Function for returning job data - used in scripts and reports -# - -# Return jobs filtered for job model type (Example: `scriptmodule`) -def get_jobs(module, job_object, jobtype): - # Check if it is a supported module. Return an empty queryset if not - object_type = ContentType.objects.get(app_label='extras', model=jobtype) - jobs = Job.objects.filter( - object_type=object_type, - object_id=module.pk, - name=job_object.class_name, - ) - - return jobs - - # # Reports # @@ -1074,12 +1057,14 @@ class ReportView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_report_module(module, request) report = module.reports[name]() - jobs = get_jobs(module, report, 'reportmodule') + jobs = module.get_jobs(name) - report.result = jobs.first() + report.result = jobs.exclude( + status__in=JobStatusChoices.TERMINAL_STATE_CHOICES + ).first() return render(request, 'extras/report.html', { - 'jobs': jobs, + 'job_count': jobs.count(), 'module': module, 'report': report, 'form': ReportForm(scheduling_enabled=report.scheduling_enabled), @@ -1091,6 +1076,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): module = get_report_module(module, request) report = module.reports[name]() + jobs = module.get_jobs(name) form = ReportForm(request.POST, scheduling_enabled=report.scheduling_enabled) if form.is_valid(): @@ -1099,6 +1085,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): if not get_workers_for_queue('default'): messages.error(request, "Unable to run report: RQ worker process not running.") return render(request, 'extras/report.html', { + 'job_count': jobs.count(), 'report': report, }) @@ -1116,7 +1103,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): return redirect('extras:report_result', job_pk=job.pk) return render(request, 'extras/report.html', { - 'jobs': get_jobs(module, report, 'reportmodule'), + 'job_count': jobs.count(), 'module': module, 'report': report, 'form': form, @@ -1131,9 +1118,10 @@ class ReportSourceView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_report_module(module, request) report = module.reports[name]() + jobs = module.get_jobs(name) return render(request, 'extras/report/source.html', { - 'jobs': get_jobs(module, report, 'reportmodule'), + 'job_count': jobs.count(), 'module': module, 'report': report, 'tab': 'source', @@ -1148,9 +1136,9 @@ class ReportJobsView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_report_module(module, request) report = module.reports[name]() + jobs = module.get_jobs(name) object_type = ContentType.objects.get(app_label='extras', model='reportmodule') - jobs = get_jobs(module, report, 'reportmodule') jobs_table = JobTable( data=jobs, @@ -1160,7 +1148,7 @@ class ReportJobsView(ContentTypePermissionRequiredMixin, View): jobs_table.configure(request) return render(request, 'extras/report/jobs.html', { - 'jobs': jobs, + 'job_count': jobs.count(), 'module': module, 'report': report, 'table': jobs_table, @@ -1244,16 +1232,16 @@ class ScriptView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_script_module(module, request) script = module.scripts[name]() + jobs = module.get_jobs(name) form = script.as_form(initial=normalize_querydict(request.GET)) - jobs = get_jobs(module, script, 'scriptmodule') # Look for a pending Job (use the latest one by creation timestamp) - script.result = jobs.exclude( + script.result = module.get_jobs(name).exclude( status__in=JobStatusChoices.TERMINAL_STATE_CHOICES ).first() return render(request, 'extras/script.html', { - 'jobs': jobs, + 'job_count': jobs.count(), 'module': module, 'script': script, 'form': form, @@ -1265,6 +1253,7 @@ class ScriptView(ContentTypePermissionRequiredMixin, View): module = get_script_module(module, request) script = module.scripts[name]() + jobs = module.get_jobs(name) form = script.as_form(request.POST, request.FILES) # Allow execution only if RQ worker process is running @@ -1288,7 +1277,7 @@ class ScriptView(ContentTypePermissionRequiredMixin, View): return redirect('extras:script_result', job_pk=job.pk) return render(request, 'extras/script.html', { - 'jobs': get_jobs(module, script, 'scriptmodule'), + 'job_count': jobs.count(), 'module': module, 'script': script, 'form': form, @@ -1303,9 +1292,10 @@ class ScriptSourceView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_script_module(module, request) script = module.scripts[name]() + jobs = module.get_jobs(name) return render(request, 'extras/script/source.html', { - 'jobs': get_jobs(module, script, 'scriptmodule'), + 'job_count': jobs.count(), 'module': module, 'script': script, 'tab': 'source', @@ -1320,7 +1310,7 @@ class ScriptJobsView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_script_module(module, request) script = module.scripts[name]() - jobs = get_jobs(module, script, 'scriptmodule') + jobs = module.get_jobs(name) jobs_table = JobTable( data=jobs, @@ -1330,7 +1320,7 @@ class ScriptJobsView(ContentTypePermissionRequiredMixin, View): jobs_table.configure(request) return render(request, 'extras/script/jobs.html', { - 'jobs': jobs, + 'job_count': jobs.count(), 'module': module, 'script': script, 'table': jobs_table, diff --git a/netbox/templates/extras/report/base.html b/netbox/templates/extras/report/base.html index eaa980484..0bf953ce1 100644 --- a/netbox/templates/extras/report/base.html +++ b/netbox/templates/extras/report/base.html @@ -34,7 +34,7 @@ diff --git a/netbox/templates/extras/script/base.html b/netbox/templates/extras/script/base.html index 94f07fe94..624a3d1d4 100644 --- a/netbox/templates/extras/script/base.html +++ b/netbox/templates/extras/script/base.html @@ -33,7 +33,7 @@