1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Introduce paginate_table() utility to simplify table pagination

This commit is contained in:
Jeremy Stretch
2021-03-26 13:02:55 -04:00
parent 65d90aa8a3
commit bb00f2ff46
5 changed files with 34 additions and 82 deletions

View File

@ -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_table(circuits_table, request)
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(circuits_table)
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_table(circuits_table, request)
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(circuits_table)
return { return {
'circuits_table': circuits_table, 'circuits_table': circuits_table,

View File

@ -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
) )
paginate_table(objectchanges_table, request)
# Apply the request context
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(objectchanges_table)
# 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
) )
paginate_table(journalentry_table, request)
# Apply the request context
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(journalentry_table)
if request.user.has_perm('extras.add_journalentry'): if request.user.has_perm('extras.add_journalentry'):
form = forms.JournalEntryForm( form = forms.JournalEntryForm(

View File

@ -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_table(prefix_table, request)
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(prefix_table)
# 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_table(prefix_table, request)
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(prefix_table)
# 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_table(ip_table, request)
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(ip_table)
# 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_table(vlan_table, request)
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request),
}
RequestConfig(request, paginate).configure(vlan_table)
# 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_table(members_table, request)
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(members_table)
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_table(members_table, request)
paginate = {
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(members_table)
return { return {
'members_table': members_table, 'members_table': members_table,

View File

@ -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 the objects table
paginate = { paginate_table(table, request)
'paginator_class': EnhancedPaginator,
'per_page': get_paginate_count(request)
}
RequestConfig(request, paginate).configure(table)
context = { context = {
'content_type': content_type, 'content_type': content_type,

View File

@ -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)