mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-26 17:26:10 -06:00
Fix URLs for nested scripts/reports
This commit is contained in:
parent
4da655c163
commit
27f1c6eadf
@ -13,7 +13,7 @@ class PythonModuleMixin:
|
|||||||
return os.path.splitext(self.file_path)[0]
|
return os.path.splitext(self.file_path)[0]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def pymodule_name(self):
|
def python_name(self):
|
||||||
path, filename = os.path.split(self.full_path)
|
path, filename = os.path.split(self.full_path)
|
||||||
name = os.path.splitext(filename)[0]
|
name = os.path.splitext(filename)[0]
|
||||||
if name == '__init__':
|
if name == '__init__':
|
||||||
@ -23,6 +23,6 @@ class PythonModuleMixin:
|
|||||||
return name
|
return name
|
||||||
|
|
||||||
def get_module(self):
|
def get_module(self):
|
||||||
loader = SourceFileLoader(self.pymodule_name, self.full_path)
|
loader = SourceFileLoader(self.python_name, self.full_path)
|
||||||
module = loader.load_module()
|
module = loader.load_module()
|
||||||
return module
|
return module
|
||||||
|
@ -44,6 +44,9 @@ class ReportModule(PythonModuleMixin, JobsMixin, ManagedFile):
|
|||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('extras:report_list')
|
return reverse('extras:report_list')
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.python_name
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def reports(self):
|
def reports(self):
|
||||||
|
|
||||||
|
@ -43,6 +43,9 @@ class ScriptModule(PythonModuleMixin, JobsMixin, ManagedFile):
|
|||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('extras:script_list')
|
return reverse('extras:script_list')
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.python_name
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def scripts(self):
|
def scripts(self):
|
||||||
|
|
||||||
|
@ -97,17 +97,17 @@ urlpatterns = [
|
|||||||
path('reports/add/', views.ReportModuleCreateView.as_view(), name='reportmodule_add'),
|
path('reports/add/', views.ReportModuleCreateView.as_view(), name='reportmodule_add'),
|
||||||
path('reports/results/<int:job_pk>/', views.ReportResultView.as_view(), name='report_result'),
|
path('reports/results/<int:job_pk>/', views.ReportResultView.as_view(), name='report_result'),
|
||||||
path('reports/<int:pk>/', include(get_model_urls('extras', 'reportmodule'))),
|
path('reports/<int:pk>/', include(get_model_urls('extras', 'reportmodule'))),
|
||||||
path('reports/<path:module>.<str:name>/', views.ReportView.as_view(), name='report'),
|
path('reports/<str:module>/<str:name>/', views.ReportView.as_view(), name='report'),
|
||||||
path('reports/<path:module>.<str:name>/jobs/', views.ReportJobsView.as_view(), name='report_jobs'),
|
path('reports/<str:module>/<str:name>/jobs/', views.ReportJobsView.as_view(), name='report_jobs'),
|
||||||
|
|
||||||
# Scripts
|
# Scripts
|
||||||
path('scripts/', views.ScriptListView.as_view(), name='script_list'),
|
path('scripts/', views.ScriptListView.as_view(), name='script_list'),
|
||||||
path('scripts/add/', views.ScriptModuleCreateView.as_view(), name='scriptmodule_add'),
|
path('scripts/add/', views.ScriptModuleCreateView.as_view(), name='scriptmodule_add'),
|
||||||
path('scripts/results/<int:job_pk>/', views.ScriptResultView.as_view(), name='script_result'),
|
path('scripts/results/<int:job_pk>/', views.ScriptResultView.as_view(), name='script_result'),
|
||||||
path('scripts/<int:pk>/', include(get_model_urls('extras', 'scriptmodule'))),
|
path('scripts/<int:pk>/', include(get_model_urls('extras', 'scriptmodule'))),
|
||||||
path('scripts/<path:module>.<str:name>/', views.ScriptView.as_view(), name='script'),
|
path('scripts/<str:module>/<str:name>/', views.ScriptView.as_view(), name='script'),
|
||||||
path('scripts/<path:module>.<str:name>/source/', views.ScriptSourceView.as_view(), name='script_source'),
|
path('scripts/<str:module>/<str:name>/source/', views.ScriptSourceView.as_view(), name='script_source'),
|
||||||
path('scripts/<path:module>.<str:name>/jobs/', views.ScriptJobsView.as_view(), name='script_jobs'),
|
path('scripts/<str:module>/<str:name>/jobs/', views.ScriptJobsView.as_view(), name='script_jobs'),
|
||||||
|
|
||||||
# Markdown
|
# Markdown
|
||||||
path('render/markdown/', views.RenderMarkdownView.as_view(), name="render_markdown")
|
path('render/markdown/', views.RenderMarkdownView.as_view(), name="render_markdown")
|
||||||
|
@ -833,7 +833,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View):
|
|||||||
return 'extras.view_report'
|
return 'extras.view_report'
|
||||||
|
|
||||||
def get(self, request, module, name):
|
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]()
|
report = module.reports[name]()
|
||||||
|
|
||||||
object_type = ContentType.objects.get(app_label='extras', model='reportmodule')
|
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'):
|
if not request.user.has_perm('extras.run_report'):
|
||||||
return HttpResponseForbidden()
|
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]()
|
report = module.reports[name]()
|
||||||
form = ReportForm(request.POST)
|
form = ReportForm(request.POST)
|
||||||
|
|
||||||
@ -893,7 +893,7 @@ class ReportJobsView(ContentTypePermissionRequiredMixin, View):
|
|||||||
return 'extras.view_report'
|
return 'extras.view_report'
|
||||||
|
|
||||||
def get(self, request, module, name):
|
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]()
|
report = module.reports[name]()
|
||||||
|
|
||||||
object_type = ContentType.objects.get(app_label='extras', model='reportmodule')
|
object_type = ContentType.objects.get(app_label='extras', model='reportmodule')
|
||||||
@ -989,7 +989,8 @@ class ScriptView(ContentTypePermissionRequiredMixin, View):
|
|||||||
return 'extras.view_script'
|
return 'extras.view_script'
|
||||||
|
|
||||||
def get(self, request, module, name):
|
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]()
|
script = module.scripts[name]()
|
||||||
form = script.as_form(initial=normalize_querydict(request.GET))
|
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'):
|
if not request.user.has_perm('extras.run_script'):
|
||||||
return HttpResponseForbidden()
|
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]()
|
script = module.scripts[name]()
|
||||||
form = script.as_form(request.POST, request.FILES)
|
form = script.as_form(request.POST, request.FILES)
|
||||||
|
|
||||||
@ -1050,7 +1051,7 @@ class ScriptSourceView(ContentTypePermissionRequiredMixin, View):
|
|||||||
return 'extras.view_script'
|
return 'extras.view_script'
|
||||||
|
|
||||||
def get(self, request, module, name):
|
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]()
|
script = module.scripts[name]()
|
||||||
|
|
||||||
return render(request, 'extras/script/source.html', {
|
return render(request, 'extras/script/source.html', {
|
||||||
@ -1066,7 +1067,7 @@ class ScriptJobsView(ContentTypePermissionRequiredMixin, View):
|
|||||||
return 'extras.view_script'
|
return 'extras.view_script'
|
||||||
|
|
||||||
def get(self, request, module, name):
|
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]()
|
script = module.scripts[name]()
|
||||||
|
|
||||||
object_type = ContentType.objects.get(app_label='extras', model='scriptmodule')
|
object_type = ContentType.objects.get(app_label='extras', model='scriptmodule')
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<i class="mdi mdi-file-document-outline"></i> {{ module.name }}
|
<i class="mdi mdi-file-document-outline"></i> {{ module }}
|
||||||
</h5>
|
</h5>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% include 'inc/sync_warning.html' with object=module %}
|
{% include 'inc/sync_warning.html' with object=module %}
|
||||||
@ -54,7 +54,7 @@
|
|||||||
{% with last_job=jobs|get_key:report.name %}
|
{% with last_job=jobs|get_key:report.name %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="{% url 'extras:report' module=module.pymodule_name name=report.class_name %}" id="{{ report.module }}.{{ report.class_name }}">{{ report.name }}</a>
|
<a href="{% url 'extras:report' module=module.python_name name=report.class_name %}" id="{{ report.module }}.{{ report.class_name }}">{{ report.name }}</a>
|
||||||
</td>
|
</td>
|
||||||
<td>{{ report.description|markdown|placeholder }}</td>
|
<td>{{ report.description|markdown|placeholder }}</td>
|
||||||
{% if last_job %}
|
{% if last_job %}
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<i class="mdi mdi-file-document-outline"></i> {{ module.name }}
|
<i class="mdi mdi-file-document-outline"></i> {{ module }}
|
||||||
</h5>
|
</h5>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% include 'inc/sync_warning.html' with object=module %}
|
{% include 'inc/sync_warning.html' with object=module %}
|
||||||
@ -51,7 +51,7 @@
|
|||||||
{% for script_name, script_class in module.scripts.items %}
|
{% for script_name, script_class in module.scripts.items %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="{% url 'extras:script' module=module.pymodule_name name=script_name %}" name="script.{{ script_name }}">{{ script_class.name }}</a>
|
<a href="{% url 'extras:script' module=module.python_name name=script_name %}" name="script.{{ script_name }}">{{ script_class.name }}</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ script_class.Meta.description|markdown|placeholder }}
|
{{ script_class.Meta.description|markdown|placeholder }}
|
||||||
|
Loading…
Reference in New Issue
Block a user