Server side pagination for the part list

This commit is contained in:
Oliver Walters 2021-02-28 16:29:25 +11:00
parent 8ce7b572cc
commit 487794a938
3 changed files with 15 additions and 18 deletions

View File

@ -9,6 +9,7 @@ from django_filters.rest_framework import DjangoFilterBackend
from django.http import JsonResponse from django.http import JsonResponse
from django.db.models import Q, F, Count, Prefetch, Sum from django.db.models import Q, F, Count, Prefetch, Sum
from rest_framework.pagination import LimitOffsetPagination
from rest_framework import status from rest_framework import status
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import filters, serializers from rest_framework import filters, serializers
@ -371,6 +372,8 @@ class PartList(generics.ListCreateAPIView):
starred_parts = None starred_parts = None
pagination_class = LimitOffsetPagination
def get_serializer(self, *args, **kwargs): def get_serializer(self, *args, **kwargs):
# Ensure the request context is passed through # Ensure the request context is passed through
@ -397,10 +400,10 @@ class PartList(generics.ListCreateAPIView):
queryset = self.filter_queryset(self.get_queryset()) queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset) page = self.paginate_queryset(queryset)
if page is not None: if page is not None:
serializer = self.get_serializer(page, many=True) serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data) else:
serializer = self.get_serializer(queryset, many=True) serializer = self.get_serializer(queryset, many=True)
data = serializer.data data = serializer.data
@ -445,7 +448,9 @@ class PartList(generics.ListCreateAPIView):
a) For HTTP requests (e.g. via the browseable API) return a DRF response a) For HTTP requests (e.g. via the browseable API) return a DRF response
b) For AJAX requests, simply return a JSON rendered response. b) For AJAX requests, simply return a JSON rendered response.
""" """
if request.is_ajax(): if page is not None:
return self.get_paginated_response(data)
elif request.is_ajax():
return JsonResponse(data, safe=False) return JsonResponse(data, safe=False)
else: else:
return Response(data) return Response(data)
@ -641,17 +646,6 @@ class PartList(generics.ListCreateAPIView):
queryset = queryset.filter(pk__in=parts_need_stock) queryset = queryset.filter(pk__in=parts_need_stock)
# Limit number of results
limit = params.get('limit', None)
if limit is not None:
try:
limit = int(limit)
if limit > 0:
queryset = queryset[:limit]
except ValueError:
pass
return queryset return queryset
filter_backends = [ filter_backends = [
@ -674,6 +668,8 @@ class PartList(generics.ListCreateAPIView):
ordering_fields = [ ordering_fields = [
'name', 'name',
'creation_date', 'creation_date',
'IPN',
'in_stock',
] ]
# Default ordering # Default ordering
@ -685,6 +681,7 @@ class PartList(generics.ListCreateAPIView):
'IPN', 'IPN',
'revision', 'revision',
'keywords', 'keywords',
'category__name',
] ]

View File

@ -387,7 +387,6 @@ class StockList(generics.ListCreateAPIView):
page = self.paginate_queryset(queryset) page = self.paginate_queryset(queryset)
if page is not None: if page is not None:
serializer = self.get_serializer(page, many=True) serializer = self.get_serializer(page, many=True)
else: else:
serializer = self.get_serializer(queryset, many=True) serializer = self.get_serializer(queryset, many=True)
@ -476,7 +475,7 @@ class StockList(generics.ListCreateAPIView):
if page is not None: if page is not None:
return self.get_paginated_response(data) return self.get_paginated_response(data)
if request.is_ajax(): elif request.is_ajax():
return JsonResponse(data, safe=False) return JsonResponse(data, safe=False)
else: else:
return Response(data) return Response(data)

View File

@ -366,7 +366,6 @@ function loadPartTable(table, url, options={}) {
}); });
columns.push({ columns.push({
sortable: true,
field: 'description', field: 'description',
title: '{% trans "Description" %}', title: '{% trans "Description" %}',
formatter: function(value, row, index, field) { formatter: function(value, row, index, field) {
@ -448,6 +447,8 @@ function loadPartTable(table, url, options={}) {
groupBy: false, groupBy: false,
name: options.name || 'part', name: options.name || 'part',
original: params, original: params,
sidePagination: 'server',
pagination: 'true',
formatNoMatches: function() { return '{% trans "No parts found" %}'; }, formatNoMatches: function() { return '{% trans "No parts found" %}'; },
columns: columns, columns: columns,
showColumns: true, showColumns: true,