mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-17 21:18:16 -06:00
Refactor RelatedObjectCountField to take a single relationship name
This commit is contained in:
parent
06226a3c60
commit
f6338e23ba
@ -36,7 +36,7 @@ class NestedProviderNetworkSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedProviderSerializer(WritableNestedSerializer):
|
class NestedProviderSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail')
|
||||||
circuit_count = RelatedObjectCountField('circuits.circuit', 'provider')
|
circuit_count = RelatedObjectCountField('circuits')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Provider
|
model = Provider
|
||||||
@ -64,7 +64,7 @@ class NestedProviderAccountSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedCircuitTypeSerializer(WritableNestedSerializer):
|
class NestedCircuitTypeSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail')
|
||||||
circuit_count = RelatedObjectCountField('circuits.circuit', 'type')
|
circuit_count = RelatedObjectCountField('circuits')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CircuitType
|
model = CircuitType
|
||||||
|
@ -32,7 +32,7 @@ class ProviderSerializer(NetBoxModelSerializer):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
circuit_count = RelatedObjectCountField('circuits.circuit', 'provider')
|
circuit_count = RelatedObjectCountField('circuits')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Provider
|
model = Provider
|
||||||
@ -82,7 +82,7 @@ class CircuitTypeSerializer(NetBoxModelSerializer):
|
|||||||
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail')
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
circuit_count = RelatedObjectCountField('circuits.circuit', 'type')
|
circuit_count = RelatedObjectCountField('circuits')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CircuitType
|
model = CircuitType
|
||||||
|
@ -28,7 +28,7 @@ class DataSourceSerializer(NetBoxModelSerializer):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
file_count = RelatedObjectCountField('core.datafile', 'source')
|
file_count = RelatedObjectCountField('datafiles')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = DataSource
|
model = DataSource
|
||||||
|
@ -111,7 +111,7 @@ class NestedLocationSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedRackRoleSerializer(WritableNestedSerializer):
|
class NestedRackRoleSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
|
||||||
rack_count = RelatedObjectCountField('dcim.rack', 'role')
|
rack_count = RelatedObjectCountField('racks')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.RackRole
|
model = models.RackRole
|
||||||
@ -123,7 +123,7 @@ class NestedRackRoleSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedRackSerializer(WritableNestedSerializer):
|
class NestedRackSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail')
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'rack')
|
device_count = RelatedObjectCountField('devices')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.Rack
|
model = models.Rack
|
||||||
@ -151,7 +151,7 @@ class NestedRackReservationSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedManufacturerSerializer(WritableNestedSerializer):
|
class NestedManufacturerSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
|
||||||
devicetype_count = RelatedObjectCountField('dcim.devicetype', 'manufacturer')
|
devicetype_count = RelatedObjectCountField('device_types')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.Manufacturer
|
model = models.Manufacturer
|
||||||
@ -164,7 +164,7 @@ class NestedManufacturerSerializer(WritableNestedSerializer):
|
|||||||
class NestedDeviceTypeSerializer(WritableNestedSerializer):
|
class NestedDeviceTypeSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
|
||||||
manufacturer = NestedManufacturerSerializer(read_only=True)
|
manufacturer = NestedManufacturerSerializer(read_only=True)
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'device_type')
|
device_count = RelatedObjectCountField('instances')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.DeviceType
|
model = models.DeviceType
|
||||||
@ -274,8 +274,8 @@ class NestedInventoryItemTemplateSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedDeviceRoleSerializer(WritableNestedSerializer):
|
class NestedDeviceRoleSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'role')
|
device_count = RelatedObjectCountField('devices')
|
||||||
virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'role')
|
virtualmachine_count = RelatedObjectCountField('virtual_machines')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.DeviceRole
|
model = models.DeviceRole
|
||||||
@ -287,8 +287,8 @@ class NestedDeviceRoleSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedPlatformSerializer(WritableNestedSerializer):
|
class NestedPlatformSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'platform')
|
device_count = RelatedObjectCountField('devices')
|
||||||
virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'platform')
|
virtualmachine_count = RelatedObjectCountField('virtual_machines')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.Platform
|
model = models.Platform
|
||||||
@ -445,7 +445,7 @@ class NestedInventoryItemSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedInventoryItemRoleSerializer(WritableNestedSerializer):
|
class NestedInventoryItemRoleSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail')
|
||||||
inventoryitem_count = RelatedObjectCountField('dcim.inventoryitem', 'role')
|
inventoryitem_count = RelatedObjectCountField('inventory_items')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.InventoryItemRole
|
model = models.InventoryItemRole
|
||||||
@ -490,7 +490,7 @@ class NestedVirtualChassisSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedPowerPanelSerializer(WritableNestedSerializer):
|
class NestedPowerPanelSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail')
|
||||||
powerfeed_count = RelatedObjectCountField('dcim.powerfeed', 'power_panel')
|
powerfeed_count = RelatedObjectCountField('powerfeeds')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.PowerPanel
|
model = models.PowerPanel
|
||||||
|
@ -144,12 +144,12 @@ class SiteSerializer(NetBoxModelSerializer):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
circuit_count = RelatedObjectCountField('circuits.circuit', 'terminations__site')
|
circuit_count = RelatedObjectCountField('circuit_terminations')
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'site')
|
device_count = RelatedObjectCountField('devices')
|
||||||
prefix_count = RelatedObjectCountField('ipam.prefix', 'site')
|
prefix_count = RelatedObjectCountField('prefixes')
|
||||||
rack_count = RelatedObjectCountField('dcim.rack', 'site')
|
rack_count = RelatedObjectCountField('racks')
|
||||||
vlan_count = RelatedObjectCountField('ipam.vlan', 'site')
|
vlan_count = RelatedObjectCountField('vlans')
|
||||||
virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'site')
|
virtualmachine_count = RelatedObjectCountField('virtual_machines')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Site
|
model = Site
|
||||||
@ -186,7 +186,7 @@ class RackRoleSerializer(NetBoxModelSerializer):
|
|||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
rack_count = RelatedObjectCountField('dcim.rack', 'role')
|
rack_count = RelatedObjectCountField('racks')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = RackRole
|
model = RackRole
|
||||||
@ -211,8 +211,8 @@ class RackSerializer(NetBoxModelSerializer):
|
|||||||
weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True)
|
weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'rack')
|
device_count = RelatedObjectCountField('devices')
|
||||||
powerfeed_count = RelatedObjectCountField('dcim.powerfeed', 'rack')
|
powerfeed_count = RelatedObjectCountField('powerfeeds')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Rack
|
model = Rack
|
||||||
@ -305,9 +305,9 @@ class ManufacturerSerializer(NetBoxModelSerializer):
|
|||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
devicetype_count = RelatedObjectCountField('dcim.devicetype', 'manufacturer')
|
devicetype_count = RelatedObjectCountField('device_types')
|
||||||
inventoryitem_count = RelatedObjectCountField('dcim.inventoryitem', 'manufacturer')
|
inventoryitem_count = RelatedObjectCountField('inventory_items')
|
||||||
platform_count = RelatedObjectCountField('dcim.platform', 'manufacturer')
|
platform_count = RelatedObjectCountField('platforms')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Manufacturer
|
model = Manufacturer
|
||||||
@ -345,7 +345,7 @@ class DeviceTypeSerializer(NetBoxModelSerializer):
|
|||||||
inventory_item_template_count = serializers.IntegerField(read_only=True)
|
inventory_item_template_count = serializers.IntegerField(read_only=True)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'device_type')
|
device_count = RelatedObjectCountField('instances')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = DeviceType
|
model = DeviceType
|
||||||
@ -646,8 +646,8 @@ class DeviceRoleSerializer(NetBoxModelSerializer):
|
|||||||
config_template = NestedConfigTemplateSerializer(required=False, allow_null=True, default=None)
|
config_template = NestedConfigTemplateSerializer(required=False, allow_null=True, default=None)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'role')
|
device_count = RelatedObjectCountField('devices')
|
||||||
virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'role')
|
virtualmachine_count = RelatedObjectCountField('virtual_machines')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = DeviceRole
|
model = DeviceRole
|
||||||
@ -663,8 +663,8 @@ class PlatformSerializer(NetBoxModelSerializer):
|
|||||||
config_template = NestedConfigTemplateSerializer(required=False, allow_null=True, default=None)
|
config_template = NestedConfigTemplateSerializer(required=False, allow_null=True, default=None)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'platform')
|
device_count = RelatedObjectCountField('devices')
|
||||||
virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'platform')
|
virtualmachine_count = RelatedObjectCountField('virtual_machines')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Platform
|
model = Platform
|
||||||
@ -773,7 +773,7 @@ class VirtualDeviceContextSerializer(NetBoxModelSerializer):
|
|||||||
status = ChoiceField(choices=VirtualDeviceContextStatusChoices)
|
status = ChoiceField(choices=VirtualDeviceContextStatusChoices)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
interface_count = RelatedObjectCountField('dcim.interface', 'vdcs')
|
interface_count = RelatedObjectCountField('interfaces')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = VirtualDeviceContext
|
model = VirtualDeviceContext
|
||||||
@ -1106,7 +1106,7 @@ class InventoryItemRoleSerializer(NetBoxModelSerializer):
|
|||||||
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail')
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
inventoryitem_count = RelatedObjectCountField('dcim.inventoryitem', 'role')
|
inventoryitem_count = RelatedObjectCountField('inventory_items')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = InventoryItemRole
|
model = InventoryItemRole
|
||||||
@ -1220,7 +1220,7 @@ class PowerPanelSerializer(NetBoxModelSerializer):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
powerfeed_count = RelatedObjectCountField('dcim.powerfeed', 'power_panel')
|
powerfeed_count = RelatedObjectCountField('powerfeeds')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PowerPanel
|
model = PowerPanel
|
||||||
|
@ -7,6 +7,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 circuits.models import Circuit
|
||||||
from dcim import filtersets
|
from dcim import filtersets
|
||||||
from dcim.constants import CABLE_TRACE_SVG_DEFAULT_WIDTH
|
from dcim.constants import CABLE_TRACE_SVG_DEFAULT_WIDTH
|
||||||
from dcim.models import *
|
from dcim.models import *
|
||||||
@ -20,6 +21,7 @@ from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin
|
|||||||
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
from netbox.constants import NESTED_SERIALIZER_PREFIX
|
||||||
from utilities.api import get_serializer_for_model
|
from utilities.api import get_serializer_for_model
|
||||||
from utilities.query_functions import CollateAsChar
|
from utilities.query_functions import CollateAsChar
|
||||||
|
from utilities.utils import count_related
|
||||||
from . import serializers
|
from . import serializers
|
||||||
from .exceptions import MissingFilterException
|
from .exceptions import MissingFilterException
|
||||||
|
|
||||||
|
@ -289,7 +289,7 @@ class TagSerializer(ValidatedModelSerializer):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
tagged_items = RelatedObjectCountField('extras.taggeditem', 'tag')
|
tagged_items = RelatedObjectCountField('extras_taggeditem_items')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Tag
|
model = Tag
|
||||||
|
@ -59,7 +59,7 @@ class NestedASNSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedVRFSerializer(WritableNestedSerializer):
|
class NestedVRFSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail')
|
||||||
prefix_count = RelatedObjectCountField('ipam.prefix', 'vrf')
|
prefix_count = RelatedObjectCountField('prefixes')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.VRF
|
model = models.VRF
|
||||||
@ -87,7 +87,7 @@ class NestedRouteTargetSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedRIRSerializer(WritableNestedSerializer):
|
class NestedRIRSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail')
|
||||||
aggregate_count = RelatedObjectCountField('ipam.aggregate', 'rir')
|
aggregate_count = RelatedObjectCountField('aggregates')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.RIR
|
model = models.RIR
|
||||||
@ -133,8 +133,8 @@ class NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedRoleSerializer(WritableNestedSerializer):
|
class NestedRoleSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail')
|
||||||
prefix_count = RelatedObjectCountField('ipam.prefix', 'role')
|
prefix_count = RelatedObjectCountField('prefixes')
|
||||||
vlan_count = RelatedObjectCountField('ipam.vlan', 'role')
|
vlan_count = RelatedObjectCountField('vlans')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.Role
|
model = models.Role
|
||||||
@ -146,7 +146,7 @@ class NestedRoleSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedVLANGroupSerializer(WritableNestedSerializer):
|
class NestedVLANGroupSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail')
|
||||||
vlan_count = RelatedObjectCountField('ipam.vlan', 'group')
|
vlan_count = RelatedObjectCountField('vlans')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.VLANGroup
|
model = models.VLANGroup
|
||||||
|
@ -45,8 +45,8 @@ class ASNSerializer(NetBoxModelSerializer):
|
|||||||
tenant = NestedTenantSerializer(required=False, allow_null=True)
|
tenant = NestedTenantSerializer(required=False, allow_null=True)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
site_count = RelatedObjectCountField('dcim.site', 'asns')
|
site_count = RelatedObjectCountField('sites')
|
||||||
provider_count = RelatedObjectCountField('circuits.provider', 'asns')
|
provider_count = RelatedObjectCountField('providers')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ASN
|
model = ASN
|
||||||
@ -94,8 +94,8 @@ class VRFSerializer(NetBoxModelSerializer):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
ipaddress_count = RelatedObjectCountField('ipam.ipaddress', 'vrf')
|
ipaddress_count = RelatedObjectCountField('ip_addresses')
|
||||||
prefix_count = RelatedObjectCountField('ipam.prefix', 'vrf')
|
prefix_count = RelatedObjectCountField('prefixes')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = VRF
|
model = VRF
|
||||||
@ -130,7 +130,7 @@ class RIRSerializer(NetBoxModelSerializer):
|
|||||||
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail')
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
aggregate_count = RelatedObjectCountField('ipam.aggregate', 'rir')
|
aggregate_count = RelatedObjectCountField('aggregates')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = RIR
|
model = RIR
|
||||||
@ -203,8 +203,8 @@ class RoleSerializer(NetBoxModelSerializer):
|
|||||||
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail')
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
prefix_count = RelatedObjectCountField('ipam.prefix', 'role')
|
prefix_count = RelatedObjectCountField('prefixes')
|
||||||
vlan_count = RelatedObjectCountField('ipam.vlan', 'role')
|
vlan_count = RelatedObjectCountField('vlans')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Role
|
model = Role
|
||||||
@ -229,7 +229,7 @@ class VLANGroupSerializer(NetBoxModelSerializer):
|
|||||||
utilization = serializers.CharField(read_only=True)
|
utilization = serializers.CharField(read_only=True)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
vlan_count = RelatedObjectCountField('ipam.vlan', 'group')
|
vlan_count = RelatedObjectCountField('vlans')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = VLANGroup
|
model = VLANGroup
|
||||||
@ -259,7 +259,7 @@ class VLANSerializer(NetBoxModelSerializer):
|
|||||||
l2vpn_termination = NestedL2VPNTerminationSerializer(read_only=True, allow_null=True)
|
l2vpn_termination = NestedL2VPNTerminationSerializer(read_only=True, allow_null=True)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
prefix_count = RelatedObjectCountField('ipam.prefix', 'vlan')
|
prefix_count = RelatedObjectCountField('prefixes')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = VLAN
|
model = VLAN
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
from django.apps import apps
|
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from drf_spectacular.utils import extend_schema_field
|
|
||||||
from drf_spectacular.types import OpenApiTypes
|
from drf_spectacular.types import OpenApiTypes
|
||||||
|
from drf_spectacular.utils import extend_schema_field
|
||||||
from netaddr import IPNetwork
|
from netaddr import IPNetwork
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from rest_framework.exceptions import ValidationError
|
from rest_framework.exceptions import ValidationError
|
||||||
@ -146,13 +145,7 @@ class RelatedObjectCountField(serializers.ReadOnlyField):
|
|||||||
is detected by get_annotations_for_serializer() when determining the annotations to be added to a queryset
|
is detected by get_annotations_for_serializer() when determining the annotations to be added to a queryset
|
||||||
depending on the serializer fields selected for inclusion in the response.
|
depending on the serializer fields selected for inclusion in the response.
|
||||||
"""
|
"""
|
||||||
def __init__(self, model, related_field, **kwargs):
|
def __init__(self, relation, **kwargs):
|
||||||
super().__init__(**kwargs)
|
self.relation = relation
|
||||||
|
|
||||||
# Set the model and field names passed on the field
|
super().__init__(**kwargs)
|
||||||
if type(model) is str:
|
|
||||||
app_label, model_name = model.split('.')
|
|
||||||
self.model = apps.get_model(app_label, model_name)
|
|
||||||
else:
|
|
||||||
self.model = model
|
|
||||||
self.related_field = related_field
|
|
||||||
|
@ -34,16 +34,16 @@ class TenantSerializer(NetBoxModelSerializer):
|
|||||||
group = NestedTenantGroupSerializer(required=False, allow_null=True)
|
group = NestedTenantGroupSerializer(required=False, allow_null=True)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
circuit_count = RelatedObjectCountField('circuits.circuit', 'tenant')
|
circuit_count = RelatedObjectCountField('circuits')
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'tenant')
|
device_count = RelatedObjectCountField('devices')
|
||||||
rack_count = RelatedObjectCountField('dcim.rack', 'tenant')
|
rack_count = RelatedObjectCountField('racks')
|
||||||
site_count = RelatedObjectCountField('dcim.site', 'tenant')
|
site_count = RelatedObjectCountField('sites')
|
||||||
ipaddress_count = RelatedObjectCountField('ipam.ipaddress', 'tenant')
|
ipaddress_count = RelatedObjectCountField('ip_addresses')
|
||||||
prefix_count = RelatedObjectCountField('ipam.prefix', 'tenant')
|
prefix_count = RelatedObjectCountField('prefixes')
|
||||||
vlan_count = RelatedObjectCountField('ipam.vlan', 'tenant')
|
vlan_count = RelatedObjectCountField('vlans')
|
||||||
vrf_count = RelatedObjectCountField('ipam.vrf', 'tenant')
|
vrf_count = RelatedObjectCountField('vrfs')
|
||||||
virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'tenant')
|
virtualmachine_count = RelatedObjectCountField('virtual_machines')
|
||||||
cluster_count = RelatedObjectCountField('virtualization.cluster', 'tenant')
|
cluster_count = RelatedObjectCountField('clusters')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Tenant
|
model = Tenant
|
||||||
|
@ -17,6 +17,7 @@ from utilities.utils import count_related
|
|||||||
from .utils import dynamic_import
|
from .utils import dynamic_import
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
|
'get_annotations_for_serializer',
|
||||||
'get_graphql_type_for_model',
|
'get_graphql_type_for_model',
|
||||||
'get_prefetches_for_serializer',
|
'get_prefetches_for_serializer',
|
||||||
'get_serializer_for_model',
|
'get_serializer_for_model',
|
||||||
@ -143,9 +144,12 @@ def get_annotations_for_serializer(serializer_class, fields_to_include=None):
|
|||||||
if not fields_to_include:
|
if not fields_to_include:
|
||||||
fields_to_include = serializer_class.Meta.fields
|
fields_to_include = serializer_class.Meta.fields
|
||||||
|
|
||||||
|
model = serializer_class.Meta.model
|
||||||
|
|
||||||
for field_name, field in serializer_class._declared_fields.items():
|
for field_name, field in serializer_class._declared_fields.items():
|
||||||
if field_name in fields_to_include and type(field) is RelatedObjectCountField:
|
if field_name in fields_to_include and type(field) is RelatedObjectCountField:
|
||||||
annotations[field_name] = count_related(field.model, field.related_field)
|
related_field = model._meta.get_field(field.relation).field
|
||||||
|
annotations[field_name] = count_related(related_field.model, related_field.name)
|
||||||
|
|
||||||
return annotations
|
return annotations
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ __all__ = [
|
|||||||
)
|
)
|
||||||
class NestedClusterTypeSerializer(WritableNestedSerializer):
|
class NestedClusterTypeSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
|
||||||
cluster_count = RelatedObjectCountField('virtualization.cluster', 'type')
|
cluster_count = RelatedObjectCountField('clusters')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ClusterType
|
model = ClusterType
|
||||||
@ -36,7 +36,7 @@ class NestedClusterTypeSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedClusterGroupSerializer(WritableNestedSerializer):
|
class NestedClusterGroupSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
|
||||||
cluster_count = RelatedObjectCountField('virtualization.cluster', 'group')
|
cluster_count = RelatedObjectCountField('clusters')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ClusterGroup
|
model = ClusterGroup
|
||||||
@ -48,7 +48,7 @@ class NestedClusterGroupSerializer(WritableNestedSerializer):
|
|||||||
)
|
)
|
||||||
class NestedClusterSerializer(WritableNestedSerializer):
|
class NestedClusterSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail')
|
||||||
virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'cluster')
|
virtualmachine_count = RelatedObjectCountField('virtual_machines')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Cluster
|
model = Cluster
|
||||||
|
@ -25,7 +25,7 @@ class ClusterTypeSerializer(NetBoxModelSerializer):
|
|||||||
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
cluster_count = RelatedObjectCountField('virtualization.cluster', 'type')
|
cluster_count = RelatedObjectCountField('clusters')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ClusterType
|
model = ClusterType
|
||||||
@ -39,7 +39,7 @@ class ClusterGroupSerializer(NetBoxModelSerializer):
|
|||||||
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
cluster_count = RelatedObjectCountField('virtualization.cluster', 'group')
|
cluster_count = RelatedObjectCountField('clusters')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ClusterGroup
|
model = ClusterGroup
|
||||||
@ -58,8 +58,8 @@ class ClusterSerializer(NetBoxModelSerializer):
|
|||||||
site = NestedSiteSerializer(required=False, allow_null=True, default=None)
|
site = NestedSiteSerializer(required=False, allow_null=True, default=None)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
device_count = RelatedObjectCountField('dcim.device', 'cluster')
|
device_count = RelatedObjectCountField('devices')
|
||||||
virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'cluster')
|
virtualmachine_count = RelatedObjectCountField('virtual_machines')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Cluster
|
model = Cluster
|
||||||
|
@ -24,7 +24,7 @@ __all__ = (
|
|||||||
)
|
)
|
||||||
class NestedTunnelGroupSerializer(WritableNestedSerializer):
|
class NestedTunnelGroupSerializer(WritableNestedSerializer):
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail')
|
||||||
tunnel_count = RelatedObjectCountField('vpn.tunnel', 'group')
|
tunnel_count = RelatedObjectCountField('tunnels')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.TunnelGroup
|
model = models.TunnelGroup
|
||||||
|
@ -31,7 +31,7 @@ class TunnelGroupSerializer(NetBoxModelSerializer):
|
|||||||
url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail')
|
url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail')
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
tunnel_count = RelatedObjectCountField('vpn.tunnel', 'group')
|
tunnel_count = RelatedObjectCountField('tunnels')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TunnelGroup
|
model = TunnelGroup
|
||||||
@ -62,7 +62,7 @@ class TunnelSerializer(NetBoxModelSerializer):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Related object counts
|
# Related object counts
|
||||||
terminations_count = RelatedObjectCountField('vpn.tunneltermination', 'tunnel')
|
terminations_count = RelatedObjectCountField('terminations')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Tunnel
|
model = Tunnel
|
||||||
|
Loading…
Reference in New Issue
Block a user