diff --git a/netbox/ipam/models/asns.py b/netbox/ipam/models/asns.py index 5238f226e..345b41273 100644 --- a/netbox/ipam/models/asns.py +++ b/netbox/ipam/models/asns.py @@ -61,6 +61,12 @@ class ASNRange(OrganizationalModel): if self.end <= self.start: raise ValidationError(f"Starting ASN ({self.start}) must be lower than ending ASN ({self.end}).") + def get_child_asns(self): + return ASN.objects.filter( + asn__gte=self.start, + asn__lte=self.end + ) + def get_available_asns(self): """ Return all available ASNs within this range. diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index 2903d1e74..93a40e5a0 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -1,7 +1,7 @@ import netaddr from .constants import * -from .models import Prefix, VLAN +from .models import ASN, Prefix, VLAN def add_requested_prefixes(parent, prefix_list, show_available=True, show_assigned=True): diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index b6e717464..f6fde2a5d 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -211,14 +211,26 @@ class ASNRangeListView(generic.ObjectListView): class ASNRangeView(generic.ObjectView): queryset = ASNRange.objects.all() - def get_extra_context(self, request, instance): - related_models = ( - (ASN.objects.restrict(request.user, 'view').filter(range=instance), 'range_id'), - ) - return { - 'related_models': related_models, - } +@register_model_view(ASNRange, 'asns') +class ASNRangeASNsView(generic.ObjectChildrenView): + queryset = ASNRange.objects.all() + child_model = ASN + table = tables.ASNTable + filterset = filtersets.ASNFilterSet + template_name = 'ipam/asnrange/asns.html' + tab = ViewTab( + label=_('ASNs'), + badge=lambda x: x.get_child_asns().count(), + permission='ipam.view_asns', + weight=500 + ) + + def get_children(self, request, parent): + return parent.get_child_asns().restrict(request.user, 'view').annotate( + site_count=count_related(Site, 'asns'), + provider_count=count_related(Provider, 'asns') + ) @register_model_view(ASNRange, 'edit') diff --git a/netbox/templates/ipam/asnrange.html b/netbox/templates/ipam/asnrange.html index 5a6b2ac49..f9ec5765f 100644 --- a/netbox/templates/ipam/asnrange.html +++ b/netbox/templates/ipam/asnrange.html @@ -1,4 +1,4 @@ -{% extends 'generic/object.html' %} +{% extends 'ipam/asnrange/base.html' %} {% load buttons %} {% load helpers %} {% load plugins %} @@ -45,20 +45,12 @@ {% include 'inc/panels/tags.html' %}