diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index 12ec9ba7f..17dce6624 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -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): diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py index 736871a73..c2fe3d089 100644 --- a/netbox/circuits/api/views.py +++ b/netbox/circuits/api/views.py @@ -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') ) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 6f497bfa6..3aa5dea2f 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -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', ] diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index ae39f6ad0..ae488a1e4 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -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') diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 9b8d36590..719ea51e2 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -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): diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 16db8f04f..b6f0a7463 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -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') ) diff --git a/netbox/secrets/api/serializers.py b/netbox/secrets/api/serializers.py index b08b87bc5..627685de0 100644 --- a/netbox/secrets/api/serializers.py +++ b/netbox/secrets/api/serializers.py @@ -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): diff --git a/netbox/secrets/api/views.py b/netbox/secrets/api/views.py index 8c959f90d..3650abd30 100644 --- a/netbox/secrets/api/views.py +++ b/netbox/secrets/api/views.py @@ -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') ) diff --git a/netbox/tenancy/api/serializers.py b/netbox/tenancy/api/serializers.py index 4c2f9faee..d301ee3fe 100644 --- a/netbox/tenancy/api/serializers.py +++ b/netbox/tenancy/api/serializers.py @@ -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): diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py index 2b7ae8365..3b57e1a02 100644 --- a/netbox/tenancy/api/views.py +++ b/netbox/tenancy/api/views.py @@ -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, diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 518b7086c..4883f9f62 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -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): diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 586ad5028..ea2b33e4f 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -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') )