Browse Source

Closes #362: Added per_page query parameter to control pagination page length

Jeremy Stretch 8 years ago
parent
commit
28761fc960
3 changed files with 29 additions and 5 deletions
  1. 19 3
      netbox/ipam/views.py
  2. 2 1
      netbox/utilities/paginator.py
  3. 8 1
      netbox/utilities/views.py

+ 19 - 3
netbox/ipam/views.py

@@ -1,6 +1,7 @@
 from django_tables2 import RequestConfig
 import netaddr
 
+from django.conf import settings
 from django.contrib.auth.decorators import permission_required
 from django.contrib.auth.mixins import PermissionRequiredMixin
 from django.contrib import messages
@@ -295,7 +296,12 @@ def aggregate(request, pk):
     prefix_table = tables.PrefixTable(child_prefixes)
     if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
         prefix_table.base_columns['pk'].visible = True
-    RequestConfig(request, paginate={'klass': EnhancedPaginator}).configure(prefix_table)
+
+    paginate = {
+        'klass': EnhancedPaginator,
+        'per_page': request.GET.get('per_page', settings.PAGINATE_COUNT)
+    }
+    RequestConfig(request, paginate).configure(prefix_table)
 
     # Compile permissions list for rendering the object table
     permissions = {
@@ -427,7 +433,12 @@ def prefix(request, pk):
     child_prefix_table = tables.PrefixTable(child_prefixes)
     if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
         child_prefix_table.base_columns['pk'].visible = True
-    RequestConfig(request, paginate={'klass': EnhancedPaginator}).configure(child_prefix_table)
+
+    paginate = {
+        'klass': EnhancedPaginator,
+        'per_page': request.GET.get('per_page', settings.PAGINATE_COUNT)
+    }
+    RequestConfig(request, paginate).configure(child_prefix_table)
 
     # Compile permissions list for rendering the object table
     permissions = {
@@ -500,7 +511,12 @@ def prefix_ipaddresses(request, pk):
     ip_table = tables.IPAddressTable(ipaddresses)
     if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
         ip_table.base_columns['pk'].visible = True
-    RequestConfig(request, paginate={'klass': EnhancedPaginator}).configure(ip_table)
+
+    paginate = {
+        'klass': EnhancedPaginator,
+        'per_page': request.GET.get('per_page', settings.PAGINATE_COUNT)
+    }
+    RequestConfig(request, paginate).configure(ip_table)
 
     # Compile permissions list for rendering the object table
     permissions = {

+ 2 - 1
netbox/utilities/paginator.py

@@ -5,7 +5,8 @@ from django.core.paginator import Paginator, Page
 class EnhancedPaginator(Paginator):
 
     def __init__(self, object_list, per_page, **kwargs):
-        per_page = getattr(settings, 'PAGINATE_COUNT', 50)
+        if not isinstance(per_page, int) or per_page < 1:
+            per_page = getattr(settings, 'PAGINATE_COUNT', 50)
         super(EnhancedPaginator, self).__init__(object_list, per_page, **kwargs)
 
     def _get_page(self, *args, **kwargs):

+ 8 - 1
netbox/utilities/views.py

@@ -1,6 +1,7 @@
 from collections import OrderedDict
 from django_tables2 import RequestConfig
 
+from django.conf import settings
 from django.contrib import messages
 from django.contrib.contenttypes.models import ContentType
 from django.core.exceptions import ValidationError
@@ -101,7 +102,13 @@ class ObjectListView(View):
         table = self.table(self.queryset)
         if 'pk' in table.base_columns and (permissions['change'] or permissions['delete']):
             table.base_columns['pk'].visible = True
-        RequestConfig(request, paginate={'klass': EnhancedPaginator}).configure(table)
+
+        # Apply the request context
+        paginate = {
+            'klass': EnhancedPaginator,
+            'per_page': request.GET.get('per_page', settings.PAGINATE_COUNT)
+        }
+        RequestConfig(request, paginate).configure(table)
 
         context = {
             'table': table,