1111from utilities .permissions import get_permission_for_model
1212from utilities .utils import copy_safe_request
1313
14+ from .. import util
1415from ..choices import ScriptExecutionStatusChoices
1516from ..filtersets import ScriptArtifactFilterSet , ScriptExecutionFilterSet , ScriptInstanceFilterSet , ScriptLogLineFilterSet
1617from ..models import ScriptArtifact , ScriptExecution , ScriptInstance , ScriptLogLine
@@ -35,14 +36,43 @@ class ScriptInstanceViewSet(NetBoxModelViewSet):
3536 queryset = ScriptInstance .objects .all ()
3637 serializer_class = ScriptInstanceSerializer
3738 filterset_class = ScriptInstanceFilterSet
38- http_method_names = ["get" , "patch" , "delete" ]
39+
40+ @action (detail = False , methods = ["post" ])
41+ def load (self , request ):
42+ permission = get_permission_for_model (self .queryset .model , "add" )
43+
44+ if not request .user .has_perm (permission ):
45+ raise PermissionDenied (f"Missing permission: { permission } " )
46+
47+ scripts = util .load_scripts ()
48+ script_instances = {script_instance .script_path : script_instance for script_instance in ScriptInstance .objects .all ()}
49+ loaded_scripts = []
50+
51+ for script_path , script in scripts .items ():
52+ if script_path not in script_instances :
53+ script_name = getattr (script .Meta , "name" , script_path )
54+ module_path , class_name = script_path .rsplit ("." , 1 )
55+
56+ script_instance = ScriptInstance (
57+ name = script_name ,
58+ module_path = module_path ,
59+ class_name = class_name ,
60+ description = script .description ,
61+ task_queues = script .task_queues ,
62+ group = script .group ,
63+ weight = script .weight ,
64+ )
65+ script_instance .full_clean ()
66+ script_instance .save ()
67+ loaded_scripts .append (script_instance )
68+
69+ return Response (ScriptInstanceSerializer (loaded_scripts , many = True , context = {"request" : request }).data )
3970
4071 @action (detail = True , methods = ["post" ])
4172 def run (self , request , pk ):
4273 # TODO: Add schema definitions.
43- # TODO: Consider refactoring serializers
4474
45- permission = get_permission_for_model (self .queryset .model , "sync " )
75+ permission = get_permission_for_model (self .queryset .model , "run " )
4676 if not request .user .has_perm (permission ):
4777 raise PermissionDenied (f"Missing permission: { permission } " )
4878
0 commit comments