From a15ba4300abb331b3509ce31fcfa35946c39cb26 Mon Sep 17 00:00:00 2001 From: David Jean Louis Date: Fri, 20 Sep 2019 15:38:47 +0200 Subject: [PATCH 1/3] Import Site model only if necessary When not using the Django sites framework, you get a RuntimeError because it is not installed, even if you set DJANGO_MESSAGES_NOTIFY to False. This can be avoided by importing the site model only when necessary. --- django_messages/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_messages/utils.py b/django_messages/utils.py index c356094..c277424 100644 --- a/django_messages/utils.py +++ b/django_messages/utils.py @@ -2,7 +2,6 @@ import django from django.utils.text import wrap from django.utils.translation import ugettext, ugettext_lazy as _ -from django.contrib.sites.models import Site from django.template.loader import render_to_string from django.conf import settings @@ -73,6 +72,7 @@ def new_message_email(sender, instance, signal, if 'created' in kwargs and kwargs['created']: try: + from django.contrib.sites.models import Site current_domain = Site.objects.get_current().domain subject = subject_prefix % {'subject': instance.subject} message = render_to_string(template_name, { From 0d82d7203bac4103a6d6f1d68fe60e4a7ccb914f Mon Sep 17 00:00:00 2001 From: David Jean Louis Date: Wed, 25 Sep 2019 10:30:37 +0200 Subject: [PATCH 2/3] Optional message list pagination By default, message list is not paginated, but now one can enable pagination by setting ``DJANGO_MESSAGES_PAGE_LENGTH`` to a positive integer. Pagination is disabled if this setting variable is not defined or set to -1. --- .../templates/django_messages/_pagination.html | 18 ++++++++++++++++++ .../templates/django_messages/inbox.html | 6 +++++- .../templates/django_messages/outbox.html | 6 +++++- .../templates/django_messages/trash.html | 6 +++++- django_messages/utils.py | 13 +++++++++++++ django_messages/views.py | 18 ++++++++++++++---- docs/usage.txt | 8 ++++++++ 7 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 django_messages/templates/django_messages/_pagination.html diff --git a/django_messages/templates/django_messages/_pagination.html b/django_messages/templates/django_messages/_pagination.html new file mode 100644 index 0000000..41ffddd --- /dev/null +++ b/django_messages/templates/django_messages/_pagination.html @@ -0,0 +1,18 @@ +{% load i18n %} + diff --git a/django_messages/templates/django_messages/inbox.html b/django_messages/templates/django_messages/inbox.html index 7fd5950..fcd02a7 100644 --- a/django_messages/templates/django_messages/inbox.html +++ b/django_messages/templates/django_messages/inbox.html @@ -24,7 +24,11 @@

{% trans "Inbox" %}

{% endfor %} +{% if message_list.has_other_pages %} +
+{% include "django_messages/_pagination.html" %} +{% endif %} {% else %}

{% trans "No messages." %}

{% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django_messages/templates/django_messages/outbox.html b/django_messages/templates/django_messages/outbox.html index 966ad8c..5fd5c66 100644 --- a/django_messages/templates/django_messages/outbox.html +++ b/django_messages/templates/django_messages/outbox.html @@ -21,7 +21,11 @@

{% trans "Sent Messages" %}

{% endfor %} +{% if message_list.has_other_pages %} +
+{% include "django_messages/_pagination.html" %} +{% endif %} {% else %}

{% trans "No messages." %}

{% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django_messages/templates/django_messages/trash.html b/django_messages/templates/django_messages/trash.html index 8d77ddc..d9ee544 100644 --- a/django_messages/templates/django_messages/trash.html +++ b/django_messages/templates/django_messages/trash.html @@ -21,9 +21,13 @@

{% trans "Deleted Messages" %}

{% endfor %} +{% if message_list.has_other_pages %} +
+{% include "django_messages/_pagination.html" %} +{% endif %} {% else %}

{% trans "No messages." %}

{% endif %}

{% trans "Deleted Messages are removed from the trash at unregular intervals, don't rely on this feature for long-time storage." %}

-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django_messages/utils.py b/django_messages/utils.py index c277424..731b87f 100644 --- a/django_messages/utils.py +++ b/django_messages/utils.py @@ -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 # favour django-mailer but fall back to django.core.mail @@ -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 @@ -101,3 +106,11 @@ 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) + return paginator.get_page(request.GET.get('page', 1)) diff --git a/django_messages/views.py b/django_messages/views.py index 4f1d4ff..ca762bc 100644 --- a/django_messages/views.py +++ b/django_messages/views.py @@ -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() @@ -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, }) @@ -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, }) @@ -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, }) diff --git a/docs/usage.txt b/docs/usage.txt index 7e4405c..9009b79 100644 --- a/docs/usage.txt +++ b/docs/usage.txt @@ -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:: From 380ac59a74791b36442760327bb85dc79e284d1b Mon Sep 17 00:00:00 2001 From: David Jean Louis Date: Mon, 30 Sep 2019 11:28:57 +0200 Subject: [PATCH 3/3] Fixed broken support for django < 2.0 Paginator.get_page() is only available in django >= 2.0, let's use Paginator.page() instead. --- django_messages/utils.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/django_messages/utils.py b/django_messages/utils.py index 731b87f..edc94dd 100644 --- a/django_messages/utils.py +++ b/django_messages/utils.py @@ -4,7 +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 +from django.core.paginator import Paginator, InvalidPage # favour django-mailer but fall back to django.core.mail @@ -113,4 +113,8 @@ def paginate_queryset(request, qs): # Disable pagination return qs paginator = Paginator(qs, PAGE_LENGTH) - return paginator.get_page(request.GET.get('page', 1)) + page_num = request.GET.get('page', 1) + try: + return paginator.page(page_num) + except InvalidPage: + return paginator.page(1)