diff --git a/netbox/extras/models/mixins.py b/netbox/extras/models/mixins.py index ab04245ad..cb1d31837 100644 --- a/netbox/extras/models/mixins.py +++ b/netbox/extras/models/mixins.py @@ -13,7 +13,7 @@ class PythonModuleMixin: return os.path.splitext(self.file_path)[0] @property - def pymodule_name(self): + def python_name(self): path, filename = os.path.split(self.full_path) name = os.path.splitext(filename)[0] if name == '__init__': @@ -23,6 +23,6 @@ class PythonModuleMixin: return name def get_module(self): - loader = SourceFileLoader(self.pymodule_name, self.full_path) + loader = SourceFileLoader(self.python_name, self.full_path) module = loader.load_module() return module diff --git a/netbox/extras/models/reports.py b/netbox/extras/models/reports.py index bf33e20ba..aaa785696 100644 --- a/netbox/extras/models/reports.py +++ b/netbox/extras/models/reports.py @@ -44,6 +44,9 @@ class ReportModule(PythonModuleMixin, JobsMixin, ManagedFile): def get_absolute_url(self): return reverse('extras:report_list') + def __str__(self): + return self.python_name + @cached_property def reports(self): diff --git a/netbox/extras/models/scripts.py b/netbox/extras/models/scripts.py index 257a7b701..1a7559e53 100644 --- a/netbox/extras/models/scripts.py +++ b/netbox/extras/models/scripts.py @@ -43,6 +43,9 @@ class ScriptModule(PythonModuleMixin, JobsMixin, ManagedFile): def get_absolute_url(self): return reverse('extras:script_list') + def __str__(self): + return self.python_name + @cached_property def scripts(self): diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index 400596c40..a562f5a8e 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -97,17 +97,17 @@ urlpatterns = [ path('reports/add/', views.ReportModuleCreateView.as_view(), name='reportmodule_add'), path('reports/results//', views.ReportResultView.as_view(), name='report_result'), path('reports//', include(get_model_urls('extras', 'reportmodule'))), - path('reports/./', views.ReportView.as_view(), name='report'), - path('reports/./jobs/', views.ReportJobsView.as_view(), name='report_jobs'), + path('reports///', views.ReportView.as_view(), name='report'), + path('reports///jobs/', views.ReportJobsView.as_view(), name='report_jobs'), # Scripts path('scripts/', views.ScriptListView.as_view(), name='script_list'), 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/./', views.ScriptView.as_view(), name='script'), - path('scripts/./source/', views.ScriptSourceView.as_view(), name='script_source'), - path('scripts/./jobs/', views.ScriptJobsView.as_view(), name='script_jobs'), + path('scripts///', views.ScriptView.as_view(), name='script'), + path('scripts///source/', views.ScriptSourceView.as_view(), name='script_source'), + path('scripts///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 bbc00d045..22984e9ab 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -833,7 +833,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): return 'extras.view_report' def get(self, request, module, name): - module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path=f'{module}.py') + module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module) report = module.reports[name]() object_type = ContentType.objects.get(app_label='extras', model='reportmodule') @@ -854,7 +854,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): if not request.user.has_perm('extras.run_report'): return HttpResponseForbidden() - module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path=f'{module}.py') + module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module) report = module.reports[name]() form = ReportForm(request.POST) @@ -893,7 +893,7 @@ class ReportJobsView(ContentTypePermissionRequiredMixin, View): return 'extras.view_report' def get(self, request, module, name): - module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path=f'{module}.py') + module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module) report = module.reports[name]() object_type = ContentType.objects.get(app_label='extras', model='reportmodule') @@ -989,7 +989,8 @@ class ScriptView(ContentTypePermissionRequiredMixin, View): return 'extras.view_script' def get(self, request, module, name): - module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path=f'{module}.py') + print(module) + module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module) script = module.scripts[name]() form = script.as_form(initial=normalize_querydict(request.GET)) @@ -1013,7 +1014,7 @@ class ScriptView(ContentTypePermissionRequiredMixin, View): if not request.user.has_perm('extras.run_script'): return HttpResponseForbidden() - module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path=f'{module}.py') + module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module) script = module.scripts[name]() form = script.as_form(request.POST, request.FILES) @@ -1050,7 +1051,7 @@ class ScriptSourceView(ContentTypePermissionRequiredMixin, View): return 'extras.view_script' def get(self, request, module, name): - module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path=f'{module}.py') + module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module) script = module.scripts[name]() return render(request, 'extras/script/source.html', { @@ -1066,7 +1067,7 @@ class ScriptJobsView(ContentTypePermissionRequiredMixin, View): return 'extras.view_script' def get(self, request, module, name): - module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path=f'{module}.py') + module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module) script = module.scripts[name]() object_type = ContentType.objects.get(app_label='extras', model='scriptmodule') diff --git a/netbox/templates/extras/report_list.html b/netbox/templates/extras/report_list.html index ea774ce1d..0c27eefda 100644 --- a/netbox/templates/extras/report_list.html +++ b/netbox/templates/extras/report_list.html @@ -34,7 +34,7 @@ {% endif %} - {{ module.name }} + {{ module }}
{% include 'inc/sync_warning.html' with object=module %} @@ -54,7 +54,7 @@ {% with last_job=jobs|get_key:report.name %} - {{ report.name }} + {{ report.name }} {{ report.description|markdown|placeholder }} {% if last_job %} diff --git a/netbox/templates/extras/script_list.html b/netbox/templates/extras/script_list.html index 87a3b0f2a..bccbce589 100644 --- a/netbox/templates/extras/script_list.html +++ b/netbox/templates/extras/script_list.html @@ -33,7 +33,7 @@
{% endif %} - {{ module.name }} + {{ module }}
{% include 'inc/sync_warning.html' with object=module %} @@ -51,7 +51,7 @@ {% for script_name, script_class in module.scripts.items %} - {{ script_class.name }} + {{ script_class.name }} {{ script_class.Meta.description|markdown|placeholder }}