diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index 17dce6624..74d8136e0 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -2,11 +2,12 @@ from rest_framework import serializers from circuits.choices import CircuitStatusChoices from circuits.models import Provider, Circuit, CircuitTermination, CircuitType -from dcim.api.nested_serializers import NestedCableSerializer, NestedInterfaceSerializer, NestedSiteSerializer +from dcim.api.nested_serializers import NestedCableSerializer, NestedSiteSerializer from dcim.api.serializers import CableTerminationSerializer, ConnectedEndpointSerializer from extras.api.customfields import CustomFieldModelSerializer from extras.api.serializers import TaggedObjectSerializer -from netbox.api import ChoiceField, ValidatedModelSerializer, WritableNestedSerializer +from netbox.api import ChoiceField +from netbox.api.serializers import OrganizationalModelSerializer, WritableNestedSerializer from tenancy.api.nested_serializers import NestedTenantSerializer from .nested_serializers import * @@ -31,7 +32,7 @@ class ProviderSerializer(TaggedObjectSerializer, CustomFieldModelSerializer): # Circuits # -class CircuitTypeSerializer(CustomFieldModelSerializer): +class CircuitTypeSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') circuit_count = serializers.IntegerField(read_only=True) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 3aa5dea2f..7d86d18a1 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -13,15 +13,12 @@ from dcim.models import ( PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis, ) -from dcim.utils import decompile_path_node from extras.api.customfields import CustomFieldModelSerializer from extras.api.serializers import TaggedObjectSerializer from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSerializer from ipam.models import VLAN -from netbox.api import ( - ChoiceField, ContentTypeField, SerializedPKRelatedField, TimeZoneField, ValidatedModelSerializer, - WritableNestedSerializer, -) +from netbox.api import ChoiceField, ContentTypeField, SerializedPKRelatedField, TimeZoneField +from netbox.api.serializers import OrganizationalModelSerializer, ValidatedModelSerializer, WritableNestedSerializer from tenancy.api.nested_serializers import NestedTenantSerializer from users.api.nested_serializers import NestedUserSerializer from utilities.api import get_serializer_for_model @@ -138,7 +135,7 @@ class RackGroupSerializer(CustomFieldModelSerializer): ] -class RackRoleSerializer(CustomFieldModelSerializer): +class RackRoleSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') rack_count = serializers.IntegerField(read_only=True) @@ -251,7 +248,7 @@ class RackElevationDetailFilterSerializer(serializers.Serializer): # Device types # -class ManufacturerSerializer(CustomFieldModelSerializer): +class ManufacturerSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') devicetype_count = serializers.IntegerField(read_only=True) inventoryitem_count = serializers.IntegerField(read_only=True) @@ -388,7 +385,7 @@ class DeviceBayTemplateSerializer(ValidatedModelSerializer): # Devices # -class DeviceRoleSerializer(CustomFieldModelSerializer): +class DeviceRoleSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') device_count = serializers.IntegerField(read_only=True) virtualmachine_count = serializers.IntegerField(read_only=True) @@ -401,7 +398,7 @@ class DeviceRoleSerializer(CustomFieldModelSerializer): ] -class PlatformSerializer(CustomFieldModelSerializer): +class PlatformSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') manufacturer = NestedManufacturerSerializer(required=False, allow_null=True) device_count = serializers.IntegerField(read_only=True) diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 719ea51e2..8688da8f2 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -11,7 +11,8 @@ from extras.api.serializers import TaggedObjectSerializer from ipam.choices import * from ipam.constants import IPADDRESS_ASSIGNMENT_MODELS from ipam.models import Aggregate, IPAddress, Prefix, RIR, Role, RouteTarget, Service, VLAN, VLANGroup, VRF -from netbox.api import ChoiceField, ContentTypeField, SerializedPKRelatedField, ValidatedModelSerializer +from netbox.api import ChoiceField, ContentTypeField, SerializedPKRelatedField +from netbox.api.serializers import OrganizationalModelSerializer from tenancy.api.nested_serializers import NestedTenantSerializer from utilities.api import get_serializer_for_model from virtualization.api.nested_serializers import NestedVirtualMachineSerializer @@ -67,7 +68,7 @@ class RouteTargetSerializer(TaggedObjectSerializer, CustomFieldModelSerializer): # RIRs/aggregates # -class RIRSerializer(CustomFieldModelSerializer): +class RIRSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') aggregate_count = serializers.IntegerField(read_only=True) @@ -98,7 +99,7 @@ class AggregateSerializer(TaggedObjectSerializer, CustomFieldModelSerializer): # VLANs # -class RoleSerializer(CustomFieldModelSerializer): +class RoleSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') prefix_count = serializers.IntegerField(read_only=True) vlan_count = serializers.IntegerField(read_only=True) @@ -111,7 +112,7 @@ class RoleSerializer(CustomFieldModelSerializer): ] -class VLANGroupSerializer(CustomFieldModelSerializer): +class VLANGroupSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') site = NestedSiteSerializer(required=False, allow_null=True) vlan_count = serializers.IntegerField(read_only=True) diff --git a/netbox/netbox/api/serializers.py b/netbox/netbox/api/serializers.py index 3a8641efc..02e382d4b 100644 --- a/netbox/netbox/api/serializers.py +++ b/netbox/netbox/api/serializers.py @@ -35,6 +35,10 @@ class ValidatedModelSerializer(serializers.ModelSerializer): return data +class OrganizationalModelSerializer(ValidatedModelSerializer): + pass + + class WritableNestedSerializer(serializers.ModelSerializer): """ Returns a nested representation of an object on read, but accepts only a primary key on write. diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 4883f9f62..b8ccb99b0 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -7,7 +7,8 @@ from extras.api.customfields import CustomFieldModelSerializer from extras.api.serializers import TaggedObjectSerializer from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSerializer from ipam.models import VLAN -from netbox.api import ChoiceField, SerializedPKRelatedField, ValidatedModelSerializer +from netbox.api import ChoiceField, SerializedPKRelatedField +from netbox.api.serializers import OrganizationalModelSerializer, ValidatedModelSerializer from tenancy.api.nested_serializers import NestedTenantSerializer from virtualization.choices import * from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -18,7 +19,7 @@ from .nested_serializers import * # Clusters # -class ClusterTypeSerializer(CustomFieldModelSerializer): +class ClusterTypeSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') cluster_count = serializers.IntegerField(read_only=True) @@ -29,7 +30,7 @@ class ClusterTypeSerializer(CustomFieldModelSerializer): ] -class ClusterGroupSerializer(CustomFieldModelSerializer): +class ClusterGroupSerializer(OrganizationalModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail') cluster_count = serializers.IntegerField(read_only=True)