Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optional pagination #135

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions django_messages/templates/django_messages/_pagination.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{% load i18n %}
<div class="pagination">
<span class="step-links">
{% if message_list.has_previous %}
<a href="?page=1">&laquo; {% trans "first" %}</a>
<a href="?page={{ message_list.previous_page_number }}">{% trans "previous" %}</a>
{% endif %}
<span class="current">
{% with page_num=message_list.number total=message_list.paginator.num_pages %}
{% blocktrans %}Page {{ page_num }} of {{ total }}.{% endblocktrans %}
{% endwith %}
</span>
{% if message_list.has_next %}
<a href="?page={{ message_list.next_page_number }}">{% trans "next" %}</a>
<a href="?page={{ message_list.paginator.num_pages }}">{% trans "last" %} &raquo;</a>
{% endif %}
</span>
</div>
6 changes: 5 additions & 1 deletion django_messages/templates/django_messages/inbox.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ <h1>{% trans "Inbox" %}</h1>
{% endfor %}
</tbody>
</table>
{% if message_list.has_other_pages %}
<br/>
{% include "django_messages/_pagination.html" %}
{% endif %}
{% else %}
<p>{% trans "No messages." %}</p>
{% endif %}
{% endblock %}
{% endblock %}
6 changes: 5 additions & 1 deletion django_messages/templates/django_messages/outbox.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ <h1>{% trans "Sent Messages" %}</h1>
{% endfor %}
</tbody>
</table>
{% if message_list.has_other_pages %}
<br/>
{% include "django_messages/_pagination.html" %}
{% endif %}
{% else %}
<p>{% trans "No messages." %}</p>
{% endif %}
{% endblock %}
{% endblock %}
6 changes: 5 additions & 1 deletion django_messages/templates/django_messages/trash.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,13 @@ <h1>{% trans "Deleted Messages" %}</h1>
{% endfor %}
</tbody>
</table>
{% if message_list.has_other_pages %}
<br/>
{% include "django_messages/_pagination.html" %}
{% endif %}
{% else %}
<p>{% trans "No messages." %}</p>
{% endif %}
<br />
<p>{% trans "Deleted Messages are removed from the trash at unregular intervals, don't rely on this feature for long-time storage." %}</p>
{% endblock %}
{% endblock %}
17 changes: 17 additions & 0 deletions django_messages/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django.utils.translation import ugettext, ugettext_lazy as _
from django.template.loader import render_to_string
from django.conf import settings
from django.core.paginator import Paginator, InvalidPage

# favour django-mailer but fall back to django.core.mail

Expand All @@ -12,6 +13,10 @@
else:
from django.core.mail import send_mail


PAGE_LENGTH = getattr(settings, 'DJANGO_MESSAGES_PAGE_LENGTH', -1)


def format_quote(sender, body):
"""
Wraps text at 55 chars and prepends each
Expand Down Expand Up @@ -101,3 +106,15 @@ def get_username_field():
return get_user_model().USERNAME_FIELD
else:
return 'username'


def paginate_queryset(request, qs):
if PAGE_LENGTH == -1:
# Disable pagination
return qs
paginator = Paginator(qs, PAGE_LENGTH)
page_num = request.GET.get('page', 1)
try:
return paginator.page(page_num)
except InvalidPage:
return paginator.page(1)
18 changes: 14 additions & 4 deletions django_messages/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@

from django_messages.models import Message
from django_messages.forms import ComposeForm
from django_messages.utils import format_quote, get_user_model, get_username_field
from django_messages.utils import format_quote, get_user_model, get_username_field, paginate_queryset


User = get_user_model()

Expand All @@ -29,7 +30,10 @@ def inbox(request, template_name='django_messages/inbox.html'):
Optional Arguments:
``template_name``: name of the template to use.
"""
message_list = Message.objects.inbox_for(request.user)
message_list = paginate_queryset(
request,
Message.objects.inbox_for(request.user)
)
return render(request, template_name, {
'message_list': message_list,
})
Expand All @@ -41,7 +45,10 @@ def outbox(request, template_name='django_messages/outbox.html'):
Optional arguments:
``template_name``: name of the template to use.
"""
message_list = Message.objects.outbox_for(request.user)
message_list = paginate_queryset(
request,
Message.objects.outbox_for(request.user)
)
return render(request, template_name, {
'message_list': message_list,
})
Expand All @@ -55,7 +62,10 @@ def trash(request, template_name='django_messages/trash.html'):
Hint: A Cron-Job could periodicly clean up old messages, which are deleted
by sender and recipient.
"""
message_list = Message.objects.trash_for(request.user)
message_list = paginate_queryset(
request,
Message.objects.trash_for(request.user)
)
return render(request, template_name, {
'message_list': message_list,
})
Expand Down
8 changes: 8 additions & 0 deletions docs/usage.txt
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,14 @@ And now every Template Context will contain a variable named
Settings Options
----------------

By default, message list is not paginated, you can enable pagination by
adding the following to your ``settings.py``::

DJANGO_MESSAGES_PAGE_LENGTH = 50 # or whatever number you want

To disable pagination remove the setting variable or set it to -1.


If you do want to disable django-messages from sending either a
'pinax-notifications' notice or an email (fallback if 'pinax-notifications
not installed' then set the following in your django settings::
Expand Down