From f9608f7376619392a95ffb90c818e51adf2f365c Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 16 Feb 2024 13:17:52 -0800 Subject: [PATCH] 14438 init_vars_or_redirect --- netbox/extras/api/views.py | 2 +- netbox/extras/filtersets.py | 21 +++++++++++++++++++++ netbox/extras/models/scripts.py | 4 ++++ netbox/extras/views.py | 10 ++++++---- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index d0622fd09..bfb16e6d9 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -212,7 +212,7 @@ class ScriptViewSet(ModelViewSet): permission_classes = [IsAuthenticatedOrLoginNotRequired] queryset = Script.objects.prefetch_related('jobs') serializer_class = serializers.ScriptSerializer - # filterset_class = filtersets.ScriptFilterSet + filterset_class = filtersets.ScriptFilterSet _ignore_model_permissions = True schema = None diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 730499956..dcdec2e90 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -29,11 +29,32 @@ __all__ = ( 'LocalConfigContextFilterSet', 'ObjectChangeFilterSet', 'SavedFilterFilterSet', + 'ScriptFilterSet', 'TagFilterSet', 'WebhookFilterSet', ) +class ScriptFilterSet(NetBoxModelFilterSet): + q = django_filters.CharFilter( + method='search', + label=_('Search'), + ) + + class Meta: + model = Webhook + fields = [ + 'id', 'name', + ] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) + ) + + class WebhookFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/extras/models/scripts.py b/netbox/extras/models/scripts.py index a3fd0827b..5c1f2f187 100644 --- a/netbox/extras/models/scripts.py +++ b/netbox/extras/models/scripts.py @@ -65,6 +65,10 @@ class Script(EventRulesMixin, JobsMixin, models.Model): def get_absolute_url(self): return reverse('extras:script', args=[self.pk]) + @property + def result(self): + return self.jobs.all().order_by('-created').first() + @cached_property def python_class(self): return self.module.module_scripts.get(self.name) diff --git a/netbox/extras/views.py b/netbox/extras/views.py index b091a37eb..5d14d2dab 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1025,6 +1025,8 @@ class ScriptModuleDeleteView(generic.ObjectDeleteView): class ScriptListView(ContentTypePermissionRequiredMixin, View): + filterset = filtersets.CustomFieldFilterSet + filterset_form = forms.CustomFieldFilterForm def get_required_permission(self): return 'extras.view_script' @@ -1065,7 +1067,7 @@ class BaseScriptView(ContentTypePermissionRequiredMixin, generic.ObjectView): self.jobs = self.script.jobs.all() return None - def get_script(self, request, pk): + def init_vars_or_redirect(self, request, pk): self.script = get_object_or_404(Script.objects.all(), pk=pk) return self._init_vars(request) @@ -1073,7 +1075,7 @@ class BaseScriptView(ContentTypePermissionRequiredMixin, generic.ObjectView): class ScriptView(BaseScriptView): def get(self, request, pk): - if ret := self.get_script(request, pk): + if ret := self.init_vars_or_redirect(request, pk): return ret form = None @@ -1092,7 +1094,7 @@ class ScriptView(BaseScriptView): if not request.user.has_perm('extras.run_script'): return HttpResponseForbidden() - if ret := self.get_script(request, pk): + if ret := self.init_vars_or_redirect(request, pk): return ret form = None @@ -1130,7 +1132,7 @@ class ScriptView(BaseScriptView): class ScriptSourceView(BaseScriptView): def get(self, request, pk): - if ret := self.get_script(request, pk): + if ret := self.init_vars_or_redirect(request, pk): return ret return render(request, 'extras/script/source.html', {