paginator.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from django.conf import settings
  2. from django.core.paginator import Paginator, Page
  3. class EnhancedPaginator(Paginator):
  4. def __init__(self, object_list, per_page, orphans=None, **kwargs):
  5. # Determine the page size
  6. try:
  7. per_page = int(per_page)
  8. if per_page < 1:
  9. per_page = settings.PAGINATE_COUNT
  10. except ValueError:
  11. per_page = settings.PAGINATE_COUNT
  12. # Set orphans count based on page size
  13. if orphans is None and per_page <= 50:
  14. orphans = 5
  15. elif orphans is None:
  16. orphans = 10
  17. super().__init__(object_list, per_page, orphans=orphans, **kwargs)
  18. def _get_page(self, *args, **kwargs):
  19. return EnhancedPage(*args, **kwargs)
  20. class EnhancedPage(Page):
  21. def smart_pages(self):
  22. # When dealing with five or fewer pages, simply return the whole list.
  23. if self.paginator.num_pages <= 5:
  24. return self.paginator.page_range
  25. # Show first page, last page, next/previous two pages, and current page
  26. n = self.number
  27. pages_wanted = [1, n - 2, n - 1, n, n + 1, n + 2, self.paginator.num_pages]
  28. page_list = sorted(set(self.paginator.page_range).intersection(pages_wanted))
  29. # Insert skip markers
  30. skip_pages = [x[1] for x in zip(page_list[:-1], page_list[1:]) if (x[1] - x[0] != 1)]
  31. for i in skip_pages:
  32. page_list.insert(page_list.index(i), False)
  33. return page_list
  34. def get_paginate_count(request):
  35. """
  36. Determine the length of a page, using the following in order:
  37. 1. per_page URL query parameter
  38. 2. Saved user preference
  39. 3. PAGINATE_COUNT global setting.
  40. """
  41. if 'per_page' in request.GET:
  42. try:
  43. per_page = int(request.GET.get('per_page'))
  44. if request.user.is_authenticated:
  45. request.user.config.set('pagination.per_page', per_page, commit=True)
  46. return per_page
  47. except ValueError:
  48. pass
  49. if request.user.is_authenticated:
  50. return request.user.config.get('pagination.per_page', settings.PAGINATE_COUNT)
  51. return settings.PAGINATE_COUNT