Skip to content

Commit 5f09227

Browse files
committed
Fixes #13047: Add annotate_asn_count() to ASNRange manager
1 parent 4355ee6 commit 5f09227

File tree

4 files changed

+35
-13
lines changed

4 files changed

+35
-13
lines changed

netbox/ipam/models/asns.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.utils.translation import gettext as _
55

66
from ipam.fields import ASNField
7+
from ipam.querysets import ASNRangeQuerySet
78
from netbox.models import OrganizationalModel, PrimaryModel
89

910
__all__ = (
@@ -37,6 +38,8 @@ class ASNRange(OrganizationalModel):
3738
null=True
3839
)
3940

41+
objects = ASNRangeQuerySet.as_manager()
42+
4043
class Meta:
4144
ordering = ('name',)
4245
verbose_name = 'ASN range'

netbox/ipam/querysets.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,33 @@
11
from django.contrib.contenttypes.models import ContentType
2-
from django.db.models import Q
2+
from django.db.models import Count, OuterRef, Q, Subquery, Value
33
from django.db.models.expressions import RawSQL
44

55
from utilities.querysets import RestrictedQuerySet
66

7+
__all__ = (
8+
'ASNRangeQuerySet',
9+
'PrefixQuerySet',
10+
'VLANQuerySet',
11+
)
12+
13+
14+
class ASNRangeQuerySet(RestrictedQuerySet):
15+
16+
def annotate_asn_counts(self):
17+
"""
18+
Annotate the number of ASNs which appear within each range.
19+
"""
20+
from .models import ASN
21+
22+
# Because ASN does not have a foreign key to ASNRange, we create a fake column "_" with a consistent value
23+
# that we can use to count ASNs and return a single value per ASNRange.
24+
asns = ASN.objects.filter(
25+
asn__gte=OuterRef('start'),
26+
asn__lte=OuterRef('end')
27+
).order_by().annotate(_=Value(1)).values('_').annotate(c=Count('*')).values('c')
28+
29+
return self.annotate(asn_count=Subquery(asns))
30+
731

832
class PrefixQuerySet(RestrictedQuerySet):
933

netbox/ipam/tables/asn.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@ class ASNRangeTable(TenancyColumnsMixin, NetBoxTable):
2121
tags = columns.TagColumn(
2222
url_name='ipam:asnrange_list'
2323
)
24-
asn_count = columns.LinkedCountColumn(
25-
viewname='ipam:asn_list',
26-
url_params={'asn_id': 'pk'},
27-
verbose_name=_('ASN Count')
24+
asn_count = tables.Column(
25+
verbose_name=_('ASNs')
2826
)
2927

3028
class Meta(NetBoxTable.Meta):
@@ -59,7 +57,8 @@ class ASNTable(TenancyColumnsMixin, NetBoxTable):
5957
verbose_name=_('Provider Count')
6058
)
6159
sites = columns.ManyToManyColumn(
62-
linkify_item=True
60+
linkify_item=True,
61+
verbose_name=_('Sites')
6362
)
6463
comments = columns.MarkdownColumn()
6564
tags = columns.TagColumn(

netbox/ipam/views.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ class RIRBulkDeleteView(generic.BulkDeleteView):
198198
#
199199

200200
class ASNRangeListView(generic.ObjectListView):
201-
queryset = ASNRange.objects.all()
201+
queryset = ASNRange.objects.annotate_asn_counts()
202202
filterset = filtersets.ASNRangeFilterSet
203203
filterset_form = forms.ASNRangeFilterForm
204204
table = tables.ASNRangeTable
@@ -247,18 +247,14 @@ class ASNRangeBulkImportView(generic.BulkImportView):
247247

248248

249249
class ASNRangeBulkEditView(generic.BulkEditView):
250-
queryset = ASNRange.objects.annotate(
251-
site_count=count_related(Site, 'asns')
252-
)
250+
queryset = ASNRange.objects.annotate_asn_counts()
253251
filterset = filtersets.ASNRangeFilterSet
254252
table = tables.ASNRangeTable
255253
form = forms.ASNRangeBulkEditForm
256254

257255

258256
class ASNRangeBulkDeleteView(generic.BulkDeleteView):
259-
queryset = ASNRange.objects.annotate(
260-
site_count=count_related(Site, 'asns')
261-
)
257+
queryset = ASNRange.objects.annotate_asn_counts()
262258
filterset = filtersets.ASNRangeFilterSet
263259
table = tables.ASNRangeTable
264260

0 commit comments

Comments
 (0)