Repository: netbox-community/netbox

Issue:
Add Pagination to Provider Detail View
<!--
    NOTE: This form is only for proposing specific new features or enhancements.
    If you have a general idea or question, please post to our mailing list
    instead of opening an issue:

        https://groups.google.com/forum/#!forum/netbox-discuss

    NOTE: Due to an excessive backlog of feature requests, we are not currently
    accepting any proposals which significantly extend NetBox's feature scope.

    Please describe the environment in which you are running NetBox. Be sure
    that you are running an unmodified instance of the latest stable release
    before submitting a bug report.
-->
### Environment
* Python version:  3.6.8 <!-- Example: 3.5.4 -->
* NetBox version:  2.5.13 <!-- Example: 2.3.6 -->

<!--
    Describe in detail the new functionality you are proposing. Include any
    specific changes to work flows, data models, or the user interface.
-->
### Proposed Functionality

Similar to https://github.com/netbox-community/netbox/issues/3314, the provider detail circuit listing would benefit from pagination when the object count is higher than a few hundred entries.

Edit: Same goes for IP Address detail page (Related and Duplicate IPs) (`/ipam/ip-addresses/<id>/`)

<!--
    Convey an example use case for your proposed feature. Write from the
    perspective of a NetBox user who would benefit from the proposed
    functionality and describe how.
--->
### Use Case

When viewing Providers (e.g., `/circuits/providers/att/`) with a high number of circuits, the page loads very slow (and performs a larger DB query). Adding pagination will reduce the load on the webserver and the DB.

Edit: Same goes for IP Address detail page (Related and Duplicate IPs) (`/ipam/ip-addresses/<id>/`)

<!--
    Note any changes to the database schema necessary to support the new
    feature. For example, does the proposal require adding a new model or
    field? (Not all new features require database changes.)
--->
### Database Changes
 NA

<!--
    List any new dependencies on external libraries or services that this new
    feature would introduce. For example, does the proposal require the
    installation of a new Python package? (Not all new features introduce new
    dependencies.)
-->
### External Dependencies
NA


Discussion:
Title needs to be changed to reflect the IP address detail page to be covered in this too.
I think in this framework a global pagination should be introduced for all possible tables that exist as APPS in Netbox.
> I think in this framework a global pagination should be introduced for all possible tables that exist as APPS in Netbox.

The project is already using https://github.com/jieter/django-tables2 to do just that - just needs to be enabled for the pages in question.
Regarding "Related IP Address" table in the IP Address view, it becomes too heavy to load when the related IP address list is big. It is because the table does not have pagination feature (all items are listed on one page even if the list size is >9999...).

I think it is challenging to enable pagination on the table only because it is implemented as one of the subpanels on this page. Moving to a separate tab is easier in terms of implementation.

Resolving patch:
diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py
--- a/netbox/circuits/views.py
+++ b/netbox/circuits/views.py
@@ -1,3 +1,4 @@
+from django.conf import settings
 from django.contrib import messages
 from django.contrib.auth.decorators import permission_required
 from django.contrib.auth.mixins import PermissionRequiredMixin
@@ -5,9 +6,11 @@
 from django.db.models import Count, OuterRef, Subquery
 from django.shortcuts import get_object_or_404, redirect, render
 from django.views.generic import View
+from django_tables2 import RequestConfig
 
 from extras.models import Graph, GRAPH_TYPE_PROVIDER
 from utilities.forms import ConfirmationForm
+from utilities.paginator import EnhancedPaginator
 from utilities.views import (
     BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
 )
@@ -38,9 +41,18 @@ def get(self, request, slug):
         circuits = Circuit.objects.filter(provider=provider).prefetch_related('type', 'tenant', 'terminations__site')
         show_graphs = Graph.objects.filter(type=GRAPH_TYPE_PROVIDER).exists()
 
+        circuits_table = tables.CircuitTable(circuits, orderable=False)
+        circuits_table.columns.hide('provider')
+
+        paginate = {
+            'paginator_class': EnhancedPaginator,
+            'per_page': request.GET.get('per_page', settings.PAGINATE_COUNT)
+        }
+        RequestConfig(request, paginate).configure(circuits_table)
+
         return render(request, 'circuits/provider.html', {
             'provider': provider,
-            'circuits': circuits,
+            'circuits_table': circuits_table,
             'show_graphs': show_graphs,
         })
 


Test patch: