Jelajahi Sumber

Introduce paginate_table() utility to simplify table pagination

Jeremy Stretch 4 tahun lalu
induk
melakukan
bb00f2ff46

+ 3 - 14
netbox/circuits/views.py

@@ -2,11 +2,10 @@ from django.contrib import messages
 from django.db import transaction
 from django.db import transaction
 from django.db.models import Q
 from django.db.models import Q
 from django.shortcuts import get_object_or_404, redirect, render
 from django.shortcuts import get_object_or_404, redirect, render
-from django_tables2 import RequestConfig
 
 
 from netbox.views import generic
 from netbox.views import generic
 from utilities.forms import ConfirmationForm
 from utilities.forms import ConfirmationForm
-from utilities.paginator import EnhancedPaginator, get_paginate_count
+from utilities.tables import paginate_table
 from utilities.utils import count_related
 from utilities.utils import count_related
 from . import filters, forms, tables
 from . import filters, forms, tables
 from .choices import CircuitTerminationSideChoices
 from .choices import CircuitTerminationSideChoices
@@ -38,12 +37,7 @@ class ProviderView(generic.ObjectView):
 
 
         circuits_table = tables.CircuitTable(circuits)
         circuits_table = tables.CircuitTable(circuits)
         circuits_table.columns.hide('provider')
         circuits_table.columns.hide('provider')
-
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(circuits_table)
+        paginate_table(circuits_table, request)
 
 
         return {
         return {
             'circuits_table': circuits_table,
             'circuits_table': circuits_table,
@@ -107,12 +101,7 @@ class CloudView(generic.ObjectView):
         circuits_table = tables.CircuitTable(circuits)
         circuits_table = tables.CircuitTable(circuits)
         circuits_table.columns.hide('termination_a')
         circuits_table.columns.hide('termination_a')
         circuits_table.columns.hide('termination_z')
         circuits_table.columns.hide('termination_z')
-
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(circuits_table)
+        paginate_table(circuits_table, request)
 
 
         return {
         return {
             'circuits_table': circuits_table,
             'circuits_table': circuits_table,

+ 3 - 16
netbox/extras/views.py

@@ -7,12 +7,11 @@ from django.shortcuts import get_object_or_404, redirect, render
 from django.urls import reverse
 from django.urls import reverse
 from django.views.generic import View
 from django.views.generic import View
 from django_rq.queues import get_connection
 from django_rq.queues import get_connection
-from django_tables2 import RequestConfig
 from rq import Worker
 from rq import Worker
 
 
 from netbox.views import generic
 from netbox.views import generic
 from utilities.forms import ConfirmationForm
 from utilities.forms import ConfirmationForm
-from utilities.paginator import EnhancedPaginator, get_paginate_count
+from utilities.tables import paginate_table
 from utilities.utils import copy_safe_request, count_related, shallow_compare_dict
 from utilities.utils import copy_safe_request, count_related, shallow_compare_dict
 from utilities.views import ContentTypePermissionRequiredMixin
 from utilities.views import ContentTypePermissionRequiredMixin
 from . import filters, forms, tables
 from . import filters, forms, tables
@@ -230,13 +229,7 @@ class ObjectChangeLogView(View):
             data=objectchanges,
             data=objectchanges,
             orderable=False
             orderable=False
         )
         )
-
-        # Apply the request context
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(objectchanges_table)
+        paginate_table(objectchanges_table, request)
 
 
         # Default to using "<app>/<model>.html" as the template, if it exists. Otherwise,
         # Default to using "<app>/<model>.html" as the template, if it exists. Otherwise,
         # fall back to using base.html.
         # fall back to using base.html.
@@ -359,13 +352,7 @@ class ObjectJournalView(View):
             data=journalentries,
             data=journalentries,
             orderable=False
             orderable=False
         )
         )
-
-        # Apply the request context
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(journalentry_table)
+        paginate_table(journalentry_table, request)
 
 
         if request.user.has_perm('extras.add_journalentry'):
         if request.user.has_perm('extras.add_journalentry'):
             form = forms.JournalEntryForm(
             form = forms.JournalEntryForm(

+ 7 - 44
netbox/ipam/views.py

@@ -1,11 +1,10 @@
 from django.db.models import Prefetch
 from django.db.models import Prefetch
 from django.db.models.expressions import RawSQL
 from django.db.models.expressions import RawSQL
 from django.shortcuts import get_object_or_404, redirect, render
 from django.shortcuts import get_object_or_404, redirect, render
-from django_tables2 import RequestConfig
 
 
 from dcim.models import Device, Interface
 from dcim.models import Device, Interface
 from netbox.views import generic
 from netbox.views import generic
-from utilities.paginator import EnhancedPaginator, get_paginate_count
+from utilities.tables import paginate_table
 from utilities.utils import count_related
 from utilities.utils import count_related
 from virtualization.models import VirtualMachine, VMInterface
 from virtualization.models import VirtualMachine, VMInterface
 from . import filters, forms, tables
 from . import filters, forms, tables
@@ -231,12 +230,7 @@ class AggregateView(generic.ObjectView):
         prefix_table = tables.PrefixDetailTable(child_prefixes)
         prefix_table = tables.PrefixDetailTable(child_prefixes)
         if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
         if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
             prefix_table.columns.show('pk')
             prefix_table.columns.show('pk')
-
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(prefix_table)
+        paginate_table(prefix_table, request)
 
 
         # Compile permissions list for rendering the object table
         # Compile permissions list for rendering the object table
         permissions = {
         permissions = {
@@ -388,12 +382,7 @@ class PrefixPrefixesView(generic.ObjectView):
         prefix_table = tables.PrefixDetailTable(child_prefixes)
         prefix_table = tables.PrefixDetailTable(child_prefixes)
         if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
         if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
             prefix_table.columns.show('pk')
             prefix_table.columns.show('pk')
-
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(prefix_table)
+        paginate_table(prefix_table, request)
 
 
         # Compile permissions list for rendering the object table
         # Compile permissions list for rendering the object table
         permissions = {
         permissions = {
@@ -431,12 +420,7 @@ class PrefixIPAddressesView(generic.ObjectView):
         ip_table = tables.IPAddressTable(ipaddresses)
         ip_table = tables.IPAddressTable(ipaddresses)
         if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
         if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
             ip_table.columns.show('pk')
             ip_table.columns.show('pk')
-
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(ip_table)
+        paginate_table(ip_table, request)
 
 
         # Compile permissions list for rendering the object table
         # Compile permissions list for rendering the object table
         permissions = {
         permissions = {
@@ -534,12 +518,6 @@ class IPAddressView(generic.ObjectView):
         )
         )
         related_ips_table = tables.IPAddressTable(related_ips, orderable=False)
         related_ips_table = tables.IPAddressTable(related_ips, orderable=False)
 
 
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(related_ips_table)
-
         return {
         return {
             'parent_prefixes_table': parent_prefixes_table,
             'parent_prefixes_table': parent_prefixes_table,
             'duplicate_ips_table': duplicate_ips_table,
             'duplicate_ips_table': duplicate_ips_table,
@@ -703,12 +681,7 @@ class VLANGroupVLANsView(generic.ObjectView):
             vlan_table.columns.show('pk')
             vlan_table.columns.show('pk')
         vlan_table.columns.hide('site')
         vlan_table.columns.hide('site')
         vlan_table.columns.hide('group')
         vlan_table.columns.hide('group')
-
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request),
-        }
-        RequestConfig(request, paginate).configure(vlan_table)
+        paginate_table(vlan_table, request)
 
 
         # Compile permissions list for rendering the object table
         # Compile permissions list for rendering the object table
         permissions = {
         permissions = {
@@ -758,12 +731,7 @@ class VLANInterfacesView(generic.ObjectView):
     def get_extra_context(self, request, instance):
     def get_extra_context(self, request, instance):
         interfaces = instance.get_interfaces().prefetch_related('device')
         interfaces = instance.get_interfaces().prefetch_related('device')
         members_table = tables.VLANDevicesTable(interfaces)
         members_table = tables.VLANDevicesTable(interfaces)
-
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(members_table)
+        paginate_table(members_table, request)
 
 
         return {
         return {
             'members_table': members_table,
             'members_table': members_table,
@@ -778,12 +746,7 @@ class VLANVMInterfacesView(generic.ObjectView):
     def get_extra_context(self, request, instance):
     def get_extra_context(self, request, instance):
         interfaces = instance.get_vminterfaces().prefetch_related('virtual_machine')
         interfaces = instance.get_vminterfaces().prefetch_related('virtual_machine')
         members_table = tables.VLANVirtualMachinesTable(interfaces)
         members_table = tables.VLANVirtualMachinesTable(interfaces)
-
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(members_table)
+        paginate_table(members_table, request)
 
 
         return {
         return {
             'members_table': members_table,
             'members_table': members_table,

+ 3 - 8
netbox/netbox/views/generic.py

@@ -14,7 +14,6 @@ from django.utils.html import escape
 from django.utils.http import is_safe_url
 from django.utils.http import is_safe_url
 from django.utils.safestring import mark_safe
 from django.utils.safestring import mark_safe
 from django.views.generic import View
 from django.views.generic import View
-from django_tables2 import RequestConfig
 from django_tables2.export import TableExport
 from django_tables2.export import TableExport
 
 
 from extras.models import CustomField, ExportTemplate
 from extras.models import CustomField, ExportTemplate
@@ -23,8 +22,8 @@ from utilities.exceptions import AbortTransaction
 from utilities.forms import (
 from utilities.forms import (
     BootstrapMixin, BulkRenameForm, ConfirmationForm, CSVDataField, ImportForm, TableConfigForm, restrict_form_fields,
     BootstrapMixin, BulkRenameForm, ConfirmationForm, CSVDataField, ImportForm, TableConfigForm, restrict_form_fields,
 )
 )
-from utilities.paginator import EnhancedPaginator, get_paginate_count
 from utilities.permissions import get_permission_for_model
 from utilities.permissions import get_permission_for_model
+from utilities.tables import paginate_table
 from utilities.utils import csv_format, normalize_querydict, prepare_cloned_fields
 from utilities.utils import csv_format, normalize_querydict, prepare_cloned_fields
 from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin
 from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin
 
 
@@ -195,12 +194,8 @@ class ObjectListView(ObjectPermissionRequiredMixin, View):
                 filename=f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv'
                 filename=f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv'
             )
             )
 
 
-        # Apply the request context
-        paginate = {
-            'paginator_class': EnhancedPaginator,
-            'per_page': get_paginate_count(request)
-        }
-        RequestConfig(request, paginate).configure(table)
+        # Paginate the objects table
+        paginate_table(table, request)
 
 
         context = {
         context = {
             'content_type': content_type,
             'content_type': content_type,

+ 18 - 0
netbox/utilities/tables.py

@@ -5,8 +5,11 @@ from django.core.exceptions import FieldDoesNotExist
 from django.db.models.fields.related import RelatedField
 from django.db.models.fields.related import RelatedField
 from django.urls import reverse
 from django.urls import reverse
 from django.utils.safestring import mark_safe
 from django.utils.safestring import mark_safe
+from django_tables2 import RequestConfig
 from django_tables2.data import TableQuerysetData
 from django_tables2.data import TableQuerysetData
 
 
+from .paginator import EnhancedPaginator, get_paginate_count
+
 
 
 class BaseTable(tables.Table):
 class BaseTable(tables.Table):
     """
     """
@@ -331,3 +334,18 @@ class UtilizationColumn(tables.TemplateColumn):
 
 
     def value(self, value):
     def value(self, value):
         return f'{value}%'
         return f'{value}%'
+
+
+#
+# Pagination
+#
+
+def paginate_table(table, request):
+    """
+    Paginate a table given a request context.
+    """
+    paginate = {
+        'paginator_class': EnhancedPaginator,
+        'per_page': get_paginate_count(request)
+    }
+    RequestConfig(request, paginate).configure(table)