Closes #17143: Deprecate the use of dedicated nested API serializers

This commit is contained in:
Jeremy Stretch 2024-08-14 15:26:16 -04:00
parent b3dfe8622d
commit 0f37da1523
40 changed files with 345 additions and 217 deletions

View File

@ -1,9 +1,11 @@
import warnings
from drf_spectacular.utils import extend_schema_serializer from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers
from circuits.models import * from circuits.models import *
from netbox.api.fields import RelatedObjectCountField from netbox.api.fields import RelatedObjectCountField
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
from .serializers_.nested import NestedProviderAccountSerializer
__all__ = [ __all__ = [
'NestedCircuitSerializer', 'NestedCircuitSerializer',
@ -14,6 +16,12 @@ __all__ = [
'NestedProviderAccountSerializer', 'NestedProviderAccountSerializer',
] ]
# TODO: Remove in v4.2
warnings.warn(
f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
)
# #
# Provider networks # Provider networks
@ -41,17 +49,6 @@ class NestedProviderSerializer(WritableNestedSerializer):
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'circuit_count'] fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'circuit_count']
#
# Provider Accounts
#
class NestedProviderAccountSerializer(WritableNestedSerializer):
class Meta:
model = ProviderAccount
fields = ['id', 'url', 'display_url', 'display', 'name', 'account']
# #
# Circuits # Circuits
# #

View File

@ -1,3 +1,2 @@
from .serializers_.providers import * from .serializers_.providers import *
from .serializers_.circuits import * from .serializers_.circuits import *
from .nested_serializers import *

View File

@ -0,0 +1,13 @@
from circuits.models import ProviderAccount
from netbox.api.serializers import WritableNestedSerializer
__all__ = (
'NestedProviderAccountSerializer',
)
class NestedProviderAccountSerializer(WritableNestedSerializer):
class Meta:
model = ProviderAccount
fields = ['id', 'url', 'display_url', 'display', 'name', 'account']

View File

@ -5,7 +5,7 @@ from ipam.api.serializers_.asns import ASNSerializer
from ipam.models import ASN from ipam.models import ASN
from netbox.api.fields import RelatedObjectCountField, SerializedPKRelatedField from netbox.api.fields import RelatedObjectCountField, SerializedPKRelatedField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from ..nested_serializers import * from .nested import NestedProviderAccountSerializer
__all__ = ( __all__ = (
'ProviderAccountSerializer', 'ProviderAccountSerializer',

View File

@ -1,3 +1,5 @@
import warnings
from rest_framework import serializers from rest_framework import serializers
from core.choices import JobStatusChoices from core.choices import JobStatusChoices
@ -12,6 +14,12 @@ __all__ = (
'NestedJobSerializer', 'NestedJobSerializer',
) )
# TODO: Remove in v4.2
warnings.warn(
f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
)
class NestedDataSourceSerializer(WritableNestedSerializer): class NestedDataSourceSerializer(WritableNestedSerializer):

View File

@ -1,4 +1,3 @@
from .serializers_.change_logging import * from .serializers_.change_logging import *
from .serializers_.data import * from .serializers_.data import *
from .serializers_.jobs import * from .serializers_.jobs import *
from .nested_serializers import *

View File

@ -1,9 +1,15 @@
import warnings
from drf_spectacular.utils import extend_schema_serializer from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers from rest_framework import serializers
from dcim import models from dcim import models
from netbox.api.fields import RelatedObjectCountField from netbox.api.fields import RelatedObjectCountField
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
from .serializers_.nested import (
NestedDeviceBaySerializer, NestedDeviceSerializer, NestedInterfaceSerializer, NestedInterfaceTemplateSerializer,
NestedLocationSerializer, NestedModuleBaySerializer, NestedRegionSerializer, NestedSiteGroupSerializer,
)
__all__ = [ __all__ = [
'NestedCableSerializer', 'NestedCableSerializer',
@ -48,35 +54,17 @@ __all__ = [
'NestedVirtualDeviceContextSerializer', 'NestedVirtualDeviceContextSerializer',
] ]
# TODO: Remove in v4.2
warnings.warn(
f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
)
# #
# Regions/sites # Regions/sites
# #
@extend_schema_serializer(
exclude_fields=('site_count',),
)
class NestedRegionSerializer(WritableNestedSerializer):
site_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = models.Region
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'site_count', '_depth']
@extend_schema_serializer(
exclude_fields=('site_count',),
)
class NestedSiteGroupSerializer(WritableNestedSerializer):
site_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = models.SiteGroup
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'site_count', '_depth']
class NestedSiteSerializer(WritableNestedSerializer): class NestedSiteSerializer(WritableNestedSerializer):
class Meta: class Meta:
@ -88,18 +76,6 @@ class NestedSiteSerializer(WritableNestedSerializer):
# Racks # Racks
# #
@extend_schema_serializer(
exclude_fields=('rack_count',),
)
class NestedLocationSerializer(WritableNestedSerializer):
rack_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = models.Location
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'rack_count', '_depth']
@extend_schema_serializer( @extend_schema_serializer(
exclude_fields=('rack_count',), exclude_fields=('rack_count',),
) )
@ -200,13 +176,6 @@ class NestedPowerOutletTemplateSerializer(WritableNestedSerializer):
fields = ['id', 'url', 'display_url', 'display', 'name'] fields = ['id', 'url', 'display_url', 'display', 'name']
class NestedInterfaceTemplateSerializer(WritableNestedSerializer):
class Meta:
model = models.InterfaceTemplate
fields = ['id', 'url', 'display_url', 'display', 'name']
class NestedRearPortTemplateSerializer(WritableNestedSerializer): class NestedRearPortTemplateSerializer(WritableNestedSerializer):
class Meta: class Meta:
@ -271,13 +240,6 @@ class NestedPlatformSerializer(WritableNestedSerializer):
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count'] fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count']
class NestedDeviceSerializer(WritableNestedSerializer):
class Meta:
model = models.Device
fields = ['id', 'url', 'display_url', 'display', 'name']
class ModuleNestedModuleBaySerializer(WritableNestedSerializer): class ModuleNestedModuleBaySerializer(WritableNestedSerializer):
class Meta: class Meta:
@ -285,13 +247,6 @@ class ModuleNestedModuleBaySerializer(WritableNestedSerializer):
fields = ['id', 'url', 'display_url', 'display', 'name'] fields = ['id', 'url', 'display_url', 'display', 'name']
class ModuleBayNestedModuleSerializer(WritableNestedSerializer):
class Meta:
model = models.Module
fields = ['id', 'url', 'display_url', 'display', 'serial']
class NestedModuleSerializer(WritableNestedSerializer): class NestedModuleSerializer(WritableNestedSerializer):
device = NestedDeviceSerializer(read_only=True) device = NestedDeviceSerializer(read_only=True)
module_bay = ModuleNestedModuleBaySerializer(read_only=True) module_bay = ModuleNestedModuleBaySerializer(read_only=True)
@ -338,15 +293,6 @@ class NestedPowerPortSerializer(WritableNestedSerializer):
fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied']
class NestedInterfaceSerializer(WritableNestedSerializer):
device = NestedDeviceSerializer(read_only=True)
_occupied = serializers.BooleanField(required=False, read_only=True)
class Meta:
model = models.Interface
fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied']
class NestedRearPortSerializer(WritableNestedSerializer): class NestedRearPortSerializer(WritableNestedSerializer):
device = NestedDeviceSerializer(read_only=True) device = NestedDeviceSerializer(read_only=True)
_occupied = serializers.BooleanField(required=False, read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True)
@ -365,22 +311,6 @@ class NestedFrontPortSerializer(WritableNestedSerializer):
fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied']
class NestedModuleBaySerializer(WritableNestedSerializer):
installed_module = ModuleBayNestedModuleSerializer(required=False, allow_null=True)
class Meta:
model = models.ModuleBay
fields = ['id', 'url', 'display_url', 'display', 'installed_module', 'name']
class NestedDeviceBaySerializer(WritableNestedSerializer):
device = NestedDeviceSerializer(read_only=True)
class Meta:
model = models.DeviceBay
fields = ['id', 'url', 'display_url', 'display', 'device', 'name']
class NestedInventoryItemSerializer(WritableNestedSerializer): class NestedInventoryItemSerializer(WritableNestedSerializer):
device = NestedDeviceSerializer(read_only=True) device = NestedDeviceSerializer(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True) _depth = serializers.IntegerField(source='level', read_only=True)

View File

@ -11,4 +11,3 @@ from .serializers_.devices import *
from .serializers_.device_components import * from .serializers_.device_components import *
from .serializers_.power import * from .serializers_.power import *
from .serializers_.rackunits import * from .serializers_.rackunits import *
from .nested_serializers import *

View File

@ -15,7 +15,7 @@ from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelated
from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer
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.serializers_.nested import NestedWirelessLinkSerializer
from wireless.api.serializers_.wirelesslans import WirelessLANSerializer 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
@ -23,8 +23,8 @@ from .base import ConnectedEndpointsSerializer
from .cables import CabledObjectSerializer 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 .nested import NestedInterfaceSerializer
from .roles import InventoryItemRoleSerializer from .roles import InventoryItemRoleSerializer
from ..nested_serializers import *
__all__ = ( __all__ = (
'ConsolePortSerializer', 'ConsolePortSerializer',

View File

@ -16,9 +16,9 @@ from .devicetypes import *
from .platforms import PlatformSerializer from .platforms import PlatformSerializer
from .racks import RackSerializer from .racks import RackSerializer
from .roles import DeviceRoleSerializer from .roles import DeviceRoleSerializer
from .nested import NestedDeviceBaySerializer, NestedDeviceSerializer, NestedModuleBaySerializer
from .sites import LocationSerializer, SiteSerializer from .sites import LocationSerializer, SiteSerializer
from .virtualchassis import VirtualChassisSerializer from .virtualchassis import VirtualChassisSerializer
from ..nested_serializers import *
__all__ = ( __all__ = (
'DeviceSerializer', 'DeviceSerializer',

View File

@ -14,8 +14,8 @@ 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
from .manufacturers import ManufacturerSerializer from .manufacturers import ManufacturerSerializer
from .nested import NestedInterfaceTemplateSerializer
from .roles import InventoryItemRoleSerializer from .roles import InventoryItemRoleSerializer
from ..nested_serializers import *
__all__ = ( __all__ = (
'ConsolePortTemplateSerializer', 'ConsolePortTemplateSerializer',

View File

@ -0,0 +1,98 @@
from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers
from netbox.api.serializers import WritableNestedSerializer
from dcim import models
__all__ = (
'NestedDeviceBaySerializer',
'NestedDeviceSerializer',
'NestedInterfaceSerializer',
'NestedInterfaceTemplateSerializer',
'NestedLocationSerializer',
'NestedModuleBaySerializer',
'NestedRegionSerializer',
'NestedSiteGroupSerializer',
)
@extend_schema_serializer(
exclude_fields=('site_count',),
)
class NestedRegionSerializer(WritableNestedSerializer):
site_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = models.Region
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'site_count', '_depth']
@extend_schema_serializer(
exclude_fields=('site_count',),
)
class NestedSiteGroupSerializer(WritableNestedSerializer):
site_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = models.SiteGroup
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'site_count', '_depth']
@extend_schema_serializer(
exclude_fields=('rack_count',),
)
class NestedLocationSerializer(WritableNestedSerializer):
rack_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = models.Location
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'rack_count', '_depth']
class NestedDeviceSerializer(WritableNestedSerializer):
class Meta:
model = models.Device
fields = ['id', 'url', 'display_url', 'display', 'name']
class NestedInterfaceSerializer(WritableNestedSerializer):
device = NestedDeviceSerializer(read_only=True)
_occupied = serializers.BooleanField(required=False, read_only=True)
class Meta:
model = models.Interface
fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied']
class NestedInterfaceTemplateSerializer(WritableNestedSerializer):
class Meta:
model = models.InterfaceTemplate
fields = ['id', 'url', 'display_url', 'display', 'name']
class NestedDeviceBaySerializer(WritableNestedSerializer):
device = NestedDeviceSerializer(read_only=True)
class Meta:
model = models.DeviceBay
fields = ['id', 'url', 'display_url', 'display', 'device', 'name']
class ModuleBayNestedModuleSerializer(WritableNestedSerializer):
class Meta:
model = models.Module
fields = ['id', 'url', 'display_url', 'display', 'serial']
class NestedModuleBaySerializer(WritableNestedSerializer):
installed_module = ModuleBayNestedModuleSerializer(required=False, allow_null=True)
class Meta:
model = models.ModuleBay
fields = ['id', 'url', 'display_url', 'display', 'installed_module', 'name']

View File

@ -8,7 +8,7 @@ from ipam.models import ASN
from netbox.api.fields import ChoiceField, RelatedObjectCountField, SerializedPKRelatedField from netbox.api.fields import ChoiceField, RelatedObjectCountField, SerializedPKRelatedField
from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer
from tenancy.api.serializers_.tenants import TenantSerializer from tenancy.api.serializers_.tenants import TenantSerializer
from ..nested_serializers import * from .nested import NestedLocationSerializer, NestedRegionSerializer, NestedSiteGroupSerializer
__all__ = ( __all__ = (
'LocationSerializer', 'LocationSerializer',

View File

@ -2,7 +2,7 @@ from rest_framework import serializers
from dcim.models import VirtualChassis from dcim.models import VirtualChassis
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from ..nested_serializers import * from .nested import NestedDeviceSerializer
__all__ = ( __all__ = (
'VirtualChassisSerializer', 'VirtualChassisSerializer',

View File

@ -1,3 +1,5 @@
import warnings
from rest_framework import serializers from rest_framework import serializers
from extras import models from extras import models
@ -20,6 +22,12 @@ __all__ = [
'NestedWebhookSerializer', 'NestedWebhookSerializer',
] ]
# TODO: Remove in v4.2
warnings.warn(
f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
)
class NestedEventRuleSerializer(WritableNestedSerializer): class NestedEventRuleSerializer(WritableNestedSerializer):

View File

@ -13,4 +13,3 @@ from .serializers_.configtemplates import *
from .serializers_.savedfilters import * from .serializers_.savedfilters import *
from .serializers_.scripts import * from .serializers_.scripts import *
from .serializers_.tags import * from .serializers_.tags import *
from .nested_serializers import *

View File

@ -1,3 +1,5 @@
import warnings
from drf_spectacular.utils import extend_schema_serializer from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers from rest_framework import serializers
@ -5,6 +7,7 @@ from ipam import models
from netbox.api.fields import RelatedObjectCountField from netbox.api.fields import RelatedObjectCountField
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
from .field_serializers import IPAddressField from .field_serializers import IPAddressField
from .serializers_.nested import NestedIPAddressSerializer
__all__ = [ __all__ = [
'NestedAggregateSerializer', 'NestedAggregateSerializer',
@ -25,6 +28,12 @@ __all__ = [
'NestedVRFSerializer', 'NestedVRFSerializer',
] ]
# TODO: Remove in v4.2
warnings.warn(
f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
)
# #
# ASN ranges # ASN ranges
@ -177,19 +186,6 @@ class NestedIPRangeSerializer(WritableNestedSerializer):
fields = ['id', 'url', 'display_url', 'display', 'family', 'start_address', 'end_address'] fields = ['id', 'url', 'display_url', 'display', 'family', 'start_address', 'end_address']
#
# IP addresses
#
class NestedIPAddressSerializer(WritableNestedSerializer):
family = serializers.IntegerField(read_only=True)
address = IPAddressField()
class Meta:
model = models.IPAddress
fields = ['id', 'url', 'display_url', 'display', 'family', 'address']
# #
# Services # Services
# #

View File

@ -5,4 +5,3 @@ from .serializers_.vlans import *
from .serializers_.ip import * from .serializers_.ip import *
from .serializers_.fhrpgroups import * from .serializers_.fhrpgroups import *
from .serializers_.services import * from .serializers_.services import *
from .nested_serializers import *

View File

@ -11,11 +11,11 @@ from netbox.api.serializers import NetBoxModelSerializer
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 .asns import RIRSerializer from .asns import RIRSerializer
from .nested import NestedIPAddressSerializer
from .roles import RoleSerializer from .roles import RoleSerializer
from .vlans import VLANSerializer from .vlans import VLANSerializer
from .vrfs import VRFSerializer from .vrfs import VRFSerializer
from ..field_serializers import IPAddressField, IPNetworkField from ..field_serializers import IPAddressField, IPNetworkField
from ..nested_serializers import *
__all__ = ( __all__ = (
'AggregateSerializer', 'AggregateSerializer',

View File

@ -0,0 +1,18 @@
from rest_framework import serializers
from ipam import models
from netbox.api.serializers import WritableNestedSerializer
from ..field_serializers import IPAddressField
__all__ = (
'NestedIPAddressSerializer',
)
class NestedIPAddressSerializer(WritableNestedSerializer):
family = serializers.IntegerField(read_only=True)
address = IPAddressField()
class Meta:
model = models.IPAddress
fields = ['id', 'url', 'display_url', 'display', 'family', 'address']

View File

@ -21,7 +21,7 @@ class WritableNestedSerializer(BaseModelSerializer):
return get_related_object_by_attrs(queryset, data) return get_related_object_by_attrs(queryset, data)
# Declared here for use by PrimaryModelSerializer, but should be imported from extras.api.nested_serializers # Declared here for use by PrimaryModelSerializer
class NestedTagSerializer(WritableNestedSerializer): class NestedTagSerializer(WritableNestedSerializer):
class Meta: class Meta:

View File

@ -1,7 +1,7 @@
from drf_spectacular.utils import extend_schema_serializer import warnings
from rest_framework import serializers
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
from serializers_.nested import NestedContactGroupSerializer, NestedTenantGroupSerializer
from tenancy.models import * from tenancy.models import *
__all__ = [ __all__ = [
@ -13,23 +13,17 @@ __all__ = [
'NestedTenantSerializer', 'NestedTenantSerializer',
] ]
# TODO: Remove in v4.2
warnings.warn(
f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
)
# #
# Tenants # Tenants
# #
@extend_schema_serializer(
exclude_fields=('tenant_count',),
)
class NestedTenantGroupSerializer(WritableNestedSerializer):
tenant_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = TenantGroup
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'tenant_count', '_depth']
class NestedTenantSerializer(WritableNestedSerializer): class NestedTenantSerializer(WritableNestedSerializer):
class Meta: class Meta:
@ -41,18 +35,6 @@ class NestedTenantSerializer(WritableNestedSerializer):
# Contacts # Contacts
# #
@extend_schema_serializer(
exclude_fields=('contact_count',),
)
class NestedContactGroupSerializer(WritableNestedSerializer):
contact_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = ContactGroup
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'contact_count', '_depth']
class NestedContactRoleSerializer(WritableNestedSerializer): class NestedContactRoleSerializer(WritableNestedSerializer):
class Meta: class Meta:

View File

@ -1,3 +1,2 @@
from .serializers_.tenants import * from .serializers_.tenants import *
from .serializers_.contacts import * from .serializers_.contacts import *
from .nested_serializers import *

View File

@ -8,7 +8,7 @@ from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerial
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
from ..nested_serializers import * from .nested import NestedContactGroupSerializer
__all__ = ( __all__ = (
'ContactAssignmentSerializer', 'ContactAssignmentSerializer',

View File

@ -0,0 +1,34 @@
from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers
from netbox.api.serializers import WritableNestedSerializer
from tenancy import models
__all__ = (
'NestedContactGroupSerializer',
'NestedTenantGroupSerializer',
)
@extend_schema_serializer(
exclude_fields=('contact_count',),
)
class NestedContactGroupSerializer(WritableNestedSerializer):
contact_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = models.ContactGroup
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'contact_count', '_depth']
@extend_schema_serializer(
exclude_fields=('tenant_count',),
)
class NestedTenantGroupSerializer(WritableNestedSerializer):
tenant_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = models.TenantGroup
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'tenant_count', '_depth']

View File

@ -3,7 +3,7 @@ from rest_framework import serializers
from netbox.api.fields import RelatedObjectCountField from netbox.api.fields import RelatedObjectCountField
from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
from ..nested_serializers import * from .nested import NestedTenantGroupSerializer
__all__ = ( __all__ = (
'TenantGroupSerializer', 'TenantGroupSerializer',

View File

@ -1,11 +1,13 @@
from drf_spectacular.types import OpenApiTypes import warnings
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 core.models import ObjectType from core.models import ObjectType
from netbox.api.fields import ContentTypeField from netbox.api.fields import ContentTypeField
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
from users.models import Group, ObjectPermission, Token, User from serializers_.nested import NestedGroupSerializer, NestedUserSerializer
from users.models import ObjectPermission, Token
__all__ = [ __all__ = [
'NestedGroupSerializer', 'NestedGroupSerializer',
@ -14,25 +16,11 @@ __all__ = [
'NestedUserSerializer', 'NestedUserSerializer',
] ]
# TODO: Remove in v4.2
class NestedGroupSerializer(WritableNestedSerializer): warnings.warn(
f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
class Meta: DeprecationWarning
model = Group )
fields = ['id', 'url', 'display_url', 'display', 'name']
class NestedUserSerializer(WritableNestedSerializer):
class Meta:
model = User
fields = ['id', 'url', 'display_url', 'display', 'username']
@extend_schema_field(OpenApiTypes.STR)
def get_display(self, obj):
if full_name := obj.get_full_name():
return f"{obj.username} ({full_name})"
return obj.username
class NestedTokenSerializer(WritableNestedSerializer): class NestedTokenSerializer(WritableNestedSerializer):

View File

@ -1,4 +1,3 @@
from .serializers_.users import * from .serializers_.users import *
from .serializers_.permissions import * from .serializers_.permissions import *
from .serializers_.tokens import * from .serializers_.tokens import *
from .nested_serializers import *

View File

@ -0,0 +1,30 @@
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema_field
from netbox.api.serializers import WritableNestedSerializer
from users import models
__all__ = (
'NestedGroupSerializer',
'NestedUserSerializer',
)
class NestedGroupSerializer(WritableNestedSerializer):
class Meta:
model = models.Group
fields = ['id', 'url', 'display_url', 'display', 'name']
class NestedUserSerializer(WritableNestedSerializer):
class Meta:
model = models.User
fields = ['id', 'url', 'display_url', 'display', 'username']
@extend_schema_field(OpenApiTypes.STR)
def get_display(self, obj):
if full_name := obj.get_full_name():
return f"{obj.username} ({full_name})"
return obj.username

View File

@ -1,10 +1,8 @@
from rest_framework import serializers
from core.models import ObjectType from core.models import ObjectType
from netbox.api.fields import ContentTypeField, SerializedPKRelatedField from netbox.api.fields import ContentTypeField, SerializedPKRelatedField
from netbox.api.serializers import ValidatedModelSerializer from netbox.api.serializers import ValidatedModelSerializer
from users.api.nested_serializers import NestedGroupSerializer, NestedUserSerializer
from users.models import Group, ObjectPermission, User from users.models import Group, ObjectPermission, User
from .nested import NestedGroupSerializer, NestedUserSerializer
__all__ = ( __all__ = (
'ObjectPermissionSerializer', 'ObjectPermissionSerializer',

View File

@ -1,9 +1,11 @@
import warnings
from drf_spectacular.utils import extend_schema_serializer from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers
from netbox.api.fields import RelatedObjectCountField from netbox.api.fields import RelatedObjectCountField
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
from virtualization.models import * from virtualization.models import *
from .serializers_.nested import NestedVirtualMachineSerializer, NestedVMInterfaceSerializer
__all__ = [ __all__ = [
'NestedClusterGroupSerializer', 'NestedClusterGroupSerializer',
@ -14,11 +16,17 @@ __all__ = [
'NestedVirtualMachineSerializer', 'NestedVirtualMachineSerializer',
] ]
# TODO: Remove in v4.2
warnings.warn(
f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
)
# #
# Clusters # Clusters
# #
@extend_schema_serializer( @extend_schema_serializer(
exclude_fields=('cluster_count',), exclude_fields=('cluster_count',),
) )
@ -56,21 +64,6 @@ class NestedClusterSerializer(WritableNestedSerializer):
# Virtual machines # Virtual machines
# #
class NestedVirtualMachineSerializer(WritableNestedSerializer):
class Meta:
model = VirtualMachine
fields = ['id', 'url', 'display_url', 'display', 'name']
class NestedVMInterfaceSerializer(WritableNestedSerializer):
virtual_machine = NestedVirtualMachineSerializer(read_only=True)
class Meta:
model = VMInterface
fields = ['id', 'url', 'display_url', 'display', 'virtual_machine', 'name']
class NestedVirtualDiskSerializer(WritableNestedSerializer): class NestedVirtualDiskSerializer(WritableNestedSerializer):
virtual_machine = NestedVirtualMachineSerializer(read_only=True) virtual_machine = NestedVirtualMachineSerializer(read_only=True)

View File

@ -1,3 +1,2 @@
from .serializers_.clusters import * from .serializers_.clusters import *
from .serializers_.virtualmachines import * from .serializers_.virtualmachines import *
from .nested_serializers import *

View File

@ -0,0 +1,22 @@
from netbox.api.serializers import WritableNestedSerializer
from virtualization import models
__all__ = (
'NestedVirtualMachineSerializer',
'NestedVMInterfaceSerializer',
)
class NestedVirtualMachineSerializer(WritableNestedSerializer):
class Meta:
model = models.VirtualMachine
fields = ['id', 'url', 'display_url', 'display', 'name']
class NestedVMInterfaceSerializer(WritableNestedSerializer):
virtual_machine = NestedVirtualMachineSerializer(read_only=True)
class Meta:
model = models.VMInterface
fields = ['id', 'url', 'display_url', 'display', 'virtual_machine', 'name']

View File

@ -18,7 +18,7 @@ from virtualization.choices import *
from virtualization.models import VirtualDisk, VirtualMachine, VMInterface from virtualization.models import VirtualDisk, VirtualMachine, VMInterface
from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer
from .clusters import ClusterSerializer from .clusters import ClusterSerializer
from ..nested_serializers import * from .nested import NestedVMInterfaceSerializer
__all__ = ( __all__ = (
'VMInterfaceSerializer', 'VMInterfaceSerializer',

View File

@ -1,5 +1,6 @@
import warnings
from drf_spectacular.utils import extend_schema_serializer from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers
from netbox.api.fields import RelatedObjectCountField from netbox.api.fields import RelatedObjectCountField
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
@ -18,6 +19,12 @@ __all__ = (
'NestedTunnelTerminationSerializer', 'NestedTunnelTerminationSerializer',
) )
# TODO: Remove in v4.2
warnings.warn(
f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
)
@extend_schema_serializer( @extend_schema_serializer(
exclude_fields=('tunnel_count',), exclude_fields=('tunnel_count',),

View File

@ -1,4 +1,3 @@
from .serializers_.crypto import * from .serializers_.crypto import *
from .serializers_.tunnels import * from .serializers_.tunnels import *
from .serializers_.l2vpn import * from .serializers_.l2vpn import *
from .nested_serializers import *

View File

@ -1,8 +1,8 @@
from drf_spectacular.utils import extend_schema_serializer import warnings
from rest_framework import serializers
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
from wireless.models import * from wireless.models import *
from .serializers_.nested import NestedWirelessLANGroupSerializer, NestedWirelessLinkSerializer
__all__ = ( __all__ = (
'NestedWirelessLANSerializer', 'NestedWirelessLANSerializer',
@ -10,17 +10,11 @@ __all__ = (
'NestedWirelessLinkSerializer', 'NestedWirelessLinkSerializer',
) )
# TODO: Remove in v4.2
@extend_schema_serializer( warnings.warn(
exclude_fields=('wirelesslan_count',), f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
) )
class NestedWirelessLANGroupSerializer(WritableNestedSerializer):
wirelesslan_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = WirelessLANGroup
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'wirelesslan_count', '_depth']
class NestedWirelessLANSerializer(WritableNestedSerializer): class NestedWirelessLANSerializer(WritableNestedSerializer):
@ -28,10 +22,3 @@ class NestedWirelessLANSerializer(WritableNestedSerializer):
class Meta: class Meta:
model = WirelessLAN model = WirelessLAN
fields = ['id', 'url', 'display_url', 'display', 'ssid'] fields = ['id', 'url', 'display_url', 'display', 'ssid']
class NestedWirelessLinkSerializer(WritableNestedSerializer):
class Meta:
model = WirelessLink
fields = ['id', 'url', 'display_url', 'display', 'ssid']

View File

@ -1,3 +1,2 @@
from .serializers_.wirelesslans import * from .serializers_.wirelesslans import *
from .serializers_.wirelesslinks import * from .serializers_.wirelesslinks import *
from .nested_serializers import *

View File

@ -0,0 +1,29 @@
from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers
from netbox.api.serializers import WritableNestedSerializer
from wireless import models
__all__ = (
'NestedWirelessLANGroupSerializer',
'NestedWirelessLinkSerializer',
)
@extend_schema_serializer(
exclude_fields=('wirelesslan_count',),
)
class NestedWirelessLANGroupSerializer(WritableNestedSerializer):
wirelesslan_count = serializers.IntegerField(read_only=True)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
model = models.WirelessLANGroup
fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'wirelesslan_count', '_depth']
class NestedWirelessLinkSerializer(WritableNestedSerializer):
class Meta:
model = models.WirelessLink
fields = ['id', 'url', 'display_url', 'display', 'ssid']

View File

@ -6,7 +6,7 @@ from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerial
from tenancy.api.serializers_.tenants import TenantSerializer from tenancy.api.serializers_.tenants import TenantSerializer
from wireless.choices import * from wireless.choices import *
from wireless.models import WirelessLAN, WirelessLANGroup from wireless.models import WirelessLAN, WirelessLANGroup
from ..nested_serializers import * from .nested import NestedWirelessLANGroupSerializer
__all__ = ( __all__ = (
'WirelessLANGroupSerializer', 'WirelessLANGroupSerializer',