diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 78069bae0..1c0a152b2 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -2,11 +2,10 @@ from django.contrib import messages from django.db import transaction from django.db.models import Q from django.shortcuts import get_object_or_404, redirect, render -from django_tables2 import RequestConfig from netbox.views import generic 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 . import filters, forms, tables from .choices import CircuitTerminationSideChoices @@ -38,12 +37,7 @@ class ProviderView(generic.ObjectView): circuits_table = tables.CircuitTable(circuits) 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 { 'circuits_table': circuits_table, @@ -107,12 +101,7 @@ class CloudView(generic.ObjectView): circuits_table = tables.CircuitTable(circuits) circuits_table.columns.hide('termination_a') 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 { 'circuits_table': circuits_table, diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 976c13760..9add772d7 100644 --- a/netbox/extras/views.py +++ b/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.views.generic import View from django_rq.queues import get_connection -from django_tables2 import RequestConfig from rq import Worker from netbox.views import generic 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.views import ContentTypePermissionRequiredMixin from . import filters, forms, tables @@ -230,13 +229,7 @@ class ObjectChangeLogView(View): data=objectchanges, 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 "/.html" as the template, if it exists. Otherwise, # fall back to using base.html. @@ -359,13 +352,7 @@ class ObjectJournalView(View): data=journalentries, 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'): form = forms.JournalEntryForm( diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index d5332129c..47eccead1 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -1,11 +1,10 @@ from django.db.models import Prefetch from django.db.models.expressions import RawSQL from django.shortcuts import get_object_or_404, redirect, render -from django_tables2 import RequestConfig from dcim.models import Device, Interface 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 virtualization.models import VirtualMachine, VMInterface from . import filters, forms, tables @@ -231,12 +230,7 @@ class AggregateView(generic.ObjectView): prefix_table = tables.PrefixDetailTable(child_prefixes) if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): 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 permissions = { @@ -388,12 +382,7 @@ class PrefixPrefixesView(generic.ObjectView): prefix_table = tables.PrefixDetailTable(child_prefixes) if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): 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 permissions = { @@ -431,12 +420,7 @@ class PrefixIPAddressesView(generic.ObjectView): ip_table = tables.IPAddressTable(ipaddresses) if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'): 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 permissions = { @@ -534,12 +518,6 @@ class IPAddressView(generic.ObjectView): ) 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 { 'parent_prefixes_table': parent_prefixes_table, 'duplicate_ips_table': duplicate_ips_table, @@ -703,12 +681,7 @@ class VLANGroupVLANsView(generic.ObjectView): vlan_table.columns.show('pk') vlan_table.columns.hide('site') 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 permissions = { @@ -758,12 +731,7 @@ class VLANInterfacesView(generic.ObjectView): def get_extra_context(self, request, instance): interfaces = instance.get_interfaces().prefetch_related('device') 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 { 'members_table': members_table, @@ -778,12 +746,7 @@ class VLANVMInterfacesView(generic.ObjectView): def get_extra_context(self, request, instance): interfaces = instance.get_vminterfaces().prefetch_related('virtual_machine') 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 { 'members_table': members_table, diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py index e27447ad0..dadd97b98 100644 --- a/netbox/netbox/views/generic.py +++ b/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.safestring import mark_safe from django.views.generic import View -from django_tables2 import RequestConfig from django_tables2.export import TableExport from extras.models import CustomField, ExportTemplate @@ -23,8 +22,8 @@ from utilities.exceptions import AbortTransaction from utilities.forms import ( 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.tables import paginate_table from utilities.utils import csv_format, normalize_querydict, prepare_cloned_fields 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' ) - # 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 = { 'content_type': content_type, diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index e395a1803..4d5066de8 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -5,8 +5,11 @@ from django.core.exceptions import FieldDoesNotExist from django.db.models.fields.related import RelatedField from django.urls import reverse from django.utils.safestring import mark_safe +from django_tables2 import RequestConfig from django_tables2.data import TableQuerysetData +from .paginator import EnhancedPaginator, get_paginate_count + class BaseTable(tables.Table): """ @@ -331,3 +334,18 @@ class UtilizationColumn(tables.TemplateColumn): def value(self, 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)