From dc9d54c3c1d07849b0eb392bf682b298694151d0 Mon Sep 17 00:00:00 2001 From: atownson <52260120+atownson@users.noreply.github.com> Date: Mon, 24 Feb 2025 10:06:30 -0600 Subject: [PATCH] Add URL pattern for scripts to reference them by module.name --- netbox/extras/urls.py | 3 +++ netbox/extras/views.py | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index 32633493f..f470f72b1 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -75,8 +75,11 @@ urlpatterns = [ path('scripts/add/', views.ScriptModuleCreateView.as_view(), name='scriptmodule_add'), path('scripts/results//', views.ScriptResultView.as_view(), name='script_result'), path('scripts//', views.ScriptView.as_view(), name='script'), + path('scripts/./', views.ScriptView.as_view(), name='script'), path('scripts//source/', views.ScriptSourceView.as_view(), name='script_source'), + path('scripts/./source/', views.ScriptSourceView.as_view(), name='script_source'), path('scripts//jobs/', views.ScriptJobsView.as_view(), name='script_jobs'), + path('scripts/./jobs/', views.ScriptJobsView.as_view(), name='script_jobs'), path('script-modules//', include(get_model_urls('extras', 'scriptmodule'))), # Markdown diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 86e7f214a..1c2031da2 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1251,6 +1251,17 @@ class ScriptListView(ContentTypePermissionRequiredMixin, View): class BaseScriptView(generic.ObjectView): queryset = Script.objects.all() + def _get_script(self, **kwargs): + if 'pk' in kwargs: + pk = kwargs.get('pk') + return get_object_or_404(self.queryset, pk=pk) + elif 'module' in kwargs and 'name' in kwargs: + module = kwargs.get('module') + name = kwargs.get('name') + return get_object_or_404(self.queryset, module__file_path=f'{module}.py', name=name) + else: + raise Http404 + def _get_script_class(self, script): """ Return an instance of the Script's Python class @@ -1262,7 +1273,7 @@ class BaseScriptView(generic.ObjectView): class ScriptView(BaseScriptView): def get(self, request, **kwargs): - script = self.get_object(**kwargs) + script = self._get_script(**kwargs) script_class = self._get_script_class(script) if not script_class: return render(request, 'extras/script.html', { @@ -1281,7 +1292,7 @@ class ScriptView(BaseScriptView): }) def post(self, request, **kwargs): - script = self.get_object(**kwargs) + script = self._get_script(**kwargs) if not request.user.has_perm('extras.run_script', obj=script): return HttpResponseForbidden() @@ -1326,7 +1337,7 @@ class ScriptSourceView(BaseScriptView): queryset = Script.objects.all() def get(self, request, **kwargs): - script = self.get_object(**kwargs) + script = self._get_script(**kwargs) script_class = self._get_script_class(script) return render(request, 'extras/script/source.html', { @@ -1341,7 +1352,7 @@ class ScriptJobsView(BaseScriptView): queryset = Script.objects.all() def get(self, request, **kwargs): - script = self.get_object(**kwargs) + script = self._get_script(**kwargs) jobs_table = JobTable( data=script.jobs.all(),