From b5a51aced37db1dbca839498de9dfca83832c544 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 15 Nov 2017 12:21:52 -0500 Subject: [PATCH] Fixes #1645: Simplified interface serialzier for IP addresses and optimized API view queryset --- netbox/ipam/api/serializers.py | 18 +++++++++++++++--- netbox/ipam/api/views.py | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index e520daa4c..75fbfbe49 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -3,9 +3,11 @@ from __future__ import unicode_literals from collections import OrderedDict from rest_framework import serializers +from rest_framework.reverse import reverse from rest_framework.validators import UniqueTogetherValidator from dcim.api.serializers import NestedDeviceSerializer, InterfaceSerializer, NestedSiteSerializer +from dcim.models import Interface from extras.api.customfields import CustomFieldModelSerializer from ipam.constants import ( IPADDRESS_ROLE_CHOICES, IPADDRESS_STATUS_CHOICES, IP_PROTOCOL_CHOICES, PREFIX_STATUS_CHOICES, VLAN_STATUS_CHOICES, @@ -255,15 +257,25 @@ class AvailablePrefixSerializer(serializers.Serializer): # IP addresses # -class IPAddressInterfaceSerializer(InterfaceSerializer): +class IPAddressInterfaceSerializer(serializers.ModelSerializer): + url = serializers.SerializerMethodField() # We're imitating a HyperlinkedIdentityField here + device = NestedDeviceSerializer() virtual_machine = NestedVirtualMachineSerializer() class Meta(InterfaceSerializer.Meta): + model = Interface fields = [ - 'id', 'device', 'virtual_machine', 'name', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', - 'mgmt_only', 'description', 'is_connected', 'interface_connection', 'circuit_termination', + 'id', 'url', 'device', 'virtual_machine', 'name', ] + def get_url(self, obj): + """ + Return a link to the Interface via either the DCIM API if the parent is a Device, or via the virtualization API + if the parent is a VirtualMachine. + """ + url_name = 'dcim-api:interface-detail' if obj.device else 'virtualization-api:interface-detail' + return reverse(url_name, kwargs={'pk': obj.pk}, request=self.context['request']) + class IPAddressSerializer(CustomFieldModelSerializer): vrf = NestedVRFSerializer() diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index b326b8ea6..2fe42a9ff 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -219,9 +219,9 @@ class PrefixViewSet(CustomFieldModelViewSet): class IPAddressViewSet(CustomFieldModelViewSet): queryset = IPAddress.objects.select_related( - 'vrf__tenant', 'tenant', 'nat_inside' + 'vrf__tenant', 'tenant', 'nat_inside', 'interface__device__device_type', 'interface__virtual_machine' ).prefetch_related( - 'interface__device', 'interface__virtual_machine' + 'nat_outside' ) serializer_class = serializers.IPAddressSerializer write_serializer_class = serializers.WritableIPAddressSerializer