paginator.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from django.core.paginator import Paginator as DjangoPaginator, Page, EmptyPage
  2. from django.http import Http404
  3. class Paginator(DjangoPaginator):
  4. def page(self, number):
  5. """
  6. Returns a Page object for the given 1-based page number.
  7. If its not last page, it will also contain one element of last page
  8. """
  9. number = self.validate_number(number)
  10. bottom = (number - 1) * self.per_page
  11. top = bottom + self.per_page
  12. if top + self.orphans >= self.count:
  13. top = self.count
  14. else:
  15. top += 1
  16. return self._get_page(self.object_list[bottom:top], number, self)
  17. def _get_page(self, *args, **kwargs):
  18. page = Page(*args, **kwargs)
  19. if page.has_next():
  20. page.next_page_first_item = page[-1]
  21. page.object_list = page.object_list[:-1]
  22. else:
  23. page.next_page_first_item = None
  24. return page
  25. def paginate(object_list, page, per_page, orphans=0):
  26. from misago.core.exceptions import ExplicitFirstPage
  27. if page in (1, "1"):
  28. raise ExplicitFirstPage()
  29. elif not page:
  30. page = 1
  31. try:
  32. return Paginator(
  33. object_list, per_page, orphans=orphans,
  34. allow_empty_first_page=False).page(page)
  35. except EmptyPage:
  36. raise Http404()