Skip to content
Closed
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
3 changes: 2 additions & 1 deletion dev-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
wheel
twine
Django>=1.7,<1.10
tornado>=3.2
tornado>=3.2
celery>=3.1.23
11 changes: 11 additions & 0 deletions sparkpost/django/email_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from sparkpost import SparkPost

from .message import SparkPostMessage
from .tasks import send_messages


class SparkPostEmailBackend(BaseEmailBackend):
Expand Down Expand Up @@ -37,3 +38,13 @@ def _send(self, message):
params = getattr(settings, 'SPARKPOST_OPTIONS', {}).copy()
params.update(message)
return self.client.transmissions.send(**params)


class SparkPostCeleryEmailBackend(SparkPostEmailBackend):
def send_messages(self, email_messages):
"""
Send emails, returns celery result object (AsyncResult)
When task will be complete, it will contain integer
representing number of successful emails
"""
return send_messages.delay(self, email_messages)
32 changes: 32 additions & 0 deletions sparkpost/django/tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from celery import chord
from celery.task import task

from .message import SparkPostMessage


@task()
def send_messages(obj, email_messages):
"""
Celery task for 'send_messages' EmailBackend method.
It sends all email messages in parallel via 'send_message' task,
and then it reduces all results via `send_summary` task
(celery chord is convenient)
"""
return chord(send_message.s(obj, email_message)
for email_message in email_messages)(send_summary.s())


@task()
def send_message(obj, message):
try:
response = obj._send(SparkPostMessage(message))
except Exception:
if not obj.fail_silently:
raise
else:
return response['total_accepted_recipients']


@task()
def send_summary(send_results):
return sum([send_result for send_result in send_results])
5 changes: 3 additions & 2 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
[tox]
envlist = {py27,py34}-django{17,18}, py35-django{18,19}
envlist = {py27,py34}-django{17,18}-celery, py35-django{18,19}-celery

[testenv]
deps =
-rtest-requirements.txt
django17: Django>=1.7,<1.8
django18: Django>=1.8,<1.9
django19: Django>=1.9,<1.10
celery: celery==3.1.23

commands = py.test test/

[testenv:py35-django19]
[testenv:py35-django19-celery]

commands =
flake8 sparkpost test
Expand Down