mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-26 17:26:10 -06:00
Add deletion links for modules
This commit is contained in:
parent
b2bba7fc40
commit
bfccd6820e
@ -855,6 +855,13 @@ class ScriptModule(JobResultsMixin, WebhooksMixin, PythonModuleMixin, ManagedFil
|
|||||||
self.file_root = SCRIPTS_ROOT_NAME
|
self.file_root = SCRIPTS_ROOT_NAME
|
||||||
return super().save(*args, **kwargs)
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse('extras:script_list')
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
return self.file_path
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Reports
|
# Reports
|
||||||
@ -886,3 +893,6 @@ class ReportModule(JobResultsMixin, WebhooksMixin, PythonModuleMixin, ManagedFil
|
|||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
self.file_root = REPORTS_ROOT_NAME
|
self.file_root = REPORTS_ROOT_NAME
|
||||||
return super().save(*args, **kwargs)
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse('extras:report_list')
|
||||||
|
@ -94,17 +94,17 @@ urlpatterns = [
|
|||||||
|
|
||||||
# Reports
|
# Reports
|
||||||
path('reports/', views.ReportListView.as_view(), name='report_list'),
|
path('reports/', views.ReportListView.as_view(), name='report_list'),
|
||||||
path('reports/results/<int:job_result_pk>/', views.ReportResultView.as_view(), name='report_result'),
|
|
||||||
re_path(r'^reports/(?P<module>.([^.]+)).(?P<name>.(.+))/', views.ReportView.as_view(), name='report'),
|
|
||||||
path('reports/add/', views.ScriptModuleCreateView.as_view(), name='reportmodule_add'),
|
path('reports/add/', views.ScriptModuleCreateView.as_view(), name='reportmodule_add'),
|
||||||
|
path('reports/results/<int:job_result_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/<str:module>.<str:name>/', views.ReportView.as_view(), name='report'),
|
||||||
|
|
||||||
# Scripts
|
# Scripts
|
||||||
path('scripts/', views.ScriptListView.as_view(), name='script_list'),
|
path('scripts/', views.ScriptListView.as_view(), name='script_list'),
|
||||||
path('scripts/results/<int:job_result_pk>/', views.ScriptResultView.as_view(), name='script_result'),
|
|
||||||
re_path(r'^scripts/(?P<module>.([^.]+)).(?P<name>.(.+))/', views.ScriptView.as_view(), name='script'),
|
|
||||||
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_result_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/<str:module>.<str:name>/', views.ScriptView.as_view(), name='script'),
|
||||||
|
|
||||||
# Job results
|
# Job results
|
||||||
path('job-results/', views.JobResultListView.as_view(), name='jobresult_list'),
|
path('job-results/', views.JobResultListView.as_view(), name='jobresult_list'),
|
||||||
|
@ -79,15 +79,15 @@ def get_modules(queryset, litmus_func, ordering_attr):
|
|||||||
Returns a list of tuples:
|
Returns a list of tuples:
|
||||||
|
|
||||||
[
|
[
|
||||||
(module_name, (child, child, ...)),
|
(module, (child, child, ...)),
|
||||||
(module_name, (child, child, ...)),
|
(module, (child, child, ...)),
|
||||||
...
|
...
|
||||||
]
|
]
|
||||||
"""
|
"""
|
||||||
results = {}
|
results = {}
|
||||||
|
|
||||||
modules = [mf.get_module_info() for mf in queryset]
|
modules = [(mf, *mf.get_module_info()) for mf in queryset]
|
||||||
modules_bases = set([name.split(".")[0] for _, name, _ in modules])
|
modules_bases = set([name.split(".")[0] for _, _, name, _ in modules])
|
||||||
|
|
||||||
# Deleting from sys.modules needs to done behind a lock to prevent race conditions where a module is
|
# Deleting from sys.modules needs to done behind a lock to prevent race conditions where a module is
|
||||||
# removed from sys.modules while another thread is importing
|
# removed from sys.modules while another thread is importing
|
||||||
@ -100,7 +100,7 @@ def get_modules(queryset, litmus_func, ordering_attr):
|
|||||||
if module_base in ('reports', 'scripts', *modules_bases):
|
if module_base in ('reports', 'scripts', *modules_bases):
|
||||||
del sys.modules[module_name]
|
del sys.modules[module_name]
|
||||||
|
|
||||||
for importer, module_name, _ in modules:
|
for mf, importer, module_name, _ in modules:
|
||||||
module = importer.find_module(module_name).load_module(module_name)
|
module = importer.find_module(module_name).load_module(module_name)
|
||||||
child_order = getattr(module, ordering_attr, ())
|
child_order = getattr(module, ordering_attr, ())
|
||||||
ordered_children = [cls() for cls in child_order if litmus_func(cls)]
|
ordered_children = [cls() for cls in child_order if litmus_func(cls)]
|
||||||
@ -114,6 +114,6 @@ def get_modules(queryset, litmus_func, ordering_attr):
|
|||||||
children[child_name] = cls
|
children[child_name] = cls
|
||||||
|
|
||||||
if children:
|
if children:
|
||||||
results[module_name] = children
|
results[mf] = children
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
@ -28,8 +28,15 @@
|
|||||||
{% for module, module_reports in reports %}
|
{% for module, module_reports in reports %}
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h5 class="card-header">
|
<h5 class="card-header">
|
||||||
<a name="module.{{ module }}"></a>
|
{% if perms.extras.delete_reportmodule %}
|
||||||
<i class="mdi mdi-file-document-outline"></i> {{ module|bettertitle }}
|
<div class="float-end">
|
||||||
|
<a href="{% url 'extras:reportmodule_delete' pk=module.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<a name="module.{{ module.name }}"></a>
|
||||||
|
<i class="mdi mdi-file-document-outline"></i> {{ module.name|bettertitle }}
|
||||||
</h5>
|
</h5>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<table class="table table-hover table-headings reports">
|
<table class="table table-hover table-headings reports">
|
||||||
|
@ -27,8 +27,15 @@
|
|||||||
{% for module, module_scripts in scripts.items %}
|
{% for module, module_scripts in scripts.items %}
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h5 class="card-header">
|
<h5 class="card-header">
|
||||||
<a name="module.{{ module }}"></a>
|
{% if perms.extras.delete_scriptmodule %}
|
||||||
<i class="mdi mdi-file-document-outline"></i> {{ module|bettertitle }}
|
<div class="float-end">
|
||||||
|
<a href="{% url 'extras:scriptmodule_delete' pk=module.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<a name="module.{{ module.name }}"></a>
|
||||||
|
<i class="mdi mdi-file-document-outline"></i> {{ module.name|bettertitle }}
|
||||||
</h5>
|
</h5>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<table class="table table-hover table-headings reports">
|
<table class="table table-hover table-headings reports">
|
||||||
|
Loading…
Reference in New Issue
Block a user