Explorar el Código

Merge pull request #7400 from maximumG/7387-order-scripts

Fixes #7387 : possibility to order scripts
Jeremy Stretch hace 4 años
padre
commit
bd181ac84f
Se han modificado 2 ficheros con 20 adiciones y 4 borrados
  1. 14 0
      docs/customization/custom-scripts.md
  2. 6 4
      netbox/extras/scripts.py

+ 14 - 0
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.
 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
 ## Module Attributes
 
 
 ### `name`
 ### `name`

+ 6 - 4
netbox/extras/scripts.py

@@ -470,7 +470,6 @@ def get_scripts(use_names=False):
     defined name in place of the actual module name.
     defined name in place of the actual module name.
     """
     """
     scripts = OrderedDict()
     scripts = OrderedDict()
-
     # 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.
     for importer, module_name, _ in pkgutil.iter_modules([settings.SCRIPTS_ROOT]):
     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'):
         if use_names and hasattr(module, 'name'):
             module_name = module.name
             module_name = module.name
         module_scripts = OrderedDict()
         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:
         if module_scripts:
             scripts[module_name] = module_scripts
             scripts[module_name] = module_scripts
-
+    
     return scripts
     return scripts