Add support for returning plain text content

This commit is contained in:
jeremystretch 2023-02-16 20:54:49 -05:00
parent 74d6db9319
commit ccaa26343e
2 changed files with 32 additions and 5 deletions

View File

@ -5,6 +5,7 @@ from rest_framework import status
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied from rest_framework.exceptions import PermissionDenied
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
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 ReadOnlyModelViewSet, ViewSet
@ -19,10 +20,12 @@ from extras.scripts import get_script, get_scripts, run_script
from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
from netbox.api.features import SyncedDataMixin from netbox.api.features import SyncedDataMixin
from netbox.api.metadata import ContentTypeMetadata from netbox.api.metadata import ContentTypeMetadata
from netbox.api.renderers import TextRenderer
from netbox.api.viewsets import NetBoxModelViewSet from netbox.api.viewsets import NetBoxModelViewSet
from utilities.exceptions import RQWorkerNotRunningException from utilities.exceptions import RQWorkerNotRunningException
from utilities.utils import copy_safe_request, count_related from utilities.utils import copy_safe_request, count_related
from . import serializers from . import serializers
from .nested_serializers import NestedConfigTemplateSerializer
class ExtrasRootView(APIRootView): class ExtrasRootView(APIRootView):
@ -166,16 +169,24 @@ class ConfigTemplateViewSet(SyncedDataMixin, NetBoxModelViewSet):
serializer_class = serializers.ConfigTemplateSerializer serializer_class = serializers.ConfigTemplateSerializer
filterset_class = filtersets.ConfigTemplateFilterSet filterset_class = filtersets.ConfigTemplateFilterSet
@action(detail=True, methods=['post']) @action(detail=True, methods=['post'], renderer_classes=[JSONRenderer, TextRenderer])
def render(self, request, pk): def render(self, request, pk):
""" """
Render a ConfigTemplate using the context data provided (if any). Render a ConfigTemplate using the context data provided (if any). If the client requests "text/plain" data,
return the raw rendered content, rather than serialized JSON.
""" """
configtemplate = self.get_object() configtemplate = self.get_object()
output = configtemplate.render(context=request.data) output = configtemplate.render(context=request.data)
# TODO: Create a proper serializer # If the client has requested "text/plain", return the raw content.
return Response({"output": output}) if request.accepted_renderer.format == 'txt':
return Response(output)
template_serializer = NestedConfigTemplateSerializer(configtemplate, context={'request': request})
return Response({
'configtemplate': template_serializer.data,
'content': output
})
# #

View File

@ -1,4 +1,9 @@
from rest_framework.renderers import BrowsableAPIRenderer from rest_framework.renderers import BaseRenderer, BrowsableAPIRenderer
__all__ = (
'FormlessBrowsableAPIRenderer',
'TextRenderer',
)
class FormlessBrowsableAPIRenderer(BrowsableAPIRenderer): class FormlessBrowsableAPIRenderer(BrowsableAPIRenderer):
@ -10,3 +15,14 @@ class FormlessBrowsableAPIRenderer(BrowsableAPIRenderer):
def get_filter_form(self, data, view, request): def get_filter_form(self, data, view, request):
return None return None
class TextRenderer(BaseRenderer):
"""
Return raw data as plain text.
"""
media_type = 'text/plain'
format = 'txt'
def render(self, data, accepted_media_type=None, renderer_context=None):
return str(data)