Skip to content

Commit

Permalink
add admin action to send messages
Browse files Browse the repository at this point in the history
  • Loading branch information
s8weber committed Jul 15, 2023
1 parent aa45669 commit 7ec6f67
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 5 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ ADDITIONAL CONTRIBUTORS include:
* Renato Alves
* Paul Brown
* Sebastian Pipping
* Steve Weber
* Jaap Roes
* Ed Davison
1 change: 1 addition & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Change log
2.2.1 - unreleased
------------------

* Add admin action to send messages
* Add fix for email address that is a NoneType
* Stop testing on unsupported Python (<3.7) and Django (<2.2) versions
* Start testing on Python 3.11 and Django 4.1/4.2
Expand Down
8 changes: 8 additions & 0 deletions src/mailer/admin.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
from __future__ import unicode_literals

from django.contrib import admin
from django.contrib import messages
from django.utils.translation import gettext_lazy as _

from mailer.models import Message, DontSendEntry, MessageLog
from mailer.engine import send_all


def show_to(message):
Expand All @@ -25,6 +28,11 @@ class MessageAdmin(MessageAdminMixin, admin.ModelAdmin):
list_display = ["id", show_to, "subject", "when_added", "priority", "retry_count"]
readonly_fields = ['plain_text_body']
date_hierarchy = "when_added"
actions = ['send_messages']

def send_messages(self, request, queryset):
send_all(queryset)
messages.add_message(request, messages.INFO, _("Message(s) sent."))


class DontSendEntryAdmin(admin.ModelAdmin):
Expand Down
12 changes: 7 additions & 5 deletions src/mailer/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,12 @@
logger = logging.getLogger(__name__)


def prioritize():
def prioritize(queryset=None):
"""
Returns the messages in the queue in the order they should be sent.
"""
if queryset:
return queryset.order_by('priority', 'when_added')
return Message.objects.non_deferred().order_by('priority', 'when_added')


Expand Down Expand Up @@ -80,12 +82,12 @@ def sender_context(message):
yield None


def get_messages_for_sending():
def get_messages_for_sending(queryset=None):
"""
Returns a series of context managers that are used for sending mails in the queue.
Entering the context manager returns the actual message
"""
for message in prioritize():
for message in prioritize(queryset):
yield sender_context(message)


Expand Down Expand Up @@ -181,7 +183,7 @@ def _require_no_backend_loop(mailer_email_backend):
.format(settings.EMAIL_BACKEND))


def send_all():
def send_all(queryset=None):
"""
Send all eligible messages in the queue.
"""
Expand Down Expand Up @@ -214,7 +216,7 @@ def send_all():

try:
connection = None
for context in get_messages_for_sending():
for context in get_messages_for_sending(queryset):
with context as message:
if message is None:
# We didn't acquire the lock
Expand Down

0 comments on commit 7ec6f67

Please sign in to comment.