Skip to content

Commit 848e47c

Browse files
committed
Add load action to API
1 parent 6ae5935 commit 848e47c

File tree

1 file changed

+33
-3
lines changed

1 file changed

+33
-3
lines changed

netbox_script_manager/api/views.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from utilities.permissions import get_permission_for_model
1212
from utilities.utils import copy_safe_request
1313

14+
from .. import util
1415
from ..choices import ScriptExecutionStatusChoices
1516
from ..filtersets import ScriptArtifactFilterSet, ScriptExecutionFilterSet, ScriptInstanceFilterSet, ScriptLogLineFilterSet
1617
from ..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

Comments
 (0)