Skip to content
Snippets Groups Projects
Commit 60d06494 authored by Todd Dembrey's avatar Todd Dembrey
Browse files

Move the emailing into a celery task

parent fbc964de
No related branches found
No related tags found
No related merge requests found
...@@ -4,9 +4,10 @@ import requests ...@@ -4,9 +4,10 @@ import requests
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.core.mail import send_mail
from django.template.loader import render_to_string from django.template.loader import render_to_string
from .tasks import send_mail, update_message_status
def link_to(target, request): def link_to(target, request):
return request.scheme + '://' + request.get_host() + target.get_absolute_url() return request.scheme + '://' + request.get_host() + target.get_absolute_url()
...@@ -69,13 +70,13 @@ class AdapterBase: ...@@ -69,13 +70,13 @@ class AdapterBase:
return return
for recipient in self.recipients(message_type, **kwargs): for recipient in self.recipients(message_type, **kwargs):
message_log = self.create_log(message, recipient, event)
if settings.SEND_MESSAGES or self.always_send: if settings.SEND_MESSAGES or self.always_send:
status = self.send_message(message, recipient=recipient, **kwargs) status = self.send_message(message, recipient=recipient, message_log=message_log, **kwargs)
else: else:
status = 'Message not sent as SEND_MESSAGES==FALSE' status = 'Message not sent as SEND_MESSAGES==FALSE'
if status: message_log.update_status(status)
self.log_message(message, recipient, event, status)
if not settings.SEND_MESSAGES: if not settings.SEND_MESSAGES:
if recipient: if recipient:
...@@ -84,14 +85,13 @@ class AdapterBase: ...@@ -84,14 +85,13 @@ class AdapterBase:
message = '{}: {}'.format(self.adapter_type, message) message = '{}: {}'.format(self.adapter_type, message)
messages.add_message(kwargs['request'], messages.INFO, message) messages.add_message(kwargs['request'], messages.INFO, message)
def log_message(self, message, recipient, event, status): def create_log(self, message, recipient, event):
from.models import Message from .models import Message
Message.objects.create( return Message.objects.create(
type=self.adapter_type, type=self.adapter_type,
content=message, content=message,
recipient=recipient, recipient=recipient,
event=event, event=event,
status=status,
) )
def send_message(self, message, **kwargs): def send_message(self, message, **kwargs):
...@@ -253,18 +253,18 @@ class EmailAdapter(AdapterBase): ...@@ -253,18 +253,18 @@ class EmailAdapter(AdapterBase):
def send_message(self, message, submission, subject, recipient, **kwargs): def send_message(self, message, submission, subject, recipient, **kwargs):
try: try:
emails_sent = send_mail( emails_sent = send_mail.apply_async(
subject, (
message, subject,
submission.page.specific.from_address, message,
[recipient], submission.page.specific.from_address,
fail_silently=False, [recipient],
),
link=update_message_status.s(kwargs['message_log'].id),
) )
except Exception as e: except Exception as e:
return 'Error: ' + str(e) return 'Error: ' + str(e)
return 'Emails sent: ' + str(emails_sent)
class MessengerBackend: class MessengerBackend:
def __init__(self, *adpaters): def __init__(self, *adpaters):
......
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.db.models import Case, When, Value
from django.db.models.functions import Concat
from .messaging import MESSAGES from .messaging import MESSAGES
...@@ -121,3 +123,11 @@ class Message(models.Model): ...@@ -121,3 +123,11 @@ class Message(models.Model):
recipient = models.CharField(max_length=250) recipient = models.CharField(max_length=250)
event = models.ForeignKey(Event, on_delete=models.CASCADE) event = models.ForeignKey(Event, on_delete=models.CASCADE)
status = models.TextField() status = models.TextField()
def update_status(self, status):
if status:
self.status = Case(
When(status='', then=Value(status)),
default=Concat('status', Value('<br />' + status))
)
self.save()
from celery import Celery
from django.conf import settings
from django.core.mail import send_mail as dj_send_mail
app = Celery('tasks')
app.config_from_object(settings, namespace='CELERY', force=True)
@app.task
def send_mail(*args, **kwargs):
try:
emails_sent = dj_send_mail(
*args,
fail_silently=False,
**kwargs,
)
except Exception as e:
return 'Error: ' + str(e)
return 'Emails sent: ' + str(emails_sent)
@app.task
def update_message_status(status, message):
from .models import Message
Message.objects.get(id=message).update_status(status)
from unittest.mock import patch
from django.test import TestCase
from ..tasks import send_mail
class TestSendEmail(TestCase):
@patch('opentech.apply.activity.tasks.dj_send_mail')
def test_args_passed_to_django(self, dj_send_mail):
args = ['subject', 'message', 'from', ['to@to.com']]
send_mail(*args)
dj_send_mail.assert_called_once_with(*args, fail_silently=False)
...@@ -356,3 +356,10 @@ HIJACK_DECORATOR = 'opentech.apply.users.decorators.superuser_decorator' ...@@ -356,3 +356,10 @@ HIJACK_DECORATOR = 'opentech.apply.users.decorators.superuser_decorator'
SEND_MESSAGES = env.get('SEND_MESSAGES', 'false').lower() == 'true' SEND_MESSAGES = env.get('SEND_MESSAGES', 'false').lower() == 'true'
SLACK_DESTINATION_URL = env.get('SLACK_DESTINATION_URL', None) SLACK_DESTINATION_URL = env.get('SLACK_DESTINATION_URL', None)
SLACK_DESTINATION_ROOM = env.get('SLACK_DESTINATION_ROOM', None) SLACK_DESTINATION_ROOM = env.get('SLACK_DESTINATION_ROOM', None)
# Celery config
if 'REDIS_URL' in env:
CELERY_BROKER_URL = env.get('REDIS_URL')
else:
CELERY_TASK_ALWAYS_EAGER = True
...@@ -12,6 +12,8 @@ stellar==0.4.3 ...@@ -12,6 +12,8 @@ stellar==0.4.3
django-tinymce4-lite==1.7.0 django-tinymce4-lite==1.7.0
uwsgidecorators==1.1.0 uwsgidecorators==1.1.0
django-hijack==2.1.9 django-hijack==2.1.9
django-anymail==3.0
celery==4.2.1
factory_boy==2.9.2 factory_boy==2.9.2
# wagtail_factories - waiting on merge and release form master branch # wagtail_factories - waiting on merge and release form master branch
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment