From 1d5d283cb979a0aae2ece1baa09e01a1b352186c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 22 May 2024 09:02:47 -0400 Subject: [PATCH] Simplify retrieval logic --- netbox/extras/api/views.py | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index 579af077d..05087b2d5 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -14,7 +14,7 @@ from rq import Worker from core.models import Job, ObjectType from extras import filtersets from extras.models import * -from extras.scripts import get_module_and_script, run_script +from extras.scripts import run_script from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired from netbox.api.features import SyncedDataMixin from netbox.api.metadata import ContentTypeMetadata @@ -217,37 +217,31 @@ class ScriptViewSet(ModelViewSet): lookup_value_regex = '[^/]+' # Allow dots def _get_script(self, pk): + # If pk is numeric, retrieve script by ID if pk.isnumeric(): - script = get_object_or_404(self.queryset, pk=pk) - module = script.module - else: - try: - module_name, script_name = pk.split('.', maxsplit=1) - except ValueError: - raise Http404 + return get_object_or_404(self.queryset, pk=pk) - module, script = get_module_and_script(module_name, script_name) - - if script is None: + # Default to retrieval by module & name + try: + module_name, script_name = pk.split('.', maxsplit=1) + except ValueError: raise Http404 - - return module, script + return get_object_or_404(self.queryset, module__file_path=f'{module_name}.py', name=script_name) def retrieve(self, request, pk): - module, script = self._get_script(pk) + script = self._get_script(pk) serializer = serializers.ScriptDetailSerializer(script, context={'request': request}) return Response(serializer.data) def post(self, request, pk): """ - Run a Script identified by the name or pk and return the pending Job as the result + Run a Script identified by its numeric PK or module & name and return the pending Job as the result """ - if not request.user.has_perm('extras.run_script'): raise PermissionDenied("This user does not have permission to run scripts.") - module, script = self._get_script(pk) + script = self._get_script(pk) input_serializer = serializers.ScriptInputSerializer( data=request.data, context={'script': script}