|
@@ -0,0 +1,44 @@
|
|
|
+from django.core.paginator import Paginator as DjangoPaginator, Page, EmptyPage
|
|
|
+from django.http import Http404
|
|
|
+
|
|
|
+
|
|
|
+class Paginator(DjangoPaginator):
|
|
|
+ def page(self, number):
|
|
|
+ """
|
|
|
+ Returns a Page object for the given 1-based page number.
|
|
|
+
|
|
|
+ If its not last page, it will also contain one element of last page
|
|
|
+ """
|
|
|
+ number = self.validate_number(number)
|
|
|
+ bottom = (number - 1) * self.per_page
|
|
|
+ top = bottom + self.per_page
|
|
|
+ if top + self.orphans >= self.count:
|
|
|
+ top = self.count
|
|
|
+ else:
|
|
|
+ top += 1
|
|
|
+ return self._get_page(self.object_list[bottom:top], number, self)
|
|
|
+
|
|
|
+ def _get_page(self, *args, **kwargs):
|
|
|
+ page = Page(*args, **kwargs)
|
|
|
+ if page.has_next():
|
|
|
+ page.next_page_first_item = page[-1]
|
|
|
+ page.object_list = page.object_list[:-1]
|
|
|
+ else:
|
|
|
+ page.next_page_first_item = None
|
|
|
+ return page
|
|
|
+
|
|
|
+
|
|
|
+def paginate(object_list, page, per_page, orphans=0):
|
|
|
+ from misago.core.exceptions import ExplicitFirstPage
|
|
|
+
|
|
|
+ if page in (1, "1"):
|
|
|
+ raise ExplicitFirstPage()
|
|
|
+ elif not page:
|
|
|
+ page = 1
|
|
|
+
|
|
|
+ try:
|
|
|
+ return Paginator(
|
|
|
+ object_list, per_page, orphans=orphans,
|
|
|
+ allow_empty_first_page=allow_empty_first_page).page(page)
|
|
|
+ except EmptyPage:
|
|
|
+ raise Http404()
|