# HG changeset patch # User neko259 # Date 2014-01-27 19:37:14 # Node ID 5657c06f7fbe404a6ea3402f0c16a2300a25e44b # Parent cfe2f372c710912ebadb54faab203a21c2be099a Updated paginator for long page lists. Removed old get_threads method in the post manager diff --git a/boards/abstracts/__init__.py b/boards/abstracts/__init__.py new file mode 100644 --- /dev/null +++ b/boards/abstracts/__init__.py @@ -0,0 +1,1 @@ +__author__ = 'vurdalak' diff --git a/boards/abstracts/paginator.py b/boards/abstracts/paginator.py new file mode 100644 --- /dev/null +++ b/boards/abstracts/paginator.py @@ -0,0 +1,22 @@ +from django.core.paginator import Paginator + +__author__ = 'neko259' + +PAGINATOR_LOOKAROUND_SIZE = 3 + + +def get_paginator(*args, **kwargs): + return DividedPaginator(*args, **kwargs) + + +class DividedPaginator(Paginator): + + lookaround_size = PAGINATOR_LOOKAROUND_SIZE + current_page = 0 + + def center_range(self): + index = self.page_range.index(self.current_page) + + start = max(0, index - self.lookaround_size) + end = min(len(self.page_range), index + self.lookaround_size + 1) + return self.page_range[start:end] \ No newline at end of file diff --git a/boards/models/post.py b/boards/models/post.py --- a/boards/models/post.py +++ b/boards/models/post.py @@ -116,26 +116,6 @@ class PostManager(models.Manager): posts = self.filter(poster_ip=ip) map(self.delete_post, posts) - # TODO This method may not be needed any more, because django's paginator - # is used - def get_threads(self, tag=None, page=ALL_PAGES, - order_by='-bump_time', archived=False): - if tag: - threads = tag.threads - - if not threads.exists(): - raise Http404 - else: - threads = Thread.objects.all() - - threads = threads.filter(archived=archived).order_by(order_by) - - if page != ALL_PAGES: - threads = Paginator(threads, settings.THREADS_PER_PAGE).page( - page).object_list - - return threads - # TODO Move this method to thread manager def _delete_old_threads(self): """ @@ -143,7 +123,7 @@ class PostManager(models.Manager): archive the old ones. """ - threads = self.get_threads() + threads = Thread.objects.filter(archived=False) thread_count = threads.count() if thread_count > settings.MAX_THREAD_COUNT: diff --git a/boards/rss.py b/boards/rss.py --- a/boards/rss.py +++ b/boards/rss.py @@ -1,7 +1,7 @@ from django.contrib.syndication.views import Feed from django.core.urlresolvers import reverse from django.shortcuts import get_object_or_404 -from boards.models import Post, Tag +from boards.models import Post, Tag, Thread from neboard import settings __author__ = 'neko259' @@ -15,7 +15,7 @@ class AllThreadsFeed(Feed): description_template = 'boards/rss/post.html' def items(self): - return Post.objects.get_threads(order_by='-id') + return Thread.objects.filter(archived=False).order_by('-id') def item_title(self, item): return item.get_opening_post().title @@ -33,7 +33,7 @@ class TagThreadsFeed(Feed): description_template = 'boards/rss/post.html' def items(self, obj): - return Post.objects.get_threads(tag=obj, order_by='-id') + return obj.threads.filter(archived=False).order_by('-id') def get_object(self, request, tag_name): return get_object_or_404(Tag, name=tag_name) diff --git a/boards/templates/boards/posting_general.html b/boards/templates/boards/posting_general.html --- a/boards/templates/boards/posting_general.html +++ b/boards/templates/boards/posting_general.html @@ -139,8 +139,18 @@ {{ site_name }} {{ version }} - {% trans "Pages:" %}[ - {% for page in paginator.page_range %} + {% trans "Pages:" %} + << + [ + {% for page in paginator.center_range %} >> [RSS] diff --git a/boards/tests.py b/boards/tests.py --- a/boards/tests.py +++ b/boards/tests.py @@ -1,12 +1,13 @@ # coding=utf-8 import time import logging +from django.core.paginator import Paginator from django.test import TestCase from django.test.client import Client from django.core.urlresolvers import reverse, NoReverseMatch -from boards.models import Post, Tag +from boards.models import Post, Tag, Thread from boards import urls from neboard import settings @@ -111,7 +112,7 @@ class PostTests(TestCase): self._create_post() self.assertEqual(settings.MAX_THREAD_COUNT, - len(Post.objects.get_threads())) + len(Thread.objects.filter(archived=False))) def test_pages(self): """Test that the thread list is properly split into pages""" @@ -119,9 +120,11 @@ class PostTests(TestCase): for i in range(settings.MAX_THREAD_COUNT): self._create_post() - all_threads = Post.objects.get_threads() + all_threads = Thread.objects.filter(archived=False) - posts_in_second_page = Post.objects.get_threads(page=2) + paginator = Paginator(Thread.objects.filter(archived=False), + settings.THREADS_PER_PAGE) + posts_in_second_page = paginator.page(2).object_list first_post = posts_in_second_page[0] self.assertEqual(all_threads[settings.THREADS_PER_PAGE].id, diff --git a/boards/views/all_threads.py b/boards/views/all_threads.py --- a/boards/views/all_threads.py +++ b/boards/views/all_threads.py @@ -1,11 +1,11 @@ import string -from django.core.paginator import Paginator from django.core.urlresolvers import reverse from django.db import transaction from django.shortcuts import render, redirect from boards import utils +from boards.abstracts.paginator import get_paginator from boards.forms import ThreadForm, PlainErrorList from boards.models import Post, Thread, Ban, Tag from boards.views.banned import BannedView @@ -31,8 +31,9 @@ class AllThreadsView(PostMixin, BaseBoar if not form: form = ThreadForm(error_class=PlainErrorList) - paginator = Paginator(self.get_threads(), - neboard.settings.THREADS_PER_PAGE) + paginator = get_paginator(self.get_threads(), + neboard.settings.THREADS_PER_PAGE) + paginator.current_page = int(page) threads = paginator.page(page).object_list @@ -44,8 +45,6 @@ class AllThreadsView(PostMixin, BaseBoar return render(request, TEMPLATE, context) def post(self, request, page=DEFAULT_PAGE): - context = self.get_context_data(request=request) - form = ThreadForm(request.POST, request.FILES, error_class=PlainErrorList) form.session = request.session