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 # Circuits
# #
class CircuitTypeSerializer(ValidatedModelSerializer): class CircuitTypeSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail')
circuit_count = serializers.IntegerField(read_only=True) circuit_count = serializers.IntegerField(read_only=True)
class Meta: class Meta:
model = CircuitType 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): class CircuitCircuitTerminationSerializer(WritableNestedSerializer, ConnectedEndpointSerializer):

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -15,13 +15,15 @@ from .nested_serializers import *
# Secrets # Secrets
# #
class SecretRoleSerializer(ValidatedModelSerializer): class SecretRoleSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='secrets-api:secretrole-detail') url = serializers.HyperlinkedIdentityField(view_name='secrets-api:secretrole-detail')
secret_count = serializers.IntegerField(read_only=True) secret_count = serializers.IntegerField(read_only=True)
class Meta: class Meta:
model = SecretRole 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): 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.routers import APIRootView
from rest_framework.viewsets import ViewSet from rest_framework.viewsets import ViewSet
from extras.api.views import CustomFieldModelViewSet
from netbox.api.views import ModelViewSet from netbox.api.views import ModelViewSet
from secrets import filters from secrets import filters
from secrets.exceptions import InvalidKey from secrets.exceptions import InvalidKey
@ -33,7 +34,7 @@ class SecretsRootView(APIRootView):
# Secret Roles # Secret Roles
# #
class SecretRoleViewSet(ModelViewSet): class SecretRoleViewSet(CustomFieldModelViewSet):
queryset = SecretRole.objects.annotate( queryset = SecretRole.objects.annotate(
secret_count=count_related(Secret, 'role') secret_count=count_related(Secret, 'role')
) )

View File

@ -11,7 +11,7 @@ from .nested_serializers import *
# Tenants # Tenants
# #
class TenantGroupSerializer(ValidatedModelSerializer): class TenantGroupSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail') url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail')
parent = NestedTenantGroupSerializer(required=False, allow_null=True) parent = NestedTenantGroupSerializer(required=False, allow_null=True)
tenant_count = serializers.IntegerField(read_only=True) tenant_count = serializers.IntegerField(read_only=True)
@ -19,7 +19,10 @@ class TenantGroupSerializer(ValidatedModelSerializer):
class Meta: class Meta:
model = TenantGroup 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): class TenantSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):

View File

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

View File

@ -18,22 +18,26 @@ from .nested_serializers import *
# Clusters # Clusters
# #
class ClusterTypeSerializer(ValidatedModelSerializer): class ClusterTypeSerializer(CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
cluster_count = serializers.IntegerField(read_only=True) cluster_count = serializers.IntegerField(read_only=True)
class Meta: class Meta:
model = ClusterType 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') url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
cluster_count = serializers.IntegerField(read_only=True) cluster_count = serializers.IntegerField(read_only=True)
class Meta: class Meta:
model = ClusterGroup 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): class ClusterSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):

View File

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