mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-22 20:12:00 -06:00
Allow reports to be nested in submodules
This commit is contained in:
parent
f489ffa043
commit
356ff457be
@ -159,7 +159,7 @@ class ReportViewSet(ViewSet):
|
|||||||
# Read the PK as "<module>.<report>"
|
# Read the PK as "<module>.<report>"
|
||||||
if '.' not in pk:
|
if '.' not in pk:
|
||||||
raise Http404
|
raise Http404
|
||||||
module_name, report_name = pk.split('.', 1)
|
module_name, report_name = pk.split('.', maxsplit=1)
|
||||||
|
|
||||||
# Raise a 404 on an invalid Report module/name
|
# Raise a 404 on an invalid Report module/name
|
||||||
report = get_report(module_name, report_name)
|
report = get_report(module_name, report_name)
|
||||||
@ -183,8 +183,8 @@ class ReportViewSet(ViewSet):
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Iterate through all available Reports.
|
# Iterate through all available Reports.
|
||||||
for module_name, reports in get_reports():
|
for module_name, reports in get_reports().items():
|
||||||
for report in reports:
|
for report in reports.values():
|
||||||
|
|
||||||
# Attach the relevant JobResult (if any) to each Report.
|
# Attach the relevant JobResult (if any) to each Report.
|
||||||
report.result = results.get(report.full_name, None)
|
report.result = results.get(report.full_name, None)
|
||||||
|
@ -21,8 +21,8 @@ class Command(BaseCommand):
|
|||||||
reports = get_reports()
|
reports = get_reports()
|
||||||
|
|
||||||
# Run reports
|
# Run reports
|
||||||
for module_name, report_list in reports:
|
for module_name, report_list in reports.items():
|
||||||
for report in report_list:
|
for report in report_list.values():
|
||||||
if module_name in options['reports'] or report.full_name in options['reports']:
|
if module_name in options['reports'] or report.full_name in options['reports']:
|
||||||
|
|
||||||
# Run the report and create a new JobResult
|
# Run the report and create a new JobResult
|
||||||
|
@ -26,20 +26,18 @@ def get_report(module_name, report_name):
|
|||||||
"""
|
"""
|
||||||
Return a specific report from within a module.
|
Return a specific report from within a module.
|
||||||
"""
|
"""
|
||||||
file_path = '{}/{}.py'.format(settings.REPORTS_ROOT, module_name)
|
reports = get_reports()
|
||||||
|
module = reports.get(module_name)
|
||||||
|
|
||||||
spec = importlib.util.spec_from_file_location(module_name, file_path)
|
if module is None:
|
||||||
module = importlib.util.module_from_spec(spec)
|
|
||||||
try:
|
|
||||||
spec.loader.exec_module(module)
|
|
||||||
except FileNotFoundError:
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
report = getattr(module, report_name, None)
|
report = module.get(report_name)
|
||||||
|
|
||||||
if report is None:
|
if report is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return report()
|
return report
|
||||||
|
|
||||||
|
|
||||||
def get_reports():
|
def get_reports():
|
||||||
@ -52,7 +50,7 @@ def get_reports():
|
|||||||
...
|
...
|
||||||
]
|
]
|
||||||
"""
|
"""
|
||||||
module_list = []
|
module_list = {}
|
||||||
|
|
||||||
# Iterate through all modules within the reports path. These are the user-created files in which reports are
|
# Iterate through all modules within the reports path. These are the user-created files in which reports are
|
||||||
# defined.
|
# defined.
|
||||||
@ -61,7 +59,16 @@ def get_reports():
|
|||||||
report_order = getattr(module, "report_order", ())
|
report_order = getattr(module, "report_order", ())
|
||||||
ordered_reports = [cls() for cls in report_order if is_report(cls)]
|
ordered_reports = [cls() for cls in report_order if is_report(cls)]
|
||||||
unordered_reports = [cls() for _, cls in inspect.getmembers(module, is_report) if cls not in report_order]
|
unordered_reports = [cls() for _, cls in inspect.getmembers(module, is_report) if cls not in report_order]
|
||||||
module_list.append((module_name, [*ordered_reports, *unordered_reports]))
|
|
||||||
|
module_reports = {}
|
||||||
|
|
||||||
|
for cls in [*ordered_reports, *unordered_reports]:
|
||||||
|
# For reports in submodules use the full import path w/o the root module as the name
|
||||||
|
report_name = cls.full_name.split(".", maxsplit=1)[1]
|
||||||
|
module_reports[report_name] = cls
|
||||||
|
|
||||||
|
if module_reports:
|
||||||
|
module_list[module_name] = module_reports
|
||||||
|
|
||||||
return module_list
|
return module_list
|
||||||
|
|
||||||
|
@ -100,8 +100,8 @@ urlpatterns = [
|
|||||||
|
|
||||||
# Reports
|
# Reports
|
||||||
path('reports/', views.ReportListView.as_view(), name='report_list'),
|
path('reports/', views.ReportListView.as_view(), name='report_list'),
|
||||||
path('reports/<str:module>.<str:name>/', views.ReportView.as_view(), name='report'),
|
|
||||||
path('reports/results/<int:job_result_pk>/', views.ReportResultView.as_view(), name='report_result'),
|
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'),
|
||||||
|
|
||||||
# Scripts
|
# Scripts
|
||||||
path('scripts/', views.ScriptListView.as_view(), name='script_list'),
|
path('scripts/', views.ScriptListView.as_view(), name='script_list'),
|
||||||
|
@ -534,9 +534,10 @@ class ReportListView(ContentTypePermissionRequiredMixin, View):
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = []
|
ret = []
|
||||||
for module, report_list in reports:
|
|
||||||
|
for module, report_list in reports.items():
|
||||||
module_reports = []
|
module_reports = []
|
||||||
for report in report_list:
|
for report in report_list.values():
|
||||||
report.result = results.get(report.full_name, None)
|
report.result = results.get(report.full_name, None)
|
||||||
module_reports.append(report)
|
module_reports.append(report)
|
||||||
ret.append((module, module_reports))
|
ret.append((module, module_reports))
|
||||||
@ -613,7 +614,7 @@ class ReportResultView(ContentTypePermissionRequiredMixin, View):
|
|||||||
result = get_object_or_404(JobResult.objects.all(), pk=job_result_pk, obj_type=report_content_type)
|
result = get_object_or_404(JobResult.objects.all(), pk=job_result_pk, obj_type=report_content_type)
|
||||||
|
|
||||||
# Retrieve the Report and attach the JobResult to it
|
# Retrieve the Report and attach the JobResult to it
|
||||||
module, report_name = result.name.split('.')
|
module, report_name = result.name.split('.', maxsplit=1)
|
||||||
report = get_report(module, report_name)
|
report = get_report(module, report_name)
|
||||||
report.result = result
|
report.result = result
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user