1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Add custom field support for organizational models to API serializers

This commit is contained in:
Jeremy Stretch
2021-02-25 15:58:13 -05:00
parent d6cf385a3c
commit 664a39911c
12 changed files with 77 additions and 46 deletions

View File

@ -31,13 +31,15 @@ class ProviderSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
# Circuits
#
class CircuitTypeSerializer(ValidatedModelSerializer):
class CircuitTypeSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail')
circuit_count = serializers.IntegerField(read_only=True)
class Meta:
model = CircuitType
fields = ['id', 'url', 'name', 'slug', 'description', 'circuit_count']
fields = [
'id', 'url', 'name', 'slug', 'description', 'custom_fields', 'created', 'last_updated', 'circuit_count',
]
class CircuitCircuitTerminationSerializer(WritableNestedSerializer, ConnectedEndpointSerializer):

View File

@ -34,7 +34,7 @@ class ProviderViewSet(CustomFieldModelViewSet):
# Circuit Types
#
class CircuitTypeViewSet(ModelViewSet):
class CircuitTypeViewSet(CustomFieldModelViewSet):
queryset = CircuitType.objects.annotate(
circuit_count=count_related(Circuit, 'type')
)

View File

@ -82,7 +82,7 @@ class ConnectedEndpointSerializer(ValidatedModelSerializer):
# Regions/sites
#
class RegionSerializer(serializers.ModelSerializer):
class RegionSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail')
parent = NestedRegionSerializer(required=False, allow_null=True)
site_count = serializers.IntegerField(read_only=True)
@ -90,7 +90,10 @@ class RegionSerializer(serializers.ModelSerializer):
class Meta:
model = Region
fields = ['id', 'url', 'name', 'slug', 'parent', 'description', 'site_count', '_depth']
fields = [
'id', 'url', 'name', 'slug', 'parent', 'description', 'custom_fields', 'created', 'last_updated',
'site_count', '_depth',
]
class SiteSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
@ -120,7 +123,7 @@ class SiteSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
# Racks
#
class RackGroupSerializer(ValidatedModelSerializer):
class RackGroupSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackgroup-detail')
site = NestedSiteSerializer()
parent = NestedRackGroupSerializer(required=False, allow_null=True)
@ -129,16 +132,22 @@ class RackGroupSerializer(ValidatedModelSerializer):
class Meta:
model = RackGroup
fields = ['id', 'url', 'name', 'slug', 'site', 'parent', 'description', 'rack_count', '_depth']
fields = [
'id', 'url', 'name', 'slug', 'site', 'parent', 'description', 'custom_fields', 'created', 'last_updated',
'rack_count', '_depth',
]
class RackRoleSerializer(ValidatedModelSerializer):
class RackRoleSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
rack_count = serializers.IntegerField(read_only=True)
class Meta:
model = RackRole
fields = ['id', 'url', 'name', 'slug', 'color', 'description', 'rack_count']
fields = [
'id', 'url', 'name', 'slug', 'color', 'description', 'custom_fields', 'created', 'last_updated',
'rack_count',
]
class RackSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
@ -242,7 +251,7 @@ class RackElevationDetailFilterSerializer(serializers.Serializer):
# Device types
#
class ManufacturerSerializer(ValidatedModelSerializer):
class ManufacturerSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
devicetype_count = serializers.IntegerField(read_only=True)
inventoryitem_count = serializers.IntegerField(read_only=True)
@ -251,7 +260,8 @@ class ManufacturerSerializer(ValidatedModelSerializer):
class Meta:
model = Manufacturer
fields = [
'id', 'url', 'name', 'slug', 'description', 'devicetype_count', 'inventoryitem_count', 'platform_count',
'id', 'url', 'name', 'slug', 'description', 'custom_fields', 'created', 'last_updated', 'devicetype_count',
'inventoryitem_count', 'platform_count',
]
@ -378,7 +388,7 @@ class DeviceBayTemplateSerializer(ValidatedModelSerializer):
# Devices
#
class DeviceRoleSerializer(ValidatedModelSerializer):
class DeviceRoleSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
device_count = serializers.IntegerField(read_only=True)
virtualmachine_count = serializers.IntegerField(read_only=True)
@ -386,11 +396,12 @@ class DeviceRoleSerializer(ValidatedModelSerializer):
class Meta:
model = DeviceRole
fields = [
'id', 'url', 'name', 'slug', 'color', 'vm_role', 'description', 'device_count', 'virtualmachine_count',
'id', 'url', 'name', 'slug', 'color', 'vm_role', 'description', 'custom_fields', 'created', 'last_updated',
'device_count', 'virtualmachine_count',
]
class PlatformSerializer(ValidatedModelSerializer):
class PlatformSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
manufacturer = NestedManufacturerSerializer(required=False, allow_null=True)
device_count = serializers.IntegerField(read_only=True)
@ -399,8 +410,8 @@ class PlatformSerializer(ValidatedModelSerializer):
class Meta:
model = Platform
fields = [
'id', 'url', 'name', 'slug', 'manufacturer', 'napalm_driver', 'napalm_args', 'description', 'device_count',
'virtualmachine_count',
'id', 'url', 'name', 'slug', 'manufacturer', 'napalm_driver', 'napalm_args', 'description', 'custom_fields',
'created', 'last_updated', 'device_count', 'virtualmachine_count',
]

View File

@ -99,7 +99,7 @@ class PassThroughPortMixin(object):
# Regions
#
class RegionViewSet(ModelViewSet):
class RegionViewSet(CustomFieldModelViewSet):
queryset = Region.objects.add_related_count(
Region.objects.all(),
Site,
@ -134,7 +134,7 @@ class SiteViewSet(CustomFieldModelViewSet):
# Rack groups
#
class RackGroupViewSet(ModelViewSet):
class RackGroupViewSet(CustomFieldModelViewSet):
queryset = RackGroup.objects.add_related_count(
RackGroup.objects.all(),
Rack,
@ -150,7 +150,7 @@ class RackGroupViewSet(ModelViewSet):
# Rack roles
#
class RackRoleViewSet(ModelViewSet):
class RackRoleViewSet(CustomFieldModelViewSet):
queryset = RackRole.objects.annotate(
rack_count=count_related(Rack, 'role')
)
@ -238,7 +238,7 @@ class RackReservationViewSet(ModelViewSet):
# Manufacturers
#
class ManufacturerViewSet(ModelViewSet):
class ManufacturerViewSet(CustomFieldModelViewSet):
queryset = Manufacturer.objects.annotate(
devicetype_count=count_related(DeviceType, 'manufacturer'),
inventoryitem_count=count_related(InventoryItem, 'manufacturer'),
@ -317,7 +317,7 @@ class DeviceBayTemplateViewSet(ModelViewSet):
# Device roles
#
class DeviceRoleViewSet(ModelViewSet):
class DeviceRoleViewSet(CustomFieldModelViewSet):
queryset = DeviceRole.objects.annotate(
device_count=count_related(Device, 'device_role'),
virtualmachine_count=count_related(VirtualMachine, 'role')
@ -330,7 +330,7 @@ class DeviceRoleViewSet(ModelViewSet):
# Platforms
#
class PlatformViewSet(ModelViewSet):
class PlatformViewSet(CustomFieldModelViewSet):
queryset = Platform.objects.annotate(
device_count=count_related(Device, 'platform'),
virtualmachine_count=count_related(VirtualMachine, 'platform')

View File

@ -67,13 +67,16 @@ class RouteTargetSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
# RIRs/aggregates
#
class RIRSerializer(ValidatedModelSerializer):
class RIRSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail')
aggregate_count = serializers.IntegerField(read_only=True)
class Meta:
model = RIR
fields = ['id', 'url', 'name', 'slug', 'is_private', 'description', 'aggregate_count']
fields = [
'id', 'url', 'name', 'slug', 'is_private', 'description', 'custom_fields', 'created', 'last_updated',
'aggregate_count',
]
class AggregateSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
@ -85,8 +88,8 @@ class AggregateSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
class Meta:
model = Aggregate
fields = [
'id', 'url', 'family', 'prefix', 'rir', 'tenant', 'date_added', 'description', 'tags', 'custom_fields', 'created',
'last_updated',
'id', 'url', 'family', 'prefix', 'rir', 'tenant', 'date_added', 'description', 'tags', 'custom_fields',
'created', 'last_updated',
]
read_only_fields = ['family']
@ -95,24 +98,30 @@ class AggregateSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
# VLANs
#
class RoleSerializer(ValidatedModelSerializer):
class RoleSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail')
prefix_count = serializers.IntegerField(read_only=True)
vlan_count = serializers.IntegerField(read_only=True)
class Meta:
model = Role
fields = ['id', 'url', 'name', 'slug', 'weight', 'description', 'prefix_count', 'vlan_count']
fields = [
'id', 'url', 'name', 'slug', 'weight', 'description', 'custom_fields', 'created', 'last_updated',
'prefix_count', 'vlan_count',
]
class VLANGroupSerializer(ValidatedModelSerializer):
class VLANGroupSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail')
site = NestedSiteSerializer(required=False, allow_null=True)
vlan_count = serializers.IntegerField(read_only=True)
class Meta:
model = VLANGroup
fields = ['id', 'url', 'name', 'slug', 'site', 'description', 'vlan_count']
fields = [
'id', 'url', 'name', 'slug', 'site', 'description', 'custom_fields', 'created', 'last_updated',
'vlan_count',
]
validators = []
def validate(self, data):

View File

@ -55,7 +55,7 @@ class RouteTargetViewSet(CustomFieldModelViewSet):
# RIRs
#
class RIRViewSet(ModelViewSet):
class RIRViewSet(CustomFieldModelViewSet):
queryset = RIR.objects.annotate(
aggregate_count=count_related(Aggregate, 'rir')
)
@ -77,7 +77,7 @@ class AggregateViewSet(CustomFieldModelViewSet):
# Roles
#
class RoleViewSet(ModelViewSet):
class RoleViewSet(CustomFieldModelViewSet):
queryset = Role.objects.annotate(
prefix_count=count_related(Prefix, 'role'),
vlan_count=count_related(VLAN, 'role')
@ -282,7 +282,7 @@ class IPAddressViewSet(CustomFieldModelViewSet):
# VLAN groups
#
class VLANGroupViewSet(ModelViewSet):
class VLANGroupViewSet(CustomFieldModelViewSet):
queryset = VLANGroup.objects.prefetch_related('site').annotate(
vlan_count=count_related(VLAN, 'group')
)

View File

@ -15,13 +15,15 @@ from .nested_serializers import *
# Secrets
#
class SecretRoleSerializer(ValidatedModelSerializer):
class SecretRoleSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='secrets-api:secretrole-detail')
secret_count = serializers.IntegerField(read_only=True)
class Meta:
model = SecretRole
fields = ['id', 'url', 'name', 'slug', 'description', 'secret_count']
fields = [
'id', 'url', 'name', 'slug', 'description', 'custom_fields', 'created', 'last_updated', 'secret_count',
]
class SecretSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):

View File

@ -8,6 +8,7 @@ from rest_framework.response import Response
from rest_framework.routers import APIRootView
from rest_framework.viewsets import ViewSet
from extras.api.views import CustomFieldModelViewSet
from netbox.api.views import ModelViewSet
from secrets import filters
from secrets.exceptions import InvalidKey
@ -33,7 +34,7 @@ class SecretsRootView(APIRootView):
# Secret Roles
#
class SecretRoleViewSet(ModelViewSet):
class SecretRoleViewSet(CustomFieldModelViewSet):
queryset = SecretRole.objects.annotate(
secret_count=count_related(Secret, 'role')
)

View File

@ -11,7 +11,7 @@ from .nested_serializers import *
# Tenants
#
class TenantGroupSerializer(ValidatedModelSerializer):
class TenantGroupSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail')
parent = NestedTenantGroupSerializer(required=False, allow_null=True)
tenant_count = serializers.IntegerField(read_only=True)
@ -19,7 +19,10 @@ class TenantGroupSerializer(ValidatedModelSerializer):
class Meta:
model = TenantGroup
fields = ['id', 'url', 'name', 'slug', 'parent', 'description', 'tenant_count', '_depth']
fields = [
'id', 'url', 'name', 'slug', 'parent', 'description', 'custom_fields', 'created', 'last_updated',
'tenant_count', '_depth',
]
class TenantSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):

View File

@ -4,7 +4,6 @@ from circuits.models import Circuit
from dcim.models import Device, Rack, Site
from extras.api.views import CustomFieldModelViewSet
from ipam.models import IPAddress, Prefix, VLAN, VRF
from netbox.api.views import ModelViewSet
from tenancy import filters
from tenancy.models import Tenant, TenantGroup
from utilities.utils import count_related
@ -24,7 +23,7 @@ class TenancyRootView(APIRootView):
# Tenant Groups
#
class TenantGroupViewSet(ModelViewSet):
class TenantGroupViewSet(CustomFieldModelViewSet):
queryset = TenantGroup.objects.add_related_count(
TenantGroup.objects.all(),
Tenant,

View File

@ -18,22 +18,26 @@ from .nested_serializers import *
# Clusters
#
class ClusterTypeSerializer(ValidatedModelSerializer):
class ClusterTypeSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
cluster_count = serializers.IntegerField(read_only=True)
class Meta:
model = ClusterType
fields = ['id', 'url', 'name', 'slug', 'description', 'cluster_count']
fields = [
'id', 'url', 'name', 'slug', 'description', 'custom_fields', 'created', 'last_updated', 'cluster_count',
]
class ClusterGroupSerializer(ValidatedModelSerializer):
class ClusterGroupSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
cluster_count = serializers.IntegerField(read_only=True)
class Meta:
model = ClusterGroup
fields = ['id', 'url', 'name', 'slug', 'description', 'cluster_count']
fields = [
'id', 'url', 'name', 'slug', 'description', 'custom_fields', 'created', 'last_updated', 'cluster_count',
]
class ClusterSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):

View File

@ -20,7 +20,7 @@ class VirtualizationRootView(APIRootView):
# Clusters
#
class ClusterTypeViewSet(ModelViewSet):
class ClusterTypeViewSet(CustomFieldModelViewSet):
queryset = ClusterType.objects.annotate(
cluster_count=count_related(Cluster, 'type')
)
@ -28,7 +28,7 @@ class ClusterTypeViewSet(ModelViewSet):
filterset_class = filters.ClusterTypeFilterSet
class ClusterGroupViewSet(ModelViewSet):
class ClusterGroupViewSet(CustomFieldModelViewSet):
queryset = ClusterGroup.objects.annotate(
cluster_count=count_related(Cluster, 'group')
)