diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 71d35e1b9..0d9fcdc5f 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -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 diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index bc6fed495..45e5be58f 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -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 diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py index a9ba9826b..39c86d80e 100644 --- a/netbox/tenancy/api/views.py +++ b/netbox/tenancy/api/views.py @@ -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 diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 1af0dfb8c..02c2b0f66 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -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 diff --git a/netbox/utilities/tree_queries.py b/netbox/utilities/tree_queries.py index 155054cd9..e11f4275c 100644 --- a/netbox/utilities/tree_queries.py +++ b/netbox/utilities/tree_queries.py @@ -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 diff --git a/netbox/wireless/views.py b/netbox/wireless/views.py index 121aa6db9..a85ff3461 100644 --- a/netbox/wireless/views.py +++ b/netbox/wireless/views.py @@ -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