Refactor the pagination logic into a reusable module so I can go add it to the other feed pages

This commit is contained in:
Danielle McLean 2017-12-15 12:25:55 +11:00
parent f9e6f1dde3
commit 4033837b91
Signed by: 00dani
GPG key ID: 5A5D2D1AFF12EEC5
3 changed files with 45 additions and 27 deletions

33
entries/pagination.py Normal file
View file

@ -0,0 +1,33 @@
from django.core.paginator import Paginator
from django.shortcuts import redirect
def paginate(queryset, reverse, page):
class Page:
def __init__(self, i):
self.i = i
@property
def url(self):
return reverse(self.i)
@property
def current(self):
return self.i == entries.number
# If the first page was requested, redirect to the clean version of the URL
# with no page suffix.
if page == '1':
return redirect(Page(1).url)
paginator = Paginator(queryset, 10)
entries = paginator.page(page or 1)
entries.pages = tuple(Page(i) for i in paginator.page_range)
if entries.has_previous():
entries.prev = Page(entries.previous_page_number())
if entries.has_next():
entries.next = Page(entries.next_page_number())
return entries

View file

@ -1,12 +1,11 @@
from annoying.decorators import render_to from annoying.decorators import render_to
from django.core.paginator import Paginator
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404
from django.urls import reverse from django.urls import reverse
from users.models import User from users.models import User
from urllib.parse import urljoin from urllib.parse import urljoin
from entries import kinds from entries import kinds, pagination
from lemoncurry import breadcrumbs, utils from lemoncurry import breadcrumbs, utils
breadcrumbs.add('home:index', 'home') breadcrumbs.add('home:index', 'home')
@ -14,33 +13,17 @@ breadcrumbs.add('home:index', 'home')
@render_to('home/index.html') @render_to('home/index.html')
def index(request, page): def index(request, page):
def url(page):
kwargs = {'page': page} if page != 1 else {}
return reverse('home:index', kwargs=kwargs)
query = User.objects.prefetch_related('entries', 'profiles', 'keys') query = User.objects.prefetch_related('entries', 'profiles', 'keys')
user = get_object_or_404(query, pk=1) user = get_object_or_404(query, pk=1)
paginator = Paginator(user.entries.filter(kind__in=kinds.on_home), 10) entries = user.entries.filter(kind__in=kinds.on_home)
# If we explicitly got /page/1 in the URL then redirect to the version with entries = pagination.paginate(queryset=entries, reverse=url, page=page)
# no page suffix. # If we got a valid HTTP response, just return it without rendering.
if page == '1': if hasattr(entries, 'content'):
return redirect('home:index', permanent=True) return entries
entries = paginator.page(page or 1)
class Page:
def __init__(self, i):
self.i = i
@property
def url(self):
return reverse('home:index', kwargs={'page': self.i})
@property
def current(self):
return self.i == entries.number
entries.pages = tuple(Page(i) for i in paginator.page_range)
if entries.has_previous():
entries.prev = Page(entries.previous_page_number())
if entries.has_next():
entries.next = Page(entries.next_page_number())
return { return {
'user': user, 'user': user,

View file

@ -67,6 +67,7 @@
<footer> <footer>
<p>all content licensed under <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">cc by-sa 4.0</a></p> <p>all content licensed under <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">cc by-sa 4.0</a></p>
{% if entries.has_other_pages %}
<nav> <nav>
<ul class="pagination"> <ul class="pagination">
{% if entries.prev %} {% if entries.prev %}
@ -98,6 +99,7 @@
{% endif %} {% endif %}
</ul> </ul>
</nav> </nav>
{% endif %}
{% get_package_json as package %} {% get_package_json as package %}
<p>powered by <a rel="code-repository" href="{{ package.repository }}/tree/v{{ package.version }}">{{ package.name }} {{ package.version }}</a></p> <p>powered by <a rel="code-repository" href="{{ package.repository }}/tree/v{{ package.version }}">{{ package.name }} {{ package.version }}</a></p>