diff --git a/docs/release-notes/version-2.10.md b/docs/release-notes/version-2.10.md
index 5766295af..33b8718d4 100644
--- a/docs/release-notes/version-2.10.md
+++ b/docs/release-notes/version-2.10.md
@@ -62,6 +62,7 @@ All end-to-end cable paths are now cached using the new CablePath model. This al
* [#4878](https://github.com/netbox-community/netbox/issues/4878) - Custom field data is now stored directly on each object
* [#4941](https://github.com/netbox-community/netbox/issues/4941) - `commit` argument is now required argument in a custom script's `run()` method
* [#5011](https://github.com/netbox-community/netbox/issues/5011) - Standardized name field lengths across all models
+* [#5139](https://github.com/netbox-community/netbox/issues/5139) - Omit utilization statistics from RIR list
* [#5225](https://github.com/netbox-community/netbox/issues/5225) - Circuit termination port speed is now an optional field
### REST API Changes
diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py
index cb1d22a39..0104077c0 100644
--- a/netbox/ipam/tables.py
+++ b/netbox/ipam/tables.py
@@ -12,25 +12,6 @@ from .models import Aggregate, IPAddress, Prefix, RIR, Role, RouteTarget, Servic
AVAILABLE_LABEL = mark_safe('Available')
-RIR_UTILIZATION = """
-
- {% if record.stats.total %}
-
- {{ record.stats.percentages.active }}%
-
-
- {{ record.stats.percentages.reserved }}%
-
-
- {{ record.stats.percentages.deprecated }}%
-
-
- {{ record.stats.percentages.available }}%
-
- {% endif %}
-
-"""
-
UTILIZATION_GRAPH = """
{% load helpers %}
{% if record.pk %}{% utilization_graph record.get_utilization %}{% else %}—{% endif %}
@@ -202,48 +183,6 @@ class RIRTable(BaseTable):
default_columns = ('pk', 'name', 'is_private', 'aggregate_count', 'description', 'actions')
-class RIRDetailTable(RIRTable):
- stats_total = tables.Column(
- accessor='stats.total',
- verbose_name='Total',
- footer=lambda table: sum(r.stats['total'] for r in table.data)
- )
- stats_active = tables.Column(
- accessor='stats.active',
- verbose_name='Active',
- footer=lambda table: sum(r.stats['active'] for r in table.data)
- )
- stats_reserved = tables.Column(
- accessor='stats.reserved',
- verbose_name='Reserved',
- footer=lambda table: sum(r.stats['reserved'] for r in table.data)
- )
- stats_deprecated = tables.Column(
- accessor='stats.deprecated',
- verbose_name='Deprecated',
- footer=lambda table: sum(r.stats['deprecated'] for r in table.data)
- )
- stats_available = tables.Column(
- accessor='stats.available',
- verbose_name='Available',
- footer=lambda table: sum(r.stats['available'] for r in table.data)
- )
- utilization = tables.TemplateColumn(
- template_code=RIR_UTILIZATION,
- verbose_name='Utilization'
- )
-
- class Meta(RIRTable.Meta):
- fields = (
- 'pk', 'name', 'slug', 'is_private', 'aggregate_count', 'stats_total', 'stats_active', 'stats_reserved',
- 'stats_deprecated', 'stats_available', 'utilization', 'actions',
- )
- default_columns = (
- 'pk', 'name', 'is_private', 'aggregate_count', 'stats_total', 'stats_active', 'stats_reserved',
- 'stats_deprecated', 'stats_available', 'utilization', 'actions',
- )
-
-
#
# Aggregates
#
diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py
index a52ce7b5d..ca16ec947 100644
--- a/netbox/ipam/views.py
+++ b/netbox/ipam/views.py
@@ -154,79 +154,9 @@ class RIRListView(ObjectListView):
queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')).order_by(*RIR._meta.ordering)
filterset = filters.RIRFilterSet
filterset_form = forms.RIRFilterForm
- table = tables.RIRDetailTable
+ table = tables.RIRTable
template_name = 'ipam/rir_list.html'
- def alter_queryset(self, request):
-
- if request.GET.get('family') == '6':
- family = 6
- denominator = 2 ** 64 # Count /64s for IPv6 rather than individual IPs
- else:
- family = 4
- denominator = 1
-
- rirs = []
- for rir in self.queryset:
-
- stats = {
- 'total': 0,
- 'active': 0,
- 'reserved': 0,
- 'deprecated': 0,
- 'available': 0,
- }
- aggregate_list = Aggregate.objects.restrict(request.user).filter(prefix__family=family, rir=rir)
- for aggregate in aggregate_list:
-
- queryset = Prefix.objects.restrict(request.user).filter(
- prefix__net_contained_or_equal=str(aggregate.prefix)
- )
-
- # Find all consumed space for each prefix status (we ignore containers for this purpose).
- active_prefixes = netaddr.cidr_merge(
- [p.prefix for p in queryset.filter(status=PrefixStatusChoices.STATUS_ACTIVE)]
- )
- reserved_prefixes = netaddr.cidr_merge(
- [p.prefix for p in queryset.filter(status=PrefixStatusChoices.STATUS_RESERVED)]
- )
- deprecated_prefixes = netaddr.cidr_merge(
- [p.prefix for p in queryset.filter(status=PrefixStatusChoices.STATUS_DEPRECATED)]
- )
-
- # Find all available prefixes by subtracting each of the existing prefix sets from the aggregate prefix.
- available_prefixes = (
- netaddr.IPSet([aggregate.prefix]) -
- netaddr.IPSet(active_prefixes) -
- netaddr.IPSet(reserved_prefixes) -
- netaddr.IPSet(deprecated_prefixes)
- )
-
- # Add the size of each metric to the RIR total.
- stats['total'] += int(aggregate.prefix.size / denominator)
- stats['active'] += int(netaddr.IPSet(active_prefixes).size / denominator)
- stats['reserved'] += int(netaddr.IPSet(reserved_prefixes).size / denominator)
- stats['deprecated'] += int(netaddr.IPSet(deprecated_prefixes).size / denominator)
- stats['available'] += int(available_prefixes.size / denominator)
-
- # Calculate the percentage of total space for each prefix status.
- total = float(stats['total'])
- stats['percentages'] = {
- 'active': float('{:.2f}'.format(stats['active'] / total * 100)) if total else 0,
- 'reserved': float('{:.2f}'.format(stats['reserved'] / total * 100)) if total else 0,
- 'deprecated': float('{:.2f}'.format(stats['deprecated'] / total * 100)) if total else 0,
- }
- stats['percentages']['available'] = (
- 100 -
- stats['percentages']['active'] -
- stats['percentages']['reserved'] -
- stats['percentages']['deprecated']
- )
- rir.stats = stats
- rirs.append(rir)
-
- return rirs
-
class RIREditView(ObjectEditView):
queryset = RIR.objects.all()
diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py
index b5c42a239..f527aeeba 100644
--- a/netbox/utilities/views.py
+++ b/netbox/utilities/views.py
@@ -283,9 +283,6 @@ class ObjectListView(ObjectPermissionRequiredMixin, View):
response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
return response
- # Provide a hook to tweak the queryset based on the request immediately prior to rendering the object list
- self.queryset = self.alter_queryset(request)
-
# Compile a dictionary indicating which permissions are available to the current user for this model
permissions = {}
for action in ('add', 'change', 'delete', 'view'):
@@ -337,10 +334,6 @@ class ObjectListView(ObjectPermissionRequiredMixin, View):
return redirect(request.get_full_path())
- def alter_queryset(self, request):
- # .all() is necessary to avoid caching queries
- return self.queryset.all()
-
def extra_context(self):
return {}