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.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,

View File

@ -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 "<app>/<model>.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(

View File

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

View File

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

View File

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