mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-17 21:18:16 -06:00
14438 fix serializer and api view
This commit is contained in:
parent
2f8a7b9fe9
commit
5290c86e08
@ -512,16 +512,17 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ScriptSerializer(ValidatedModelSerializer):
|
class ScriptSerializer(ValidatedModelSerializer):
|
||||||
|
id = serializers.CharField(read_only=True)
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail',)
|
url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail',)
|
||||||
description = serializers.SerializerMethodField(read_only=True)
|
description = serializers.SerializerMethodField(read_only=True)
|
||||||
vars = serializers.SerializerMethodField(read_only=True)
|
vars = serializers.SerializerMethodField(read_only=True)
|
||||||
# result = NestedJobSerializer()
|
result = serializers.SerializerMethodField(read_only=True)
|
||||||
display = serializers.SerializerMethodField(read_only=True)
|
display = serializers.SerializerMethodField(read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Script
|
model = Script
|
||||||
fields = [
|
fields = [
|
||||||
'id', 'url', 'module', 'name', 'description', 'vars', 'display',
|
'id', 'url', 'module', 'name', 'description', 'vars', 'result', 'display',
|
||||||
]
|
]
|
||||||
|
|
||||||
@extend_schema_field(serializers.JSONField(allow_null=True))
|
@extend_schema_field(serializers.JSONField(allow_null=True))
|
||||||
@ -546,12 +547,25 @@ class ScriptSerializer(ValidatedModelSerializer):
|
|||||||
|
|
||||||
@extend_schema_field(NestedJobSerializer())
|
@extend_schema_field(NestedJobSerializer())
|
||||||
def get_result(self, obj):
|
def get_result(self, obj):
|
||||||
return f'{obj.name} ({obj.module})'
|
job = obj.jobs.all().order_by('-created').first()
|
||||||
|
context = {
|
||||||
|
'request': self.context['request']
|
||||||
|
}
|
||||||
|
data = NestedJobSerializer(job, context=context).data
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
class ScriptDetailSerializer(ScriptSerializer):
|
class ScriptDetailSerializer(ScriptSerializer):
|
||||||
# result = JobSerializer()
|
result = serializers.SerializerMethodField(read_only=True)
|
||||||
pass
|
|
||||||
|
@extend_schema_field(JobSerializer())
|
||||||
|
def get_result(self, obj):
|
||||||
|
job = obj.jobs.all().order_by('-created').first()
|
||||||
|
context = {
|
||||||
|
'request': self.context['request']
|
||||||
|
}
|
||||||
|
data = JobSerializer(job, context=context).data
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
class ScriptInputSerializer(serializers.Serializer):
|
class ScriptInputSerializer(serializers.Serializer):
|
||||||
|
@ -9,7 +9,7 @@ from rest_framework.generics import RetrieveUpdateDestroyAPIView
|
|||||||
from rest_framework.renderers import JSONRenderer
|
from rest_framework.renderers import JSONRenderer
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.routers import APIRootView
|
from rest_framework.routers import APIRootView
|
||||||
from rest_framework.viewsets import ReadOnlyModelViewSet, ViewSet
|
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet, ViewSet
|
||||||
from rq import Worker
|
from rq import Worker
|
||||||
|
|
||||||
from core.choices import JobStatusChoices
|
from core.choices import JobStatusChoices
|
||||||
@ -214,13 +214,19 @@ class ConfigTemplateViewSet(SyncedDataMixin, ConfigTemplateRenderMixin, NetBoxMo
|
|||||||
# Scripts
|
# Scripts
|
||||||
#
|
#
|
||||||
|
|
||||||
class ScriptViewSet(ViewSet):
|
class ScriptViewSet(ModelViewSet):
|
||||||
permission_classes = [IsAuthenticatedOrLoginNotRequired]
|
permission_classes = [IsAuthenticatedOrLoginNotRequired]
|
||||||
|
queryset = Script.objects.all().prefetch_related('jobs')
|
||||||
|
serializer_class = serializers.ScriptSerializer
|
||||||
|
# filterset_class = filtersets.ScriptFilterSet
|
||||||
|
|
||||||
_ignore_model_permissions = True
|
_ignore_model_permissions = True
|
||||||
schema = None
|
schema = None
|
||||||
lookup_value_regex = '[^/]+' # Allow dots
|
lookup_value_regex = '[^/]+' # Allow dots
|
||||||
|
|
||||||
def _get_script(self, pk):
|
def _get_script(self, pk):
|
||||||
|
# check if includes '.' for old module.script lookup
|
||||||
|
if '.' in pk:
|
||||||
try:
|
try:
|
||||||
module_name, script_name = pk.split('.', maxsplit=1)
|
module_name, script_name = pk.split('.', maxsplit=1)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@ -229,9 +235,14 @@ class ScriptViewSet(ViewSet):
|
|||||||
module, script = get_module_and_script(module_name, script_name)
|
module, script = get_module_and_script(module_name, script_name)
|
||||||
if script is None:
|
if script is None:
|
||||||
raise Http404
|
raise Http404
|
||||||
|
else:
|
||||||
|
pk = int(pk)
|
||||||
|
script = get_object_or_404(self.queryset, pk=pk)
|
||||||
|
module = script.module
|
||||||
|
|
||||||
return module, script
|
return module, script
|
||||||
|
|
||||||
|
'''
|
||||||
def list(self, request):
|
def list(self, request):
|
||||||
results = {
|
results = {
|
||||||
job.name: job
|
job.name: job
|
||||||
@ -252,15 +263,10 @@ class ScriptViewSet(ViewSet):
|
|||||||
serializer = serializers.ScriptSerializer(script_list, many=True, context={'request': request})
|
serializer = serializers.ScriptSerializer(script_list, many=True, context={'request': request})
|
||||||
|
|
||||||
return Response({'count': len(script_list), 'results': serializer.data})
|
return Response({'count': len(script_list), 'results': serializer.data})
|
||||||
|
'''
|
||||||
|
|
||||||
def retrieve(self, request, pk):
|
def retrieve(self, request, pk):
|
||||||
module, script = self._get_script(pk)
|
module, script = self._get_script(pk)
|
||||||
object_type = ContentType.objects.get(app_label='extras', model='scriptmodule')
|
|
||||||
script.result = Job.objects.filter(
|
|
||||||
object_type=object_type,
|
|
||||||
name=script.class_name,
|
|
||||||
status__in=JobStatusChoices.TERMINAL_STATE_CHOICES
|
|
||||||
).first()
|
|
||||||
serializer = serializers.ScriptDetailSerializer(script, context={'request': request})
|
serializer = serializers.ScriptDetailSerializer(script, context={'request': request})
|
||||||
|
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
@ -579,7 +579,7 @@ def is_variable(obj):
|
|||||||
|
|
||||||
def get_module_and_script(module_name, script_name):
|
def get_module_and_script(module_name, script_name):
|
||||||
module = ScriptModule.objects.get(file_path=f'{module_name}.py')
|
module = ScriptModule.objects.get(file_path=f'{module_name}.py')
|
||||||
script = module.scripts.get(script_name)
|
script = module.scripts.get(name=script_name)
|
||||||
return module, script
|
return module, script
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user