Преглед изворни кода

Remove separate config-context API endpoints; include rendered config context when retrieving a single device/VM

Jeremy Stretch пре 7 година
родитељ
комит
25b36d6d42

+ 15 - 0
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
 #

+ 7 - 5
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):

+ 13 - 0
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')
 

+ 7 - 9
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):