1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-14 14:21:23 +00:00

Using django paginator in group discuss

This commit is contained in:
zhengxie
2013-03-19 11:49:52 +08:00
parent f3d0e46d42
commit 0808a7c654
3 changed files with 53 additions and 53 deletions

View File

@@ -78,7 +78,7 @@
{% if group_msgs %}
<ul class="msg-list">
{% for msg in group_msgs %}
{% for msg in group_msgs.object_list %}
<li class="msg w100 ovhd">
<div class="pic fleft">
<a href="{% url 'user_profile' msg.from_email %}">{% avatar msg.from_email 48 %}</a>
@@ -149,29 +149,25 @@
</ul>
{% endif %}
{% if msgs_more %}
<button id="msgs-more" class="big-more-btn">{% trans "More" %}</button>
{% if group_msgs.has_other_pages %}
<div id="paginator">
{% if group_msgs.has_previous %}
<a href="?page={{ group_msgs.previous_page_number }}" class="prev">{% trans "Previous" %}</a>
{% endif %}
{% if pages_show|length > 1 %}
<div id="paginator"{% if msgs_more %} class="hide"{% endif %}>
{% if current_page != 1 %}
<a href="?page={{ prev_page }}" class="prev">{% trans "Previous" %}</a>
{% endif %}
{% for p in pages_show %}
{% if p == current_page %}
<span class="cur">{{ p }}</span>
{% for pr in group_msgs.page_range %}
{% if pr == group_msgs.number %}
<span class="cur">{{ pr }}</span>
{% else %}
<a href="?page={{ p }}" class="pg">{{ p }}</a>
<a href="?page={{ pr }}" class="pg">{{ pr }}</a>
{% endif %}
{% endfor %}
{% if page_next %}
<a href="?page={{ next_page }}" class="next">{% trans "Next"%}</a>
{% if group_msgs.has_next %}
<a href="?page={{ group_msgs.next_page_number }}" class="next">{% trans "Next"%}</a>
{% endif %}
</div>
{% endif %}
{% if group_msgs|length > 5 %}
{% if group_msgs.object_list|length > 5 %}
<a href="#group-reply" id="msg-upward" class="hide">{% trans "↑Top" %}</a>
{% endif %}
</div>
@@ -180,7 +176,7 @@
{% block extra_script %}
<script type="text/javascript">
{% if group_msgs|length > 5 %}
{% if group_msgs.object_list|length > 5 %}
$(window).scroll(function() {
var up_icon = $('#msg-upward');
var msg_panel = $('#group-reply');

View File

@@ -5,6 +5,7 @@ import stat
import simplejson as json
import urllib2
from django.core.mail import send_mail
from django.core.paginator import EmptyPage, InvalidPage
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.contrib.sites.models import RequestSite
@@ -48,6 +49,7 @@ from seahub.utils import render_error, render_permission_error, \
validate_group_name, string2list, check_and_get_org_by_group, \
check_and_get_org_by_repo, gen_file_get_url, get_file_type_and_ext, \
get_file_contributors
from seahub.utils.paginator import Paginator
from seahub.utils.slugify import slugify
from seahub.views import is_registered_user
from seahub.forms import RepoCreateForm, SharedRepoCreateForm
@@ -970,25 +972,33 @@ def group_discuss(request, group_id):
is_staff = True if check_group_staff(group.id, request.user) else False
"""group messages"""
# Show 15 group messages per page.
paginator = Paginator(GroupMessage.objects.filter(
group_id=group_id).order_by('-timestamp'), 15)
# Make sure page request is an int. If not, deliver first page.
try:
current_page = int(request.GET.get('page', '1'))
page = int(request.GET.get('page', '1'))
except ValueError:
current_page = 1
per_page = 15
page = 1
group_msgs = GroupMessage.objects.filter(
group_id=group_id).order_by(
'-timestamp')[per_page*(current_page-1) : per_page*current_page]
# If page request (9999) is out of range, deliver last page of results.
try:
group_msgs = paginator.page(page)
except (EmptyPage, InvalidPage):
group_msgs = paginator.page(paginator.num_pages)
group_msgs = list(group_msgs) # Force evaluate queryset to fix some database error for mysql
group_msgs.page_range = paginator.get_page_range(group_msgs.number)
attachments = MessageAttachment.objects.filter(group_message__in=group_msgs)
# Force evaluate queryset to fix some database error for mysql.
group_msgs.object_list = list(group_msgs.object_list)
msg_replies = MessageReply.objects.filter(reply_to__in=group_msgs)
attachments = MessageAttachment.objects.filter(group_message__in=group_msgs.object_list)
msg_replies = MessageReply.objects.filter(reply_to__in=group_msgs.object_list)
reply_to_list = [ r.reply_to_id for r in msg_replies ]
for msg in group_msgs:
for msg in group_msgs.object_list:
msg.reply_cnt = reply_to_list.count(msg.id)
msg.replies = []
for r in msg_replies:
@@ -1015,25 +1025,6 @@ def group_discuss(request, group_id):
att.name = os.path.basename(path)
msg.attachment = att
msg_total_num = GroupMessage.objects.filter(group_id=group_id).count()
total_page = msg_total_num/per_page
if msg_total_num % per_page > 0:
total_page += 1
page_next = True if current_page < total_page else False
# get page numbers shown in the web page
first_page = 1
if total_page <= 10:
last_page = total_page
else:
if current_page < 6:
last_page = 10
else:
first_page = current_page - 5
last_page = current_page + 4 if current_page + 4 < total_page else total_page
pages_show = range(first_page, last_page + 1)
return render_to_response("group/group_discuss.html", {
"members": members,
"group_id": group_id,
@@ -1041,11 +1032,6 @@ def group_discuss(request, group_id):
"is_staff": is_staff,
"group_msgs": group_msgs,
"form": form,
'current_page': current_page,
'prev_page': current_page-1,
'next_page': current_page+1,
'page_next': page_next,
'pages_show': pages_show,
'group_members_default_display': GROUP_MEMBERS_DEFAULT_DISPLAY,
}, context_instance=RequestContext(request));

18
utils/paginator.py Normal file
View File

@@ -0,0 +1,18 @@
from django.core.paginator import Paginator as DefaultPaginator
class Paginator(DefaultPaginator):
def get_page_range(self, current_page=1):
"""
Returns custom range of pages.
"""
first_page = 1
total_page = self.num_pages
if total_page <= 10:
last_page = total_page
else:
if current_page < 6:
last_page = 10
else:
first_page = current_page - 5
last_page = current_page + 4 if current_page + 4 < total_page else total_page
return range(first_page, last_page + 1)