show ip address functions on device api view (rough first pass)

This commit is contained in:
Jamie Murphy 2023-07-07 01:15:41 +01:00
parent 4920539c52
commit 432d37dd09
2 changed files with 26 additions and 2 deletions

View File

@ -13,9 +13,9 @@ from dcim.models import *
from extras.api.nested_serializers import NestedConfigTemplateSerializer
from ipam.api.nested_serializers import (
NestedASNSerializer, NestedIPAddressSerializer, NestedL2VPNTerminationSerializer, NestedVLANSerializer,
NestedVRFSerializer,
NestedVRFSerializer, NestedIPAddressFunctionAssignmentsSerializer
)
from ipam.models import ASN, VLAN
from ipam.models import ASN, VLAN, IPAddressFunctionAssignments
from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
from netbox.api.serializers import (
GenericObjectSerializer, NestedGroupModelSerializer, NetBoxModelSerializer, ValidatedModelSerializer,
@ -668,6 +668,7 @@ class DeviceSerializer(NetBoxModelSerializer):
virtual_chassis = NestedVirtualChassisSerializer(required=False, allow_null=True, default=None)
vc_position = serializers.IntegerField(allow_null=True, max_value=255, min_value=0, default=None)
config_template = NestedConfigTemplateSerializer(required=False, allow_null=True, default=None)
ipaddressfunctions = serializers.SerializerMethodField()
class Meta:
model = Device
@ -676,6 +677,7 @@ class DeviceSerializer(NetBoxModelSerializer):
'site', 'location', 'rack', 'position', 'face', 'parent_device', 'status', 'airflow', 'primary_ip',
'primary_ip4', 'primary_ip6', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'description',
'comments', 'config_template', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated',
'ipaddressfunctions',
]
@extend_schema_field(NestedDeviceSerializer)
@ -689,6 +691,14 @@ class DeviceSerializer(NetBoxModelSerializer):
data['device_bay'] = NestedDeviceBaySerializer(instance=device_bay, context=context).data
return data
@extend_schema_field(NestedDeviceSerializer)
def get_ipaddressfunctions(self, obj):
ct = ContentType.objects.get_for_model(obj)
ipaddrfuncs = IPAddressFunctionAssignments.objects.filter(assigned_object_type=ct, assigned_object_id=obj.id)
serializer = NestedIPAddressFunctionAssignmentsSerializer
context = {'request': self.context['request']}
return serializer(ipaddrfuncs, context=context, many=True).data
class DeviceWithConfigContextSerializer(DeviceSerializer):
config_context = serializers.SerializerMethodField(read_only=True)
@ -699,6 +709,7 @@ class DeviceWithConfigContextSerializer(DeviceSerializer):
'site', 'location', 'rack', 'position', 'face', 'parent_device', 'status', 'airflow', 'primary_ip',
'primary_ip4', 'primary_ip6', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'description',
'comments', 'local_context_data', 'tags', 'custom_fields', 'config_context', 'created', 'last_updated',
'ipaddressfunctions',
]
@extend_schema_field(serializers.JSONField(allow_null=True))

View File

@ -13,6 +13,7 @@ __all__ = [
'NestedFHRPGroupSerializer',
'NestedFHRPGroupAssignmentSerializer',
'NestedIPAddressSerializer',
'NestedIPAddressFunctionAssignmentsSerializer',
'NestedIPRangeSerializer',
'NestedL2VPNSerializer',
'NestedL2VPNTerminationSerializer',
@ -205,6 +206,18 @@ class NestedIPAddressSerializer(WritableNestedSerializer):
fields = ['id', 'url', 'display', 'family', 'address']
class NestedIPAddressFunctionAssignmentsSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddressfunctionassignments-detail')
# assigned_object = serializers.SerializerMethodField(read_only=True)
assigned_ip = NestedIPAddressSerializer()
class Meta:
model = models.IPAddressFunctionAssignments
fields = [
'id', 'url', 'display', 'assigned_ip', 'function'
]
#
# Services
#