diff --git a/docs/customization/custom-scripts.md b/docs/customization/custom-scripts.md index 252e65f90..cf052f918 100644 --- a/docs/customization/custom-scripts.md +++ b/docs/customization/custom-scripts.md @@ -45,6 +45,20 @@ Defining script variables is optional: You may create a script with only a `run( Any output generated by the script during its execution will be displayed under the "output" tab in the UI. +By default, scripts within a module are ordered alphabetically in the scripts list page. To return scripts in a specific order, you can define the `script_order` variable at the end of your module. The `script_order` variable is a tuple which contains each Script class in the desired order. Any scripts that are omitted from this list will be listed last. + +```python +from extras.scripts import Script + +class MyCustomScript(Script): + ... + +class AnotherCustomScript(Script): + ... + +script_order = (MyCustomScript, AnotherCustomScript) +``` + ## Module Attributes ### `name` diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index 156b88065..6ccf7f48a 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -470,7 +470,6 @@ def get_scripts(use_names=False): defined name in place of the actual module name. """ scripts = OrderedDict() - # Iterate through all modules within the reports path. These are the user-created files in which reports are # defined. for importer, module_name, _ in pkgutil.iter_modules([settings.SCRIPTS_ROOT]): @@ -478,11 +477,14 @@ def get_scripts(use_names=False): if use_names and hasattr(module, 'name'): module_name = module.name module_scripts = OrderedDict() - for name, cls in inspect.getmembers(module, is_script): - module_scripts[name] = cls + script_order = getattr(module, "script_order", ()) + ordered_scripts = [cls for cls in script_order if is_script(cls)] + unordered_scripts = [cls for _, cls in inspect.getmembers(module, is_script) if cls not in script_order] + for cls in [*ordered_scripts, *unordered_scripts]: + module_scripts[cls.__name__] = cls if module_scripts: scripts[module_name] = module_scripts - + return scripts