##// END OF EJS Templates
Using django paginator instead of manual pagination
neko259 -
r493:1e58394d 1.6-dev
parent child Browse files
Show More
@@ -6,6 +6,7 b' import time'
6 import math
6 import math
7 import re
7 import re
8 from django.core.cache import cache
8 from django.core.cache import cache
9 from django.core.paginator import Paginator
9
10
10 from django.db import models
11 from django.db import models
11 from django.http import Http404
12 from django.http import Http404
@@ -126,28 +127,12 b' class PostManager(models.Manager):'
126 threads = threads.filter(archived=archived).order_by(order_by)
127 threads = threads.filter(archived=archived).order_by(order_by)
127
128
128 if page != ALL_PAGES:
129 if page != ALL_PAGES:
129 thread_count = threads.count()
130 threads = Paginator(threads, settings.THREADS_PER_PAGE).page(
130
131 page).object_list
131 if page < self._get_page_count(thread_count):
132 start_thread = page * settings.THREADS_PER_PAGE
133 end_thread = min(start_thread + settings.THREADS_PER_PAGE,
134 thread_count)
135 threads = threads[start_thread:end_thread]
136
132
137 return threads
133 return threads
138
134
139 # TODO Move this method to thread manager
135 # TODO Move this method to thread manager
140 def get_thread_page_count(self, tag=None, archived=False):
141 if tag:
142 threads = Thread.objects.filter(tags=tag)
143 else:
144 threads = Thread.objects.all()
145
146 threads = threads.filter(archived=archived)
147
148 return self._get_page_count(threads.count())
149
150 # TODO Move this method to thread manager
151 def _delete_old_threads(self):
136 def _delete_old_threads(self):
152 """
137 """
153 Preserves maximum thread count. If there are too many threads,
138 Preserves maximum thread count. If there are too many threads,
@@ -180,13 +165,6 b' class PostManager(models.Manager):'
180 referenced_post.last_edit_time = post.pub_time
165 referenced_post.last_edit_time = post.pub_time
181 referenced_post.save()
166 referenced_post.save()
182
167
183 def _get_page_count(self, thread_count):
184 """
185 Get number of pages that will be needed for all threads
186 """
187
188 return int(math.ceil(thread_count / float(settings.THREADS_PER_PAGE)))
189
190 def get_posts_per_day(self):
168 def get_posts_per_day(self):
191 """
169 """
192 Get average count of posts per day for the last 7 days
170 Get average count of posts per day for the last 7 days
@@ -6,23 +6,23 b''
6 {% load static %}
6 {% load static %}
7
7
8 {% block head %}
8 {% block head %}
9 <title>Neboard</title>
9 <title>Neboard - {% trans 'Archive' %}</title>
10
10
11 {% if prev_page %}
11 {% if current_page.has_previous %}
12 <link rel="next" href="
12 <link rel="prev" href="
13 {% if tag %}
13 {% if tag %}
14 {% url "tag" tag_name=tag page=prev_page %}
14 {% url "tag" tag_name=tag page=current_page.previous_page_number %}
15 {% else %}
15 {% else %}
16 {% url "index" page=prev_page %}
16 {% url "index" page=current_page.previous_page_number %}
17 {% endif %}
17 {% endif %}
18 " />
18 " />
19 {% endif %}
19 {% endif %}
20 {% if next_page %}
20 {% if current_page.has_next %}
21 <link rel="next" href="
21 <link rel="next" href="
22 {% if tag %}
22 {% if tag %}
23 {% url "tag" tag_name=tag page=next_page %}
23 {% url "tag" tag_name=tag page=current_page.next_page_number %}
24 {% else %}
24 {% else %}
25 {% url "index" page=next_page %}
25 {% url "index" page=current_page.next_page_number %}
26 {% endif %}
26 {% endif %}
27 " />
27 " />
28 {% endif %}
28 {% endif %}
@@ -34,9 +34,9 b''
34 {% get_current_language as LANGUAGE_CODE %}
34 {% get_current_language as LANGUAGE_CODE %}
35
35
36 {% if threads %}
36 {% if threads %}
37 {% if prev_page %}
37 {% if current_page.has_previous %}
38 <div class="page_link">
38 <div class="page_link">
39 <a href="{% url "archive" page=prev_page %}">{% trans "Previous page" %}</a>
39 <a href="{% url "archive" page=current_page.previous_page_number %}">{% trans "Previous page" %}</a>
40 </div>
40 </div>
41 {% endif %}
41 {% endif %}
42
42
@@ -111,9 +111,9 b''
111 {% endcache %}
111 {% endcache %}
112 {% endfor %}
112 {% endfor %}
113
113
114 {% if next_page %}
114 {% if current_page.has_next %}
115 <div class="page_link">
115 <div class="page_link">
116 <a href="{% url "archive" page=next_page %}">{% trans "Next page" %}</a>
116 <a href="{% url "archive" page=current_page.next_page_number %}">{% trans "Next page" %}</a>
117 </div>
117 </div>
118 {% endif %}
118 {% endif %}
119 {% else %}
119 {% else %}
@@ -126,11 +126,11 b''
126 {% block metapanel %}
126 {% block metapanel %}
127
127
128 <span class="metapanel">
128 <span class="metapanel">
129 <b><a href="{% url "authors" %}">Neboard</a> 1.5 Aker</b>
129 <b><a href="{% url "authors" %}">Neboard</a> 1.6 Amon</b>
130 {% trans "Pages:" %}[
130 {% trans "Pages:" %}[
131 {% for page in pages %}
131 {% for page in paginator.page_range %}
132 <a
132 <a
133 {% ifequal page current_page %}
133 {% ifequal page current_page.number %}
134 class="current_page"
134 class="current_page"
135 {% endifequal %}
135 {% endifequal %}
136 href="
136 href="
@@ -12,21 +12,21 b''
12 <title>Neboard</title>
12 <title>Neboard</title>
13 {% endif %}
13 {% endif %}
14
14
15 {% if prev_page %}
15 {% if current_page.has_previous %}
16 <link rel="next" href="
16 <link rel="prev" href="
17 {% if tag %}
17 {% if tag %}
18 {% url "tag" tag_name=tag page=prev_page %}
18 {% url "tag" tag_name=tag page=current_page.previous_page_number %}
19 {% else %}
19 {% else %}
20 {% url "index" page=prev_page %}
20 {% url "index" page=current_page.previous_page_number %}
21 {% endif %}
21 {% endif %}
22 " />
22 " />
23 {% endif %}
23 {% endif %}
24 {% if next_page %}
24 {% if current_page.has_next %}
25 <link rel="next" href="
25 <link rel="next" href="
26 {% if tag %}
26 {% if tag %}
27 {% url "tag" tag_name=tag page=next_page %}
27 {% url "tag" tag_name=tag page=current_page.next_page_number %}
28 {% else %}
28 {% else %}
29 {% url "index" page=next_page %}
29 {% url "index" page=current_page.next_page_number %}
30 {% endif %}
30 {% endif %}
31 " />
31 " />
32 {% endif %}
32 {% endif %}
@@ -53,13 +53,13 b''
53 {% endif %}
53 {% endif %}
54
54
55 {% if threads %}
55 {% if threads %}
56 {% if prev_page %}
56 {% if current_page.has_previous %}
57 <div class="page_link">
57 <div class="page_link">
58 <a href="
58 <a href="
59 {% if tag %}
59 {% if tag %}
60 {% url "tag" tag_name=tag page=prev_page %}
60 {% url "tag" tag_name=tag page=current_page.previous_page_number %}
61 {% else %}
61 {% else %}
62 {% url "index" page=prev_page %}
62 {% url "index" page=current_page.previous_page_number %}
63 {% endif %}
63 {% endif %}
64 ">{% trans "Previous page" %}</a>
64 ">{% trans "Previous page" %}</a>
65 </div>
65 </div>
@@ -192,13 +192,13 b''
192 {% endcache %}
192 {% endcache %}
193 {% endfor %}
193 {% endfor %}
194
194
195 {% if next_page %}
195 {% if current_page.has_next %}
196 <div class="page_link">
196 <div class="page_link">
197 <a href="
197 <a href="
198 {% if tag %}
198 {% if tag %}
199 {% url "tag" tag_name=tag page=next_page %}
199 {% url "tag" tag_name=tag page=current_page.next_page_number %}
200 {% else %}
200 {% else %}
201 {% url "index" page=next_page %}
201 {% url "index" page=current_page.next_page_number %}
202 {% endif %}
202 {% endif %}
203 ">{% trans "Next page" %}</a>
203 ">{% trans "Next page" %}</a>
204 </div>
204 </div>
@@ -233,9 +233,9 b''
233 <span class="metapanel">
233 <span class="metapanel">
234 <b><a href="{% url "authors" %}">Neboard</a> 1.6 Amon</b>
234 <b><a href="{% url "authors" %}">Neboard</a> 1.6 Amon</b>
235 {% trans "Pages:" %}[
235 {% trans "Pages:" %}[
236 {% for page in pages %}
236 {% for page in paginator.page_range %}
237 <a
237 <a
238 {% ifequal page current_page %}
238 {% ifequal page current_page.number %}
239 class="current_page"
239 class="current_page"
240 {% endifequal %}
240 {% endifequal %}
241 href="
241 href="
@@ -22,13 +22,14 b' from django.utils import timezone'
22 from django.db import transaction
22 from django.db import transaction
23 from django.views.decorators.cache import cache_page
23 from django.views.decorators.cache import cache_page
24 from django.views.i18n import javascript_catalog
24 from django.views.i18n import javascript_catalog
25 from django.core.paginator import Paginator
25
26
26 from boards import forms
27 from boards import forms
27 import boards
28 import boards
28 from boards import utils
29 from boards import utils
29 from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \
30 from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \
30 ThreadCaptchaForm, PostCaptchaForm, LoginForm, ModeratorSettingsForm
31 ThreadCaptchaForm, PostCaptchaForm, LoginForm, ModeratorSettingsForm
31 from boards.models import Post, Tag, Ban, User
32 from boards.models import Post, Tag, Ban, User, Thread
32 from boards.models.post import SETTING_MODERATE, REGEX_REPLY
33 from boards.models.post import SETTING_MODERATE, REGEX_REPLY
33 from boards.models.user import RANK_USER
34 from boards.models.user import RANK_USER
34 from boards import authors
35 from boards import authors
@@ -40,8 +41,10 b" BAN_REASON_SPAM = 'Autoban: spam bot'"
40 MODE_GALLERY = 'gallery'
41 MODE_GALLERY = 'gallery'
41 MODE_NORMAL = 'normal'
42 MODE_NORMAL = 'normal'
42
43
44 DEFAULT_PAGE = 1
43
45
44 def index(request, page=0):
46
47 def index(request, page=DEFAULT_PAGE):
45 context = _init_default_context(request)
48 context = _init_default_context(request)
46
49
47 if utils.need_include_captcha(request):
50 if utils.need_include_captcha(request):
@@ -71,21 +74,16 b' def index(request, page=0):'
71 # TODO Make this generic for tag and threads list pages
74 # TODO Make this generic for tag and threads list pages
72 context['threads'] = None if len(threads) == 0 else threads
75 context['threads'] = None if len(threads) == 0 else threads
73 context['form'] = form
76 context['form'] = form
74 context['current_page'] = int(page)
75
77
76 page_count = Post.objects.get_thread_page_count()
78 paginator = Paginator(Thread.objects.filter(archived=False),
77 context['pages'] = range(page_count) if page_count > 0 else [0]
79 neboard.settings.THREADS_PER_PAGE)
78 page = int(page)
80 _get_page_context(paginator, context, page)
79 if page < page_count - 1:
80 context['next_page'] = str(page + 1)
81 if page > 0:
82 context['prev_page'] = str(page - 1)
83
81
84 return render(request, 'boards/posting_general.html',
82 return render(request, 'boards/posting_general.html',
85 context)
83 context)
86
84
87
85
88 def archive(request, page=0):
86 def archive(request, page=DEFAULT_PAGE):
89 context = _init_default_context(request)
87 context = _init_default_context(request)
90
88
91 threads = []
89 threads = []
@@ -94,15 +92,10 b' def archive(request, page=0):'
94 threads.append(_get_template_thread(thread_to_show))
92 threads.append(_get_template_thread(thread_to_show))
95
93
96 context['threads'] = threads
94 context['threads'] = threads
97 context['current_page'] = int(page)
98
95
99 page_count = Post.objects.get_thread_page_count(archived=True)
96 paginator = Paginator(Thread.objects.filter(archived=True),
100 context['pages'] = range(page_count) if page_count > 0 else [0]
97 neboard.settings.THREADS_PER_PAGE)
101 page = int(page)
98 _get_page_context(paginator, context, page)
102 if page < page_count - 1:
103 context['next_page'] = str(page + 1)
104 if page > 0:
105 context['prev_page'] = str(page - 1)
106
99
107 return render(request, 'boards/archive.html', context)
100 return render(request, 'boards/archive.html', context)
108
101
@@ -158,10 +151,10 b' def _new_post(request, form, opening_pos'
158 return redirect(thread, post_id=thread_to_show)
151 return redirect(thread, post_id=thread_to_show)
159
152
160
153
161 def tag(request, tag_name, page=0):
154 def tag(request, tag_name, page=DEFAULT_PAGE):
162 """
155 """
163 Get all tag threads. Threads are split in pages, so some page is
156 Get all tag threads. Threads are split in pages, so some page is
164 requested. Default page is 0.
157 requested.
165 """
158 """
166
159
167 tag = get_object_or_404(Tag, name=tag_name)
160 tag = get_object_or_404(Tag, name=tag_name)
@@ -186,15 +179,10 b' def tag(request, tag_name, page=0):'
186 context = _init_default_context(request)
179 context = _init_default_context(request)
187 context['threads'] = None if len(threads) == 0 else threads
180 context['threads'] = None if len(threads) == 0 else threads
188 context['tag'] = tag
181 context['tag'] = tag
189 context['current_page'] = int(page)
190
182
191 page_count = Post.objects.get_thread_page_count(tag=tag)
183 paginator = Paginator(Post.objects.get_threads(tag=tag),
192 context['pages'] = range(page_count)
184 neboard.settings.THREADS_PER_PAGE)
193 page = int(page)
185 _get_page_context(paginator, context, page)
194 if page < page_count - 1:
195 context['next_page'] = str(page + 1)
196 if page > 0:
197 context['prev_page'] = str(page - 1)
198
186
199 context['form'] = form
187 context['form'] = form
200
188
@@ -602,3 +590,12 b' def _delete_old_users():'
602 tags_count=0).filter(registration_time__lt=old_registration_date):
590 tags_count=0).filter(registration_time__lt=old_registration_date):
603 if not Post.objects.filter(user=user).exists():
591 if not Post.objects.filter(user=user).exists():
604 user.delete()
592 user.delete()
593
594
595 def _get_page_context(paginator, context, page):
596 """
597 Get pagination context variables
598 """
599
600 context['paginator'] = paginator
601 context['current_page'] = paginator.page(int(page))
General Comments 0
You need to be logged in to leave comments. Login now