1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

12552 add back add_related_count

This commit is contained in:
Arthur
2023-05-24 11:13:43 -07:00
parent 71a74e410d
commit a480a4c23b
6 changed files with 225 additions and 211 deletions

View File

@ -99,14 +99,13 @@ class PassThroughPortMixin(object):
#
class RegionViewSet(NetBoxModelViewSet):
queryset = Region.objects.all().prefetch_related('tags')
# queryset = Region.objects.add_related_count(
# Region.objects.all(),
# Site,
# 'region',
# 'site_count',
# cumulative=True
# ).prefetch_related('tags')
queryset = Region.objects.add_related_count(
Region.objects.all(),
Site,
'region',
'site_count',
cumulative=True
).prefetch_related('tags')
serializer_class = serializers.RegionSerializer
filterset_class = filtersets.RegionFilterSet
@ -116,14 +115,13 @@ class RegionViewSet(NetBoxModelViewSet):
#
class SiteGroupViewSet(NetBoxModelViewSet):
queryset = SiteGroup.objects.all().prefetch_related('tags')
# queryset = SiteGroup.objects.add_related_count(
# SiteGroup.objects.all(),
# Site,
# 'group',
# 'site_count',
# cumulative=True
# ).prefetch_related('tags')
queryset = SiteGroup.objects.add_related_count(
SiteGroup.objects.all(),
Site,
'group',
'site_count',
cumulative=True
).prefetch_related('tags')
serializer_class = serializers.SiteGroupSerializer
filterset_class = filtersets.SiteGroupFilterSet
@ -152,20 +150,19 @@ class SiteViewSet(NetBoxModelViewSet):
#
class LocationViewSet(NetBoxModelViewSet):
queryset = Location.objects.all().prefetch_related('site', 'tags')
# queryset = Location.objects.add_related_count(
# Location.objects.add_related_count(
# Location.objects.all(),
# Device,
# 'location',
# 'device_count',
# cumulative=True
# ),
# Rack,
# 'location',
# 'rack_count',
# cumulative=True
# ).prefetch_related('site', 'tags')
queryset = Location.objects.add_related_count(
Location.objects.add_related_count(
Location.objects.all(),
Device,
'location',
'device_count',
cumulative=True
),
Rack,
'location',
'rack_count',
cumulative=True
).prefetch_related('site', 'tags')
serializer_class = serializers.LocationSerializer
filterset_class = filtersets.LocationFilterSet

View File

@ -198,14 +198,13 @@ class PathTraceView(generic.ObjectView):
#
class RegionListView(generic.ObjectListView):
queryset = Region.objects.all().order_siblings_by("name")
# queryset = Region.objects.add_related_count(
# Region.objects.all(),
# Site,
# 'region',
# 'site_count',
# cumulative=True
# )
queryset = Region.objects.add_related_count(
Region.objects.all(),
Site,
'region',
'site_count',
cumulative=True
)
filterset = filtersets.RegionFilterSet
filterset_form = forms.RegionFilterForm
table = tables.RegionTable
@ -245,28 +244,26 @@ class RegionBulkImportView(generic.BulkImportView):
class RegionBulkEditView(generic.BulkEditView):
queryset = Region.objects.all()
# queryset = Region.objects.add_related_count(
# Region.objects.all(),
# Site,
# 'region',
# 'site_count',
# cumulative=True
# )
queryset = Region.objects.add_related_count(
Region.objects.all(),
Site,
'region',
'site_count',
cumulative=True
)
filterset = filtersets.RegionFilterSet
table = tables.RegionTable
form = forms.RegionBulkEditForm
class RegionBulkDeleteView(generic.BulkDeleteView):
queryset = Region.objects.all()
# queryset = Region.objects.add_related_count(
# Region.objects.all(),
# Site,
# 'region',
# 'site_count',
# cumulative=True
# )
queryset = Region.objects.add_related_count(
Region.objects.all(),
Site,
'region',
'site_count',
cumulative=True
)
filterset = filtersets.RegionFilterSet
table = tables.RegionTable
@ -281,14 +278,13 @@ class RegionContactsView(ObjectContactsView):
#
class SiteGroupListView(generic.ObjectListView):
queryset = SiteGroup.objects.all()
# queryset = SiteGroup.objects.add_related_count(
# SiteGroup.objects.all(),
# Site,
# 'group',
# 'site_count',
# cumulative=True
# )
queryset = SiteGroup.objects.add_related_count(
SiteGroup.objects.all(),
Site,
'group',
'site_count',
cumulative=True
)
filterset = filtersets.SiteGroupFilterSet
filterset_form = forms.SiteGroupFilterForm
table = tables.SiteGroupTable
@ -328,28 +324,26 @@ class SiteGroupBulkImportView(generic.BulkImportView):
class SiteGroupBulkEditView(generic.BulkEditView):
queryset = SiteGroup.objects.all()
# queryset = SiteGroup.objects.add_related_count(
# SiteGroup.objects.all(),
# Site,
# 'group',
# 'site_count',
# cumulative=True
# )
queryset = SiteGroup.objects.add_related_count(
SiteGroup.objects.all(),
Site,
'group',
'site_count',
cumulative=True
)
filterset = filtersets.SiteGroupFilterSet
table = tables.SiteGroupTable
form = forms.SiteGroupBulkEditForm
class SiteGroupBulkDeleteView(generic.BulkDeleteView):
queryset = SiteGroup.objects.all()
# queryset = SiteGroup.objects.add_related_count(
# SiteGroup.objects.all(),
# Site,
# 'group',
# 'site_count',
# cumulative=True
# )
queryset = SiteGroup.objects.add_related_count(
SiteGroup.objects.all(),
Site,
'group',
'site_count',
cumulative=True
)
filterset = filtersets.SiteGroupFilterSet
table = tables.SiteGroupTable
@ -394,21 +388,20 @@ class SiteView(generic.ObjectView):
(Circuit.objects.restrict(request.user, 'view').filter(terminations__site=instance).distinct(), 'site_id'),
)
locations = Location.objects.all().restrict(request.user, 'view').filter(site=instance)
# locations = Location.objects.add_related_count(
# Location.objects.all(),
# Rack,
# 'location',
# 'rack_count',
# cumulative=True
# )
# locations = Location.objects.add_related_count(
# locations,
# Device,
# 'location',
# 'device_count',
# cumulative=True
# ).restrict(request.user, 'view').filter(site=instance)
locations = Location.objects.add_related_count(
Location.objects.all(),
Rack,
'location',
'rack_count',
cumulative=True
)
locations = Location.objects.add_related_count(
locations,
Device,
'location',
'device_count',
cumulative=True
).restrict(request.user, 'view').filter(site=instance)
nonracked_devices = Device.objects.filter(
site=instance,
@ -463,20 +456,19 @@ class SiteContactsView(ObjectContactsView):
#
class LocationListView(generic.ObjectListView):
queryset = Location.objects.all()
# queryset = Location.objects.add_related_count(
# Location.objects.add_related_count(
# Location.objects.all(),
# Device,
# 'location',
# 'device_count',
# cumulative=True
# ),
# Rack,
# 'location',
# 'rack_count',
# cumulative=True
# )
queryset = Location.objects.add_related_count(
Location.objects.add_related_count(
Location.objects.all(),
Device,
'location',
'device_count',
cumulative=True
),
Rack,
'location',
'rack_count',
cumulative=True
)
filterset = filtersets.LocationFilterSet
filterset_form = forms.LocationFilterForm
table = tables.LocationTable
@ -523,28 +515,26 @@ class LocationBulkImportView(generic.BulkImportView):
class LocationBulkEditView(generic.BulkEditView):
queryset = Location.objects.all()
# queryset = Location.objects.add_related_count(
# Location.objects.all(),
# Rack,
# 'location',
# 'rack_count',
# cumulative=True
# ).prefetch_related('site')
queryset = Location.objects.add_related_count(
Location.objects.all(),
Rack,
'location',
'rack_count',
cumulative=True
).prefetch_related('site')
filterset = filtersets.LocationFilterSet
table = tables.LocationTable
form = forms.LocationBulkEditForm
class LocationBulkDeleteView(generic.BulkDeleteView):
queryset = Location.objects.all()
# queryset = Location.objects.add_related_count(
# Location.objects.all(),
# Rack,
# 'location',
# 'rack_count',
# cumulative=True
# ).prefetch_related('site')
queryset = Location.objects.add_related_count(
Location.objects.all(),
Rack,
'location',
'rack_count',
cumulative=True
).prefetch_related('site')
filterset = filtersets.LocationFilterSet
table = tables.LocationTable

View File

@ -24,14 +24,13 @@ class TenancyRootView(APIRootView):
#
class TenantGroupViewSet(NetBoxModelViewSet):
queryset = TenantGroup.objects.all().prefetch_related('tags')
# queryset = TenantGroup.objects.add_related_count(
# TenantGroup.objects.all(),
# Tenant,
# 'group',
# 'tenant_count',
# cumulative=True
# ).prefetch_related('tags')
queryset = TenantGroup.objects.add_related_count(
TenantGroup.objects.all(),
Tenant,
'group',
'tenant_count',
cumulative=True
).prefetch_related('tags')
serializer_class = serializers.TenantGroupSerializer
filterset_class = filtersets.TenantGroupFilterSet
@ -60,14 +59,13 @@ class TenantViewSet(NetBoxModelViewSet):
#
class ContactGroupViewSet(NetBoxModelViewSet):
queryset = ContactGroup.objects.all().prefetch_related('tags')
# queryset = ContactGroup.objects.add_related_count(
# ContactGroup.objects.all(),
# Contact,
# 'group',
# 'contact_count',
# cumulative=True
# ).prefetch_related('tags')
queryset = ContactGroup.objects.add_related_count(
ContactGroup.objects.all(),
Contact,
'group',
'contact_count',
cumulative=True
).prefetch_related('tags')
serializer_class = serializers.ContactGroupSerializer
filterset_class = filtersets.ContactGroupFilterSet

View File

@ -42,14 +42,13 @@ class ObjectContactsView(generic.ObjectChildrenView):
class TenantGroupListView(generic.ObjectListView):
queryset = TenantGroup.objects.all()
# queryset = TenantGroup.objects.add_related_count(
# TenantGroup.objects.all(),
# Tenant,
# 'group',
# 'tenant_count',
# cumulative=True
# )
queryset = TenantGroup.objects.add_related_count(
TenantGroup.objects.all(),
Tenant,
'group',
'tenant_count',
cumulative=True
)
filterset = filtersets.TenantGroupFilterSet
filterset_form = forms.TenantGroupFilterForm
table = tables.TenantGroupTable
@ -87,28 +86,26 @@ class TenantGroupBulkImportView(generic.BulkImportView):
class TenantGroupBulkEditView(generic.BulkEditView):
queryset = TenantGroup.objects.all()
# queryset = TenantGroup.objects.add_related_count(
# TenantGroup.objects.all(),
# Tenant,
# 'group',
# 'tenant_count',
# cumulative=True
# )
queryset = TenantGroup.objects.add_related_count(
TenantGroup.objects.all(),
Tenant,
'group',
'tenant_count',
cumulative=True
)
filterset = filtersets.TenantGroupFilterSet
table = tables.TenantGroupTable
form = forms.TenantGroupBulkEditForm
class TenantGroupBulkDeleteView(generic.BulkDeleteView):
queryset = TenantGroup.objects.all()
# queryset = TenantGroup.objects.add_related_count(
# TenantGroup.objects.all(),
# Tenant,
# 'group',
# 'tenant_count',
# cumulative=True
# )
queryset = TenantGroup.objects.add_related_count(
TenantGroup.objects.all(),
Tenant,
'group',
'tenant_count',
cumulative=True
)
filterset = filtersets.TenantGroupFilterSet
table = tables.TenantGroupTable
@ -201,14 +198,13 @@ class TenantContactsView(ObjectContactsView):
#
class ContactGroupListView(generic.ObjectListView):
queryset = ContactGroup.objects.all()
# queryset = ContactGroup.objects.add_related_count(
# ContactGroup.objects.all(),
# Contact,
# 'group',
# 'contact_count',
# cumulative=True
# )
queryset = ContactGroup.objects.add_related_count(
ContactGroup.objects.all(),
Contact,
'group',
'contact_count',
cumulative=True
)
filterset = filtersets.ContactGroupFilterSet
filterset_form = forms.ContactGroupFilterForm
table = tables.ContactGroupTable
@ -246,28 +242,26 @@ class ContactGroupBulkImportView(generic.BulkImportView):
class ContactGroupBulkEditView(generic.BulkEditView):
queryset = ContactGroup.objects.all()
# queryset = ContactGroup.objects.add_related_count(
# ContactGroup.objects.all(),
# Contact,
# 'group',
# 'contact_count',
# cumulative=True
# )
queryset = ContactGroup.objects.add_related_count(
ContactGroup.objects.all(),
Contact,
'group',
'contact_count',
cumulative=True
)
filterset = filtersets.ContactGroupFilterSet
table = tables.ContactGroupTable
form = forms.ContactGroupBulkEditForm
class ContactGroupBulkDeleteView(generic.BulkDeleteView):
queryset = ContactGroup.objects.all()
# queryset = ContactGroup.objects.add_related_count(
# ContactGroup.objects.all(),
# Contact,
# 'group',
# 'contact_count',
# cumulative=True
# )
queryset = ContactGroup.objects.add_related_count(
ContactGroup.objects.all(),
Contact,
'group',
'contact_count',
cumulative=True
)
filterset = filtersets.ContactGroupFilterSet
table = tables.ContactGroupTable

View File

@ -23,3 +23,41 @@ class TreeManager(Manager.from_queryset(TreeQuerySet), TreeManager_):
"""
_with_tree_fields = True
def add_related_count(
self,
queryset,
rel_model,
rel_field,
count_attr,
cumulative=False,
extra_filters={},
):
"""
Adds a related item count to a given ``QuerySet`` using its
``extra`` method, for a ``Model`` class which has a relation to
this ``Manager``'s ``Model`` class.
Arguments:
``rel_model``
A ``Model`` class which has a relation to this `Manager``'s
``Model`` class.
``rel_field``
The name of the field in ``rel_model`` which holds the
relation.
``count_attr``
The name of an attribute which should be added to each item in
this ``QuerySet``, containing a count of how many instances
of ``rel_model`` are related to it through ``rel_field``.
``cumulative``
If ``True``, the count will be for each item and all of its
descendants, otherwise it will be for each item itself.
``extra_filters``
Dict with aditional parameters filtering the related queryset.
"""
return queryset

View File

@ -11,14 +11,13 @@ from .models import *
#
class WirelessLANGroupListView(generic.ObjectListView):
queryset = WirelessLANGroup.objects.all().prefetch_related('tags')
# queryset = WirelessLANGroup.objects.add_related_count(
# WirelessLANGroup.objects.all(),
# WirelessLAN,
# 'group',
# 'wirelesslan_count',
# cumulative=True
# ).prefetch_related('tags')
queryset = WirelessLANGroup.objects.add_related_count(
WirelessLANGroup.objects.all(),
WirelessLAN,
'group',
'wirelesslan_count',
cumulative=True
).prefetch_related('tags')
filterset = filtersets.WirelessLANGroupFilterSet
filterset_form = forms.WirelessLANGroupFilterForm
table = tables.WirelessLANGroupTable
@ -56,28 +55,26 @@ class WirelessLANGroupBulkImportView(generic.BulkImportView):
class WirelessLANGroupBulkEditView(generic.BulkEditView):
queryset = WirelessLANGroup.objects.all()
# queryset = WirelessLANGroup.objects.add_related_count(
# WirelessLANGroup.objects.all(),
# WirelessLAN,
# 'group',
# 'wirelesslan_count',
# cumulative=True
# )
queryset = WirelessLANGroup.objects.add_related_count(
WirelessLANGroup.objects.all(),
WirelessLAN,
'group',
'wirelesslan_count',
cumulative=True
)
filterset = filtersets.WirelessLANGroupFilterSet
table = tables.WirelessLANGroupTable
form = forms.WirelessLANGroupBulkEditForm
class WirelessLANGroupBulkDeleteView(generic.BulkDeleteView):
queryset = WirelessLANGroup.objects.all()
# queryset = WirelessLANGroup.objects.add_related_count(
# WirelessLANGroup.objects.all(),
# WirelessLAN,
# 'group',
# 'wirelesslan_count',
# cumulative=True
# )
queryset = WirelessLANGroup.objects.add_related_count(
WirelessLANGroup.objects.all(),
WirelessLAN,
'group',
'wirelesslan_count',
cumulative=True
)
filterset = filtersets.WirelessLANGroupFilterSet
table = tables.WirelessLANGroupTable