diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 6ef867032..a0d33d004 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -440,6 +440,21 @@ class DeviceSerializer(CustomFieldModelSerializer): return data +class DeviceWithConfigContextSerializer(DeviceSerializer): + config_context = serializers.SerializerMethodField() + + class Meta(DeviceSerializer.Meta): + fields = [ + 'id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag', + 'site', 'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6', + 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'comments', 'tags', 'custom_fields', + 'config_context', 'created', 'last_updated', + ] + + def get_config_context(self, obj): + return obj.get_config_context() + + # # Console server ports # diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index fdc72020f..e03a0693f 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -230,13 +230,15 @@ class DeviceViewSet(CustomFieldModelViewSet): ).prefetch_related( 'primary_ip4__nat_outside', 'primary_ip6__nat_outside', ) - serializer_class = serializers.DeviceSerializer filter_class = filters.DeviceFilter - @action(detail=True, url_path='config-context') - def config_context(self, request, pk): - device = get_object_or_404(Device, pk=pk) - return Response(device.get_config_context()) + def get_serializer_class(self): + """ + Include rendered config context when retrieving a single Device. + """ + if self.action == 'retrieve': + return serializers.DeviceWithConfigContextSerializer + return serializers.DeviceSerializer @action(detail=True, url_path='napalm') def napalm(self, request, pk): diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 15ed39abf..3180fc31c 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -109,6 +109,19 @@ class VirtualMachineSerializer(CustomFieldModelSerializer): ] +class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer): + config_context = serializers.SerializerMethodField() + + class Meta(VirtualMachineSerializer.Meta): + fields = [ + 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', + 'vcpus', 'memory', 'disk', 'comments', 'tags', 'custom_fields', 'config_context', 'created', 'last_updated', + ] + + def get_config_context(self, obj): + return obj.get_config_context() + + class NestedVirtualMachineSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail') diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 60afb3f9a..01b8792c8 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -1,9 +1,5 @@ from __future__ import unicode_literals -from django.shortcuts import get_object_or_404 -from rest_framework.decorators import action -from rest_framework.response import Response - from dcim.models import Interface from extras.api.views import CustomFieldModelViewSet from utilities.api import FieldChoicesViewSet, ModelViewSet @@ -50,13 +46,15 @@ class ClusterViewSet(CustomFieldModelViewSet): class VirtualMachineViewSet(CustomFieldModelViewSet): queryset = VirtualMachine.objects.all() - serializer_class = serializers.VirtualMachineSerializer filter_class = filters.VirtualMachineFilter - @action(detail=True, url_path='config-context') - def config_context(self, request, pk): - device = get_object_or_404(VirtualMachine, pk=pk) - return Response(device.get_config_context()) + def get_serializer_class(self): + """ + Include rendered config context when retrieving a single VirtualMachine. + """ + if self.action == 'retrieve': + return serializers.VirtualMachineWithConfigContextSerializer + return serializers.VirtualMachineSerializer class InterfaceViewSet(ModelViewSet):