From ba8329eb4a58fd51ef777f0e58c7f2b8beb5e0b2 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 13 Feb 2024 16:02:03 -0800 Subject: [PATCH] 14438 review comments retain old urls --- netbox/extras/urls.py | 11 ++++-- netbox/extras/views.py | 81 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 86 insertions(+), 6 deletions(-) diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index a57319514..d8619f6f9 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -121,9 +121,14 @@ urlpatterns = [ path('scripts/add/', views.ScriptModuleCreateView.as_view(), name='scriptmodule_add'), path('scripts/results//', views.ScriptResultView.as_view(), name='script_result'), path('scripts//', include(get_model_urls('extras', 'scriptmodule'))), - path('scripts/class//', views.ScriptView.as_view(), name='script'), - path('scripts/class//source/', views.ScriptSourceView.as_view(), name='script_source'), - path('scripts/class//jobs/', views.ScriptJobsView.as_view(), name='script_jobs'), + + path('scripts///', views.ScriptModuleView.as_view(), name='script_module'), + path('scripts///source/', views.ScriptModuleSourceView.as_view(), name='script_module_source'), + path('scripts///jobs/', views.ScriptModuleJobsView.as_view(), name='script_module_jobs'), + + path('script-modules//', views.ScriptView.as_view(), name='script'), + path('scripts-modules//source/', views.ScriptSourceView.as_view(), name='script_source'), + path('scripts-modules//jobs/', views.ScriptJobsView.as_view(), name='script_jobs'), # Markdown path('render/markdown/', views.RenderMarkdownView.as_view(), name="render_markdown"), diff --git a/netbox/extras/views.py b/netbox/extras/views.py index e0c83e283..31b054dc8 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1042,7 +1042,8 @@ def get_script_module(module, request): return get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__regex=f"^{module}\\.") -class BaseScriptView(ContentTypePermissionRequiredMixin, View): +class BaseScriptView(ContentTypePermissionRequiredMixin, generic.ObjectView): + queryset = Script.objects.all() script = None script_class = None jobs = None @@ -1050,8 +1051,7 @@ class BaseScriptView(ContentTypePermissionRequiredMixin, View): def get_required_permission(self): return 'extras.view_script' - def get_script(self, request, pk): - self.script = get_object_or_404(Script.objects.all(), pk=pk) + def _init_vars(self, request): if self.script.python_class: self.script_class = self.script.python_class() else: @@ -1065,6 +1065,15 @@ class BaseScriptView(ContentTypePermissionRequiredMixin, View): self.jobs = self.script.jobs.all() return None + def get_script(self, request, pk): + self.script = get_object_or_404(Script.objects.all(), pk=pk) + return self._init_vars(request) + + def get_script_by_module_name(self, request, module, name): + module = get_script_module(module, request) + self.script = get_object_or_404(Script.objects.all(), module=module, name=name) + return self._init_vars(request) + class ScriptView(BaseScriptView): @@ -1123,6 +1132,25 @@ class ScriptView(BaseScriptView): }) +class ScriptModuleView(ScriptView): + + def get(self, request, module, name): + if ret := self.get_script_by_module_name(request, module, name): + return ret + + form = None + if self.script_class: + form = self.script_class.as_form(initial=normalize_querydict(request.GET)) + + return render(request, 'extras/script.html', { + 'job_count': self.jobs.count(), + 'module': self.script.module, + 'script': self.script, + 'script_class': self.script_class, + 'form': form, + }) + + class ScriptSourceView(BaseScriptView): def get(self, request, pk): @@ -1138,6 +1166,21 @@ class ScriptSourceView(BaseScriptView): }) +class ScriptModuleSourceView(ScriptSourceView): + + def get(self, request, module, name): + if ret := self.get_script_by_module_name(request, module, name): + return ret + + return render(request, 'extras/script/source.html', { + 'job_count': self.jobs.count(), + 'module': self.script.module, + 'script': self.script, + 'script_class': self.script_class, + 'tab': 'source', + }) + + class ScriptJobsView(ContentTypePermissionRequiredMixin, View): script = None script_class = None @@ -1148,6 +1191,38 @@ class ScriptJobsView(ContentTypePermissionRequiredMixin, View): def get(self, request, pk): self.script = get_object_or_404(Script.objects.all(), pk=pk) + + if self.script.python_class: + self.script_class = self.script.python_class() + else: + self.script.delete_if_no_jobs() + if not self.script.id: + messages.error(request, _("Script class has been deleted from module: ") + str(self.script.module)) + return redirect('extras:script_list') + + self.jobs = self.script.jobs.all() + + jobs_table = JobTable( + data=self.jobs, + orderable=False, + user=request.user + ) + jobs_table.configure(request) + + return render(request, 'extras/script/jobs.html', { + 'job_count': self.jobs.count(), + 'module': self.script.module, + 'script': self.script, + 'table': jobs_table, + 'tab': 'jobs', + }) + + +class ScriptModuleJobsView(ScriptJobsView): + def get(self, request, module, name): + module = get_script_module(module, request) + self.script = get_object_or_404(Script.objects.all(), module=module, name=name) + if self.script.python_class: self.script_class = self.script.python_class() else: