mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-20 19:19:22 -06:00
Initialize dynamically-resolved serializers with nested=True
This commit is contained in:
parent
ca56c8b9ef
commit
78e284c14f
@ -2,7 +2,6 @@ from drf_spectacular.types import OpenApiTypes
|
|||||||
from drf_spectacular.utils import extend_schema_field
|
from drf_spectacular.utils import extend_schema_field
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -29,9 +28,9 @@ class ConnectedEndpointsSerializer(serializers.ModelSerializer):
|
|||||||
Return the appropriate serializer for the type of connected object.
|
Return the appropriate serializer for the type of connected object.
|
||||||
"""
|
"""
|
||||||
if endpoints := obj.connected_endpoints:
|
if endpoints := obj.connected_endpoints:
|
||||||
serializer = get_serializer_for_model(endpoints[0], prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(endpoints[0])
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(endpoints, many=True, context=context).data
|
return serializer(endpoints, nested=True, many=True, context=context).data
|
||||||
|
|
||||||
@extend_schema_field(serializers.BooleanField)
|
@extend_schema_field(serializers.BooleanField)
|
||||||
def get_connected_endpoints_reachable(self, obj):
|
def get_connected_endpoints_reachable(self, obj):
|
||||||
|
@ -8,7 +8,6 @@ from dcim.constants import *
|
|||||||
from dcim.models import Cable, CablePath, CableTermination
|
from dcim.models import Cable, CablePath, CableTermination
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField
|
from netbox.api.fields import ChoiceField, ContentTypeField
|
||||||
from netbox.api.serializers import GenericObjectSerializer, NetBoxModelSerializer
|
from netbox.api.serializers import GenericObjectSerializer, NetBoxModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from tenancy.api.serializers_.tenants import TenantSerializer
|
from tenancy.api.serializers_.tenants import TenantSerializer
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
|
|
||||||
@ -67,9 +66,9 @@ class CableTerminationSerializer(NetBoxModelSerializer):
|
|||||||
|
|
||||||
@extend_schema_field(serializers.JSONField(allow_null=True))
|
@extend_schema_field(serializers.JSONField(allow_null=True))
|
||||||
def get_termination(self, obj):
|
def get_termination(self, obj):
|
||||||
serializer = get_serializer_for_model(obj.termination, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.termination)
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(obj.termination, context=context).data
|
return serializer(obj.termination, nested=True, context=context).data
|
||||||
|
|
||||||
|
|
||||||
class CablePathSerializer(serializers.ModelSerializer):
|
class CablePathSerializer(serializers.ModelSerializer):
|
||||||
@ -83,9 +82,9 @@ class CablePathSerializer(serializers.ModelSerializer):
|
|||||||
def get_path(self, obj):
|
def get_path(self, obj):
|
||||||
ret = []
|
ret = []
|
||||||
for nodes in obj.path_objects:
|
for nodes in obj.path_objects:
|
||||||
serializer = get_serializer_for_model(nodes[0], prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(nodes[0])
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
ret.append(serializer(nodes, context=context, many=True).data)
|
ret.append(serializer(nodes, nested=True, many=True, context=context).data)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
@ -118,9 +117,9 @@ class CabledObjectSerializer(serializers.ModelSerializer):
|
|||||||
return []
|
return []
|
||||||
|
|
||||||
# Return serialized peer termination objects
|
# Return serialized peer termination objects
|
||||||
serializer = get_serializer_for_model(obj.link_peers[0], prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.link_peers[0])
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(obj.link_peers, context=context, many=True).data
|
return serializer(obj.link_peers, nested=True, many=True, context=context).data
|
||||||
|
|
||||||
@extend_schema_field(serializers.BooleanField)
|
@extend_schema_field(serializers.BooleanField)
|
||||||
def get__occupied(self, obj):
|
def get__occupied(self, obj):
|
||||||
|
@ -13,10 +13,10 @@ from ipam.api.serializers_.vrfs import VRFSerializer
|
|||||||
from ipam.models import VLAN
|
from ipam.models import VLAN
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
|
from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
|
||||||
from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer
|
from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer
|
from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer
|
||||||
from wireless.api.nested_serializers import NestedWirelessLinkSerializer
|
from wireless.api.nested_serializers import NestedWirelessLinkSerializer
|
||||||
|
from wireless.api.serializers_.wirelesslans import WirelessLANSerializer
|
||||||
from wireless.choices import *
|
from wireless.choices import *
|
||||||
from wireless.models import WirelessLAN
|
from wireless.models import WirelessLAN
|
||||||
from .base import ConnectedEndpointsSerializer
|
from .base import ConnectedEndpointsSerializer
|
||||||
@ -24,7 +24,6 @@ from .cables import CabledObjectSerializer
|
|||||||
from .devices import DeviceSerializer, ModuleSerializer, VirtualDeviceContextSerializer
|
from .devices import DeviceSerializer, ModuleSerializer, VirtualDeviceContextSerializer
|
||||||
from .manufacturers import ManufacturerSerializer
|
from .manufacturers import ManufacturerSerializer
|
||||||
from .roles import InventoryItemRoleSerializer
|
from .roles import InventoryItemRoleSerializer
|
||||||
from wireless.api.serializers_.wirelesslans import WirelessLANSerializer
|
|
||||||
from ..nested_serializers import *
|
from ..nested_serializers import *
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -364,6 +363,6 @@ class InventoryItemSerializer(NetBoxModelSerializer):
|
|||||||
def get_component(self, obj):
|
def get_component(self, obj):
|
||||||
if obj.component is None:
|
if obj.component is None:
|
||||||
return None
|
return None
|
||||||
serializer = get_serializer_for_model(obj.component, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.component)
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(obj.component, context=context).data
|
return serializer(obj.component, nested=True, context=context).data
|
||||||
|
@ -10,7 +10,6 @@ from dcim.models import (
|
|||||||
)
|
)
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField
|
from netbox.api.fields import ChoiceField, ContentTypeField
|
||||||
from netbox.api.serializers import ValidatedModelSerializer
|
from netbox.api.serializers import ValidatedModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from wireless.choices import *
|
from wireless.choices import *
|
||||||
from .devicetypes import DeviceTypeSerializer, ModuleTypeSerializer
|
from .devicetypes import DeviceTypeSerializer, ModuleTypeSerializer
|
||||||
@ -323,6 +322,6 @@ class InventoryItemTemplateSerializer(ValidatedModelSerializer):
|
|||||||
def get_component(self, obj):
|
def get_component(self, obj):
|
||||||
if obj.component is None:
|
if obj.component is None:
|
||||||
return None
|
return None
|
||||||
serializer = get_serializer_for_model(obj.component, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.component)
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(obj.component, context=context).data
|
return serializer(obj.component, nested=True, context=context).data
|
||||||
|
@ -7,7 +7,6 @@ from rest_framework.response import Response
|
|||||||
from rest_framework.routers import APIRootView
|
from rest_framework.routers import APIRootView
|
||||||
from rest_framework.viewsets import ViewSet
|
from rest_framework.viewsets import ViewSet
|
||||||
|
|
||||||
from circuits.models import Circuit
|
|
||||||
from dcim import filtersets
|
from dcim import filtersets
|
||||||
from dcim.constants import CABLE_TRACE_SVG_DEFAULT_WIDTH
|
from dcim.constants import CABLE_TRACE_SVG_DEFAULT_WIDTH
|
||||||
from dcim.models import *
|
from dcim.models import *
|
||||||
@ -18,10 +17,8 @@ from netbox.api.metadata import ContentTypeMetadata
|
|||||||
from netbox.api.pagination import StripCountAnnotationsPaginator
|
from netbox.api.pagination import StripCountAnnotationsPaginator
|
||||||
from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin
|
from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin
|
||||||
from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin
|
from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from utilities.query_functions import CollateAsChar
|
from utilities.query_functions import CollateAsChar
|
||||||
from utilities.utils import count_related
|
|
||||||
from . import serializers
|
from . import serializers
|
||||||
from .exceptions import MissingFilterException
|
from .exceptions import MissingFilterException
|
||||||
|
|
||||||
@ -60,16 +57,16 @@ class PathEndpointMixin(object):
|
|||||||
# Serialize path objects, iterating over each three-tuple in the path
|
# Serialize path objects, iterating over each three-tuple in the path
|
||||||
for near_ends, cable, far_ends in obj.trace():
|
for near_ends, cable, far_ends in obj.trace():
|
||||||
if near_ends:
|
if near_ends:
|
||||||
serializer_a = get_serializer_for_model(near_ends[0], prefix=NESTED_SERIALIZER_PREFIX)
|
serializer_a = get_serializer_for_model(near_ends[0])
|
||||||
near_ends = serializer_a(near_ends, many=True, context={'request': request}).data
|
near_ends = serializer_a(near_ends, nested=True, many=True, context={'request': request}).data
|
||||||
else:
|
else:
|
||||||
# Path is split; stop here
|
# Path is split; stop here
|
||||||
break
|
break
|
||||||
if cable:
|
if cable:
|
||||||
cable = serializers.TracedCableSerializer(cable[0], context={'request': request}).data
|
cable = serializers.TracedCableSerializer(cable[0], context={'request': request}).data
|
||||||
if far_ends:
|
if far_ends:
|
||||||
serializer_b = get_serializer_for_model(far_ends[0], prefix=NESTED_SERIALIZER_PREFIX)
|
serializer_b = get_serializer_for_model(far_ends[0])
|
||||||
far_ends = serializer_b(far_ends, many=True, context={'request': request}).data
|
far_ends = serializer_b(far_ends, nested=True, many=True, context={'request': request}).data
|
||||||
|
|
||||||
path.append((near_ends, cable, far_ends))
|
path.append((near_ends, cable, far_ends))
|
||||||
|
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
from drf_spectacular.utils import extend_schema_field
|
|
||||||
from drf_spectacular.types import OpenApiTypes
|
from drf_spectacular.types import OpenApiTypes
|
||||||
|
from drf_spectacular.utils import extend_schema_field
|
||||||
from rest_framework.fields import Field
|
from rest_framework.fields import Field
|
||||||
from rest_framework.serializers import ValidationError
|
from rest_framework.serializers import ValidationError
|
||||||
|
|
||||||
from extras.choices import CustomFieldTypeChoices
|
from extras.choices import CustomFieldTypeChoices
|
||||||
from extras.models import CustomField
|
from extras.models import CustomField
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
|
|
||||||
|
|
||||||
@ -58,11 +57,11 @@ class CustomFieldsDataField(Field):
|
|||||||
for cf in self._get_custom_fields():
|
for cf in self._get_custom_fields():
|
||||||
value = cf.deserialize(obj.get(cf.name))
|
value = cf.deserialize(obj.get(cf.name))
|
||||||
if value is not None and cf.type == CustomFieldTypeChoices.TYPE_OBJECT:
|
if value is not None and cf.type == CustomFieldTypeChoices.TYPE_OBJECT:
|
||||||
serializer = get_serializer_for_model(cf.object_type.model_class(), prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(cf.object_type.model_class())
|
||||||
value = serializer(value, context=self.parent.context).data
|
value = serializer(value, nested=True, context=self.parent.context).data
|
||||||
elif value is not None and cf.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT:
|
elif value is not None and cf.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT:
|
||||||
serializer = get_serializer_for_model(cf.object_type.model_class(), prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(cf.object_type.model_class())
|
||||||
value = serializer(value, many=True, context=self.parent.context).data
|
value = serializer(value, nested=True, many=True, context=self.parent.context).data
|
||||||
data[cf.name] = value
|
data[cf.name] = value
|
||||||
|
|
||||||
return data
|
return data
|
||||||
@ -80,12 +79,9 @@ class CustomFieldsDataField(Field):
|
|||||||
CustomFieldTypeChoices.TYPE_OBJECT,
|
CustomFieldTypeChoices.TYPE_OBJECT,
|
||||||
CustomFieldTypeChoices.TYPE_MULTIOBJECT
|
CustomFieldTypeChoices.TYPE_MULTIOBJECT
|
||||||
):
|
):
|
||||||
serializer_class = get_serializer_for_model(
|
serializer_class = get_serializer_for_model(cf.object_type.model_class())
|
||||||
model=cf.object_type.model_class(),
|
|
||||||
prefix=NESTED_SERIALIZER_PREFIX
|
|
||||||
)
|
|
||||||
many = cf.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT
|
many = cf.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT
|
||||||
serializer = serializer_class(data=data[cf.name], many=many, context=self.parent.context)
|
serializer = serializer_class(data=data[cf.name], nested=True, many=many, context=self.parent.context)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
data[cf.name] = [obj['id'] for obj in serializer.data] if many else serializer.data['id']
|
data[cf.name] = [obj['id'] for obj in serializer.data] if many else serializer.data['id']
|
||||||
else:
|
else:
|
||||||
|
@ -6,7 +6,6 @@ from core.models import ContentType
|
|||||||
from extras.models import ImageAttachment
|
from extras.models import ImageAttachment
|
||||||
from netbox.api.fields import ContentTypeField
|
from netbox.api.fields import ContentTypeField
|
||||||
from netbox.api.serializers import ValidatedModelSerializer
|
from netbox.api.serializers import ValidatedModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -46,5 +45,6 @@ class ImageAttachmentSerializer(ValidatedModelSerializer):
|
|||||||
|
|
||||||
@extend_schema_field(serializers.JSONField(allow_null=True))
|
@extend_schema_field(serializers.JSONField(allow_null=True))
|
||||||
def get_parent(self, obj):
|
def get_parent(self, obj):
|
||||||
serializer = get_serializer_for_model(obj.parent, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.parent)
|
||||||
return serializer(obj.parent, context={'request': self.context['request']}).data
|
context = {'request': self.context['request']}
|
||||||
|
return serializer(obj.parent, nested=True, context=context).data
|
||||||
|
@ -5,7 +5,6 @@ from core.models import ContentType
|
|||||||
from extras.models import Bookmark
|
from extras.models import Bookmark
|
||||||
from netbox.api.fields import ContentTypeField
|
from netbox.api.fields import ContentTypeField
|
||||||
from netbox.api.serializers import ValidatedModelSerializer
|
from netbox.api.serializers import ValidatedModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from users.api.serializers_.users import UserSerializer
|
from users.api.serializers_.users import UserSerializer
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
|
|
||||||
@ -31,5 +30,6 @@ class BookmarkSerializer(ValidatedModelSerializer):
|
|||||||
|
|
||||||
@extend_schema_field(serializers.JSONField(allow_null=True))
|
@extend_schema_field(serializers.JSONField(allow_null=True))
|
||||||
def get_object(self, instance):
|
def get_object(self, instance):
|
||||||
serializer = get_serializer_for_model(instance.object, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(instance.object)
|
||||||
return serializer(instance.object, context={'request': self.context['request']}).data
|
context = {'request': self.context['request']}
|
||||||
|
return serializer(instance.object, nested=True, context=context).data
|
||||||
|
@ -6,7 +6,6 @@ from extras.models import ObjectChange
|
|||||||
from netbox.api.exceptions import SerializerNotFound
|
from netbox.api.exceptions import SerializerNotFound
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField
|
from netbox.api.fields import ChoiceField, ContentTypeField
|
||||||
from netbox.api.serializers import BaseModelSerializer
|
from netbox.api.serializers import BaseModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from users.api.serializers_.users import UserSerializer
|
from users.api.serializers_.users import UserSerializer
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
|
|
||||||
@ -48,12 +47,9 @@ class ObjectChangeSerializer(BaseModelSerializer):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
serializer = get_serializer_for_model(obj.changed_object, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.changed_object)
|
||||||
except SerializerNotFound:
|
except SerializerNotFound:
|
||||||
return obj.object_repr
|
return obj.object_repr
|
||||||
context = {
|
data = serializer(obj.changed_object, nested=True, context={'request': self.context['request']}).data
|
||||||
'request': self.context['request']
|
|
||||||
}
|
|
||||||
data = serializer(obj.changed_object, context=context).data
|
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
@ -7,7 +7,6 @@ from extras.choices import *
|
|||||||
from extras.models import EventRule, Webhook
|
from extras.models import EventRule, Webhook
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField
|
from netbox.api.fields import ChoiceField, ContentTypeField
|
||||||
from netbox.api.serializers import NetBoxModelSerializer
|
from netbox.api.serializers import NetBoxModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from .scripts import ScriptSerializer
|
from .scripts import ScriptSerializer
|
||||||
|
|
||||||
@ -51,11 +50,8 @@ class EventRuleSerializer(NetBoxModelSerializer):
|
|||||||
instance = script.python_class() if script.python_class else None
|
instance = script.python_class() if script.python_class else None
|
||||||
return ScriptSerializer(instance, nested=True, context=context).data
|
return ScriptSerializer(instance, nested=True, context=context).data
|
||||||
else:
|
else:
|
||||||
serializer = get_serializer_for_model(
|
serializer = get_serializer_for_model(instance.action_object_type.model_class())
|
||||||
model=instance.action_object_type.model_class(),
|
return serializer(instance.action_object, nested=True, context=context).data
|
||||||
prefix=NESTED_SERIALIZER_PREFIX
|
|
||||||
)
|
|
||||||
return serializer(instance.action_object, context=context).data
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -8,7 +8,6 @@ from extras.choices import *
|
|||||||
from extras.models import JournalEntry
|
from extras.models import JournalEntry
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField
|
from netbox.api.fields import ChoiceField, ContentTypeField
|
||||||
from netbox.api.serializers import NetBoxModelSerializer
|
from netbox.api.serializers import NetBoxModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -59,9 +58,6 @@ class JournalEntrySerializer(NetBoxModelSerializer):
|
|||||||
|
|
||||||
@extend_schema_field(serializers.JSONField(allow_null=True))
|
@extend_schema_field(serializers.JSONField(allow_null=True))
|
||||||
def get_assigned_object(self, instance):
|
def get_assigned_object(self, instance):
|
||||||
serializer = get_serializer_for_model(
|
serializer = get_serializer_for_model(instance.assigned_object_type.model_class())
|
||||||
instance.assigned_object_type.model_class(),
|
|
||||||
prefix=NESTED_SERIALIZER_PREFIX
|
|
||||||
)
|
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(instance.assigned_object, context=context).data
|
return serializer(instance.assigned_object, nested=True, context=context).data
|
||||||
|
@ -5,7 +5,6 @@ from rest_framework import serializers
|
|||||||
from ipam.models import FHRPGroup, FHRPGroupAssignment
|
from ipam.models import FHRPGroup, FHRPGroupAssignment
|
||||||
from netbox.api.fields import ContentTypeField
|
from netbox.api.fields import ContentTypeField
|
||||||
from netbox.api.serializers import NetBoxModelSerializer
|
from netbox.api.serializers import NetBoxModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from .ip import IPAddressSerializer
|
from .ip import IPAddressSerializer
|
||||||
|
|
||||||
@ -48,6 +47,6 @@ class FHRPGroupAssignmentSerializer(NetBoxModelSerializer):
|
|||||||
def get_interface(self, obj):
|
def get_interface(self, obj):
|
||||||
if obj.interface is None:
|
if obj.interface is None:
|
||||||
return None
|
return None
|
||||||
serializer = get_serializer_for_model(obj.interface, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.interface)
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(obj.interface, context=context).data
|
return serializer(obj.interface, nested=True, context=context).data
|
||||||
|
@ -8,16 +8,14 @@ from ipam.constants import IPADDRESS_ASSIGNMENT_MODELS
|
|||||||
from ipam.models import Aggregate, IPAddress, IPRange, Prefix
|
from ipam.models import Aggregate, IPAddress, IPRange, Prefix
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField
|
from netbox.api.fields import ChoiceField, ContentTypeField
|
||||||
from netbox.api.serializers import NetBoxModelSerializer
|
from netbox.api.serializers import NetBoxModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from tenancy.api.serializers_.tenants import TenantSerializer
|
from tenancy.api.serializers_.tenants import TenantSerializer
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from ..field_serializers import IPAddressField, IPNetworkField
|
|
||||||
from ..nested_serializers import *
|
|
||||||
|
|
||||||
from .asns import RIRSerializer
|
from .asns import RIRSerializer
|
||||||
from .vrfs import VRFSerializer
|
|
||||||
from .roles import RoleSerializer
|
from .roles import RoleSerializer
|
||||||
from .vlans import VLANSerializer
|
from .vlans import VLANSerializer
|
||||||
|
from .vrfs import VRFSerializer
|
||||||
|
from ..field_serializers import IPAddressField, IPNetworkField
|
||||||
|
from ..nested_serializers import *
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'AggregateSerializer',
|
'AggregateSerializer',
|
||||||
@ -174,9 +172,9 @@ class IPAddressSerializer(NetBoxModelSerializer):
|
|||||||
def get_assigned_object(self, obj):
|
def get_assigned_object(self, obj):
|
||||||
if obj.assigned_object is None:
|
if obj.assigned_object is None:
|
||||||
return None
|
return None
|
||||||
serializer = get_serializer_for_model(obj.assigned_object, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.assigned_object)
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(obj.assigned_object, context=context).data
|
return serializer(obj.assigned_object, nested=True, context=context).data
|
||||||
|
|
||||||
|
|
||||||
class AvailableIPSerializer(serializers.Serializer):
|
class AvailableIPSerializer(serializers.Serializer):
|
||||||
|
@ -8,11 +8,9 @@ from ipam.constants import VLANGROUP_SCOPE_TYPES
|
|||||||
from ipam.models import VLAN, VLANGroup
|
from ipam.models import VLAN, VLANGroup
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
|
from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
|
||||||
from netbox.api.serializers import NetBoxModelSerializer
|
from netbox.api.serializers import NetBoxModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from tenancy.api.serializers_.tenants import TenantSerializer
|
from tenancy.api.serializers_.tenants import TenantSerializer
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer
|
from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer
|
||||||
|
|
||||||
from .roles import RoleSerializer
|
from .roles import RoleSerializer
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -53,10 +51,9 @@ class VLANGroupSerializer(NetBoxModelSerializer):
|
|||||||
def get_scope(self, obj):
|
def get_scope(self, obj):
|
||||||
if obj.scope_id is None:
|
if obj.scope_id is None:
|
||||||
return None
|
return None
|
||||||
serializer = get_serializer_for_model(obj.scope, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.scope)
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
|
return serializer(obj.scope, nested=True, context=context).data
|
||||||
return serializer(obj.scope, context=context).data
|
|
||||||
|
|
||||||
|
|
||||||
class VLANSerializer(NetBoxModelSerializer):
|
class VLANSerializer(NetBoxModelSerializer):
|
||||||
|
@ -3,7 +3,6 @@ from drf_spectacular.utils import extend_schema_field
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from netbox.api.fields import ContentTypeField
|
from netbox.api.fields import ContentTypeField
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from utilities.utils import content_type_identifier
|
from utilities.utils import content_type_identifier
|
||||||
|
|
||||||
@ -40,6 +39,5 @@ class GenericObjectSerializer(serializers.Serializer):
|
|||||||
|
|
||||||
@extend_schema_field(serializers.JSONField(allow_null=True))
|
@extend_schema_field(serializers.JSONField(allow_null=True))
|
||||||
def get_object(self, obj):
|
def get_object(self, obj):
|
||||||
serializer = get_serializer_for_model(obj, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj)
|
||||||
# context = {'request': self.context['request']}
|
return serializer(obj, nested=True, context=self.context).data
|
||||||
return serializer(obj, context=self.context).data
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
# Prefix for nested serializers
|
# Prefix for nested serializers
|
||||||
|
# TODO: Remove in v4.1
|
||||||
NESTED_SERIALIZER_PREFIX = 'Nested'
|
NESTED_SERIALIZER_PREFIX = 'Nested'
|
||||||
|
|
||||||
# RQ queue names
|
# RQ queue names
|
||||||
|
@ -5,7 +5,6 @@ from rest_framework import serializers
|
|||||||
|
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField
|
from netbox.api.fields import ChoiceField, ContentTypeField
|
||||||
from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer
|
from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from tenancy.choices import ContactPriorityChoices
|
from tenancy.choices import ContactPriorityChoices
|
||||||
from tenancy.models import ContactAssignment, Contact, ContactGroup, ContactRole
|
from tenancy.models import ContactAssignment, Contact, ContactGroup, ContactRole
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
@ -77,6 +76,6 @@ class ContactAssignmentSerializer(NetBoxModelSerializer):
|
|||||||
|
|
||||||
@extend_schema_field(OpenApiTypes.OBJECT)
|
@extend_schema_field(OpenApiTypes.OBJECT)
|
||||||
def get_object(self, instance):
|
def get_object(self, instance):
|
||||||
serializer = get_serializer_for_model(instance.content_type.model_class(), prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(instance.content_type.model_class())
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(instance.object, context=context).data
|
return serializer(instance.object, nested=True, context=context).data
|
||||||
|
@ -6,7 +6,6 @@ from ipam.api.serializers_.vrfs import RouteTargetSerializer
|
|||||||
from ipam.models import RouteTarget
|
from ipam.models import RouteTarget
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
|
from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
|
||||||
from netbox.api.serializers import NetBoxModelSerializer
|
from netbox.api.serializers import NetBoxModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from tenancy.api.serializers_.tenants import TenantSerializer
|
from tenancy.api.serializers_.tenants import TenantSerializer
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from vpn.choices import *
|
from vpn.choices import *
|
||||||
@ -66,6 +65,6 @@ class L2VPNTerminationSerializer(NetBoxModelSerializer):
|
|||||||
|
|
||||||
@extend_schema_field(serializers.JSONField(allow_null=True))
|
@extend_schema_field(serializers.JSONField(allow_null=True))
|
||||||
def get_assigned_object(self, instance):
|
def get_assigned_object(self, instance):
|
||||||
serializer = get_serializer_for_model(instance.assigned_object, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(instance.assigned_object)
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(instance.assigned_object, context=context).data
|
return serializer(instance.assigned_object, nested=True, context=context).data
|
||||||
|
@ -5,12 +5,10 @@ from rest_framework import serializers
|
|||||||
from ipam.api.serializers_.ip import IPAddressSerializer
|
from ipam.api.serializers_.ip import IPAddressSerializer
|
||||||
from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
|
from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
|
||||||
from netbox.api.serializers import NetBoxModelSerializer
|
from netbox.api.serializers import NetBoxModelSerializer
|
||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
|
||||||
from tenancy.api.serializers_.tenants import TenantSerializer
|
from tenancy.api.serializers_.tenants import TenantSerializer
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from vpn.choices import *
|
from vpn.choices import *
|
||||||
from vpn.models import Tunnel, TunnelGroup, TunnelTermination
|
from vpn.models import Tunnel, TunnelGroup, TunnelTermination
|
||||||
|
|
||||||
from .crypto import IPSecProfileSerializer
|
from .crypto import IPSecProfileSerializer
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -109,6 +107,6 @@ class TunnelTerminationSerializer(NetBoxModelSerializer):
|
|||||||
|
|
||||||
@extend_schema_field(serializers.JSONField(allow_null=True))
|
@extend_schema_field(serializers.JSONField(allow_null=True))
|
||||||
def get_termination(self, obj):
|
def get_termination(self, obj):
|
||||||
serializer = get_serializer_for_model(obj.termination, prefix=NESTED_SERIALIZER_PREFIX)
|
serializer = get_serializer_for_model(obj.termination)
|
||||||
context = {'request': self.context['request']}
|
context = {'request': self.context['request']}
|
||||||
return serializer(obj.termination, context=context).data
|
return serializer(obj.termination, nested=True, context=context).data
|
||||||
|
Loading…
Reference in New Issue
Block a user