浏览代码

Add custom field support for organizational models to API serializers

Jeremy Stretch 5 年之前
父节点
当前提交
664a39911c

+ 4 - 2
netbox/circuits/api/serializers.py

@@ -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):

+ 1 - 1
netbox/circuits/api/views.py

@@ -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')
     )
     )

+ 24 - 13
netbox/dcim/api/serializers.py

@@ -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',
-            '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
 # 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')

+ 17 - 8
netbox/ipam/api/serializers.py

@@ -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',
-            'last_updated',
+            'id', 'url', 'family', 'prefix', 'rir', 'tenant', 'date_added', 'description', 'tags', 'custom_fields',
+            '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):

+ 3 - 3
netbox/ipam/api/views.py

@@ -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')
     )
     )

+ 4 - 2
netbox/secrets/api/serializers.py

@@ -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):

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

+ 5 - 2
netbox/tenancy/api/serializers.py

@@ -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):

+ 1 - 2
netbox/tenancy/api/views.py

@@ -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,

+ 8 - 4
netbox/virtualization/api/serializers.py

@@ -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):

+ 2 - 2
netbox/virtualization/api/views.py

@@ -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')
     )
     )