diff --git a/docs/customization/reports.md b/docs/customization/reports.md index 2fead68ec2..a227f38517 100644 --- a/docs/customization/reports.md +++ b/docs/customization/reports.md @@ -97,6 +97,21 @@ The recording of one or more failure messages will automatically flag a report a To perform additional tasks, such as sending an email or calling a webhook, after a report has been run, extend the `post_run()` method. The status of the report is available as `self.failed` and the results object is `self.result`. +By default, reports within a module are unordered and 'randomly' displayed in the reports list page. If you want to order reports, you can defined the `report_order` variable at the end +of your module. The `report_order` variable is a tuple which contains each Report class in a specific order. + +``` +from extras.reports import Report + +class DeviceConnectionsReport(Report) + pass + +class DeviceIPsReport(Report) + pass + +report_order = (DeviceIPsReport, DeviceConnectionsReport) +``` + Once you have created a report, it will appear in the reports list. Initially, reports will have no results associated with them. To generate results, run the report. ## Running Reports diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index 64fbffb46a..cc623b37c3 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -59,8 +59,10 @@ def get_reports(): # defined. for importer, module_name, _ in pkgutil.iter_modules([settings.REPORTS_ROOT]): module = importer.find_module(module_name).load_module(module_name) - report_list = [cls() for _, cls in inspect.getmembers(module, is_report)] - module_list.append((module_name, report_list)) + report_order = getattr(module, "report_order", ()) + 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] + module_list.append((module_name, [*ordered_reports, *unordered_reports])) return module_list