Fixes: #5450 - Change all *_count and count_* serializers to have default value

This commit is contained in:
Daniel Sheppard 2020-12-15 09:00:25 -06:00
parent 1f4954bf0e
commit beeb6b5946
15 changed files with 74 additions and 73 deletions

View File

@ -4,6 +4,7 @@
### Bug Fixes
* [#5450](https://github.com/netbox-community/netbox/issues/5450) - API serializer foreign count fields do not have a default value
* [#5458](https://github.com/netbox-community/netbox/issues/5458) - Creating a component template throws an exception
* [#5461](https://github.com/netbox-community/netbox/issues/5461) - Rack Elevations throw reverse match exception

View File

@ -17,7 +17,7 @@ __all__ = [
class NestedProviderSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail')
circuit_count = serializers.IntegerField(read_only=True)
circuit_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Provider
@ -30,7 +30,7 @@ class NestedProviderSerializer(WritableNestedSerializer):
class NestedCircuitTypeSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail')
circuit_count = serializers.IntegerField(read_only=True)
circuit_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = CircuitType

View File

@ -17,7 +17,7 @@ from .nested_serializers import *
class ProviderSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail')
circuit_count = serializers.IntegerField(read_only=True)
circuit_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Provider
@ -33,7 +33,7 @@ class ProviderSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
class CircuitTypeSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail')
circuit_count = serializers.IntegerField(read_only=True)
circuit_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = CircuitType

View File

@ -45,7 +45,7 @@ __all__ = [
class NestedRegionSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail')
site_count = serializers.IntegerField(read_only=True)
site_count = serializers.IntegerField(read_only=True, default=0)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
@ -67,7 +67,7 @@ class NestedSiteSerializer(WritableNestedSerializer):
class NestedRackGroupSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackgroup-detail')
rack_count = serializers.IntegerField(read_only=True)
rack_count = serializers.IntegerField(read_only=True, default=0)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
@ -77,7 +77,7 @@ class NestedRackGroupSerializer(WritableNestedSerializer):
class NestedRackRoleSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
rack_count = serializers.IntegerField(read_only=True)
rack_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.RackRole
@ -86,7 +86,7 @@ class NestedRackRoleSerializer(WritableNestedSerializer):
class NestedRackSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail')
device_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.Rack
@ -111,7 +111,7 @@ class NestedRackReservationSerializer(WritableNestedSerializer):
class NestedManufacturerSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
devicetype_count = serializers.IntegerField(read_only=True)
devicetype_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.Manufacturer
@ -121,7 +121,7 @@ class NestedManufacturerSerializer(WritableNestedSerializer):
class NestedDeviceTypeSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
manufacturer = NestedManufacturerSerializer(read_only=True)
device_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.DeviceType
@ -198,8 +198,8 @@ class NestedDeviceBayTemplateSerializer(WritableNestedSerializer):
class NestedDeviceRoleSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
device_count = serializers.IntegerField(read_only=True)
virtualmachine_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True, default=0)
virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.DeviceRole
@ -208,8 +208,8 @@ class NestedDeviceRoleSerializer(WritableNestedSerializer):
class NestedPlatformSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
device_count = serializers.IntegerField(read_only=True)
virtualmachine_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True, default=0)
virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.Platform
@ -325,7 +325,7 @@ class NestedCableSerializer(serializers.ModelSerializer):
class NestedVirtualChassisSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail')
master = NestedDeviceSerializer()
member_count = serializers.IntegerField(read_only=True)
member_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.VirtualChassis
@ -338,7 +338,7 @@ class NestedVirtualChassisSerializer(WritableNestedSerializer):
class NestedPowerPanelSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail')
powerfeed_count = serializers.IntegerField(read_only=True)
powerfeed_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.PowerPanel

View File

@ -85,7 +85,7 @@ class ConnectedEndpointSerializer(ValidatedModelSerializer):
class RegionSerializer(serializers.ModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail')
parent = NestedRegionSerializer(required=False, allow_null=True)
site_count = serializers.IntegerField(read_only=True)
site_count = serializers.IntegerField(read_only=True, default=0)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
@ -99,12 +99,12 @@ class SiteSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
region = NestedRegionSerializer(required=False, allow_null=True)
tenant = NestedTenantSerializer(required=False, allow_null=True)
time_zone = TimeZoneField(required=False)
circuit_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True)
prefix_count = serializers.IntegerField(read_only=True)
rack_count = serializers.IntegerField(read_only=True)
virtualmachine_count = serializers.IntegerField(read_only=True)
vlan_count = serializers.IntegerField(read_only=True)
circuit_count = serializers.IntegerField(read_only=True, default=0)
device_count = serializers.IntegerField(read_only=True, default=0)
prefix_count = serializers.IntegerField(read_only=True, default=0)
rack_count = serializers.IntegerField(read_only=True, default=0)
virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
vlan_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Site
@ -124,7 +124,7 @@ class RackGroupSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackgroup-detail')
site = NestedSiteSerializer()
parent = NestedRackGroupSerializer(required=False, allow_null=True)
rack_count = serializers.IntegerField(read_only=True)
rack_count = serializers.IntegerField(read_only=True, default=0)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
@ -134,7 +134,7 @@ class RackGroupSerializer(ValidatedModelSerializer):
class RackRoleSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
rack_count = serializers.IntegerField(read_only=True)
rack_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = RackRole
@ -151,8 +151,8 @@ class RackSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
type = ChoiceField(choices=RackTypeChoices, allow_blank=True, required=False)
width = ChoiceField(choices=RackWidthChoices, required=False)
outer_unit = ChoiceField(choices=RackDimensionUnitChoices, allow_blank=True, required=False)
device_count = serializers.IntegerField(read_only=True)
powerfeed_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True, default=0)
powerfeed_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Rack
@ -244,9 +244,9 @@ class RackElevationDetailFilterSerializer(serializers.Serializer):
class ManufacturerSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
devicetype_count = serializers.IntegerField(read_only=True)
inventoryitem_count = serializers.IntegerField(read_only=True)
platform_count = serializers.IntegerField(read_only=True)
devicetype_count = serializers.IntegerField(read_only=True, default=0)
inventoryitem_count = serializers.IntegerField(read_only=True, default=0)
platform_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Manufacturer
@ -259,7 +259,7 @@ class DeviceTypeSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
manufacturer = NestedManufacturerSerializer()
subdevice_role = ChoiceField(choices=SubdeviceRoleChoices, allow_blank=True, required=False)
device_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = DeviceType
@ -380,8 +380,8 @@ class DeviceBayTemplateSerializer(ValidatedModelSerializer):
class DeviceRoleSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
device_count = serializers.IntegerField(read_only=True)
virtualmachine_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True, default=0)
virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = DeviceRole
@ -393,8 +393,8 @@ class DeviceRoleSerializer(ValidatedModelSerializer):
class PlatformSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
manufacturer = NestedManufacturerSerializer(required=False, allow_null=True)
device_count = serializers.IntegerField(read_only=True)
virtualmachine_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True, default=0)
virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Platform
@ -573,7 +573,7 @@ class InterfaceSerializer(TaggedObjectSerializer, CableTerminationSerializer, Co
many=True
)
cable = NestedCableSerializer(read_only=True)
count_ipaddresses = serializers.IntegerField(read_only=True)
count_ipaddresses = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Interface
@ -805,7 +805,7 @@ class InterfaceConnectionSerializer(ValidatedModelSerializer):
class VirtualChassisSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail')
master = NestedDeviceSerializer(required=False)
member_count = serializers.IntegerField(read_only=True)
member_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = VirtualChassis
@ -824,7 +824,7 @@ class PowerPanelSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
allow_null=True,
default=None
)
powerfeed_count = serializers.IntegerField(read_only=True)
powerfeed_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = PowerPanel

View File

@ -66,7 +66,7 @@ class ExportTemplateSerializer(ValidatedModelSerializer):
class TagSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail')
tagged_items = serializers.IntegerField(read_only=True)
tagged_items = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Tag

View File

@ -23,7 +23,7 @@ __all__ = [
class NestedVRFSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail')
prefix_count = serializers.IntegerField(read_only=True)
prefix_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.VRF
@ -48,7 +48,7 @@ class NestedRouteTargetSerializer(WritableNestedSerializer):
class NestedRIRSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail')
aggregate_count = serializers.IntegerField(read_only=True)
aggregate_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.RIR
@ -70,8 +70,8 @@ class NestedAggregateSerializer(WritableNestedSerializer):
class NestedRoleSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail')
prefix_count = serializers.IntegerField(read_only=True)
vlan_count = serializers.IntegerField(read_only=True)
prefix_count = serializers.IntegerField(read_only=True, default=0)
vlan_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.Role
@ -80,7 +80,7 @@ class NestedRoleSerializer(WritableNestedSerializer):
class NestedVLANGroupSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail')
vlan_count = serializers.IntegerField(read_only=True)
vlan_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = models.VLANGroup

View File

@ -27,8 +27,8 @@ class VRFSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
tenant = NestedTenantSerializer(required=False, allow_null=True)
import_targets = NestedRouteTargetSerializer(required=False, allow_null=True, many=True)
export_targets = NestedRouteTargetSerializer(required=False, allow_null=True, many=True)
ipaddress_count = serializers.IntegerField(read_only=True)
prefix_count = serializers.IntegerField(read_only=True)
ipaddress_count = serializers.IntegerField(read_only=True, default=0)
prefix_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = VRF
@ -59,7 +59,7 @@ class RouteTargetSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
class RIRSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail')
aggregate_count = serializers.IntegerField(read_only=True)
aggregate_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = RIR
@ -87,8 +87,8 @@ class AggregateSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
class RoleSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail')
prefix_count = serializers.IntegerField(read_only=True)
vlan_count = serializers.IntegerField(read_only=True)
prefix_count = serializers.IntegerField(read_only=True, default=0)
vlan_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Role
@ -98,7 +98,7 @@ class RoleSerializer(ValidatedModelSerializer):
class VLANGroupSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail')
site = NestedSiteSerializer(required=False, allow_null=True)
vlan_count = serializers.IntegerField(read_only=True)
vlan_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = VLANGroup
@ -126,7 +126,7 @@ class VLANSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
tenant = NestedTenantSerializer(required=False, allow_null=True)
status = ChoiceField(choices=VLANStatusChoices, required=False)
role = NestedRoleSerializer(required=False, allow_null=True)
prefix_count = serializers.IntegerField(read_only=True)
prefix_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = VLAN

View File

@ -19,7 +19,7 @@ class NestedSecretSerializer(WritableNestedSerializer):
class NestedSecretRoleSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='secrets-api:secretrole-detail')
secret_count = serializers.IntegerField(read_only=True)
secret_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = SecretRole

View File

@ -17,7 +17,7 @@ from .nested_serializers import *
class SecretRoleSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='secrets-api:secretrole-detail')
secret_count = serializers.IntegerField(read_only=True)
secret_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = SecretRole

View File

@ -15,7 +15,7 @@ __all__ = [
class NestedTenantGroupSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail')
tenant_count = serializers.IntegerField(read_only=True)
tenant_count = serializers.IntegerField(read_only=True, default=0)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:

View File

@ -14,7 +14,7 @@ from .nested_serializers import *
class TenantGroupSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail')
parent = NestedTenantGroupSerializer(required=False, allow_null=True)
tenant_count = serializers.IntegerField(read_only=True)
tenant_count = serializers.IntegerField(read_only=True, default=0)
_depth = serializers.IntegerField(source='level', read_only=True)
class Meta:
@ -25,16 +25,16 @@ class TenantGroupSerializer(ValidatedModelSerializer):
class TenantSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenant-detail')
group = NestedTenantGroupSerializer(required=False)
circuit_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True)
ipaddress_count = serializers.IntegerField(read_only=True)
prefix_count = serializers.IntegerField(read_only=True)
rack_count = serializers.IntegerField(read_only=True)
site_count = serializers.IntegerField(read_only=True)
virtualmachine_count = serializers.IntegerField(read_only=True)
vlan_count = serializers.IntegerField(read_only=True)
vrf_count = serializers.IntegerField(read_only=True)
cluster_count = serializers.IntegerField(read_only=True)
circuit_count = serializers.IntegerField(read_only=True, default=0)
device_count = serializers.IntegerField(read_only=True, default=0)
ipaddress_count = serializers.IntegerField(read_only=True, default=0)
prefix_count = serializers.IntegerField(read_only=True, default=0)
rack_count = serializers.IntegerField(read_only=True, default=0)
site_count = serializers.IntegerField(read_only=True, default=0)
virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
vlan_count = serializers.IntegerField(read_only=True, default=0)
vrf_count = serializers.IntegerField(read_only=True, default=0)
cluster_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Tenant

View File

@ -40,7 +40,7 @@ class UserSerializer(ValidatedModelSerializer):
class GroupSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='users-api:group-detail')
user_count = serializers.IntegerField(read_only=True)
user_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Group

View File

@ -19,7 +19,7 @@ __all__ = [
class NestedClusterTypeSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
cluster_count = serializers.IntegerField(read_only=True)
cluster_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = ClusterType
@ -28,7 +28,7 @@ class NestedClusterTypeSerializer(WritableNestedSerializer):
class NestedClusterGroupSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
cluster_count = serializers.IntegerField(read_only=True)
cluster_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = ClusterGroup
@ -37,7 +37,7 @@ class NestedClusterGroupSerializer(WritableNestedSerializer):
class NestedClusterSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail')
virtualmachine_count = serializers.IntegerField(read_only=True)
virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Cluster

View File

@ -20,7 +20,7 @@ from .nested_serializers import *
class ClusterTypeSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
cluster_count = serializers.IntegerField(read_only=True)
cluster_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = ClusterType
@ -29,7 +29,7 @@ class ClusterTypeSerializer(ValidatedModelSerializer):
class ClusterGroupSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
cluster_count = serializers.IntegerField(read_only=True)
cluster_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = ClusterGroup
@ -42,8 +42,8 @@ class ClusterSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
group = NestedClusterGroupSerializer(required=False, allow_null=True)
tenant = NestedTenantSerializer(required=False, allow_null=True)
site = NestedSiteSerializer(required=False, allow_null=True)
device_count = serializers.IntegerField(read_only=True)
virtualmachine_count = serializers.IntegerField(read_only=True)
device_count = serializers.IntegerField(read_only=True, default=0)
virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
class Meta:
model = Cluster