Просмотр исходного кода

Add custom field support for organizational models to API serializers

Jeremy Stretch 5 лет назад
Родитель
Сommit
664a39911c

+ 4 - 2
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):

+ 1 - 1
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')
     )

+ 24 - 13
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',
         ]
 
 

+ 6 - 6
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')

+ 17 - 8
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):

+ 3 - 3
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')
     )

+ 4 - 2
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):

+ 2 - 1
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')
     )

+ 5 - 2
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):

+ 1 - 2
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,

+ 8 - 4
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):

+ 2 - 2
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')
     )