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

Support for EmailMessage.extra_headers and transactional option #160

Merged
Merged
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
1 change: 1 addition & 0 deletions AUTHORS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,5 @@ Patches and suggestions
- `@gnarvaja <https://github.com/gnarvaja>`_
- `@pegler <https://github.com/pegler>`_
- `@puttu <https://github.com/puttu>`_
- Janusz Skonieczny `@wooyek <https://github.com/wooyek>`_
- ADD YOURSELF HERE (and link to your github page)
8 changes: 8 additions & 0 deletions sparkpost/django/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,12 @@ def __init__(self, message):
if hasattr(message, 'campaign'):
formatted['campaign'] = message.campaign

if message.extra_headers:
formatted['custom_headers'] = message.extra_headers
if 'X-MSYS-API' in message.extra_headers:
import json
msys_api = json.loads(message.extra_headers['X-MSYS-API'])
if msys_api and msys_api.get('options', {}).get('transactional', False): # noqa: E501
formatted['transactional'] = True

super(SparkPostMessage, self).__init__(formatted)
4 changes: 3 additions & 1 deletion sparkpost/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@ class SparkPostException(Exception):
class SparkPostAPIException(SparkPostException):
"Handle 4xx and 5xx errors from the SparkPost API"
def __init__(self, response, *args, **kwargs):
# noinspection PyBroadException
try:
errors = response.json()['errors']
error_template = "{message} Code: {code} Description: {desc} \n"
errors = [error_template.format(message=e.get('message', ''),
code=e.get('code', 'none'),
desc=e.get('description', 'none'))
for e in errors]
except:
# TODO: select exception to catch here
except: # noqa: E722
errors = [response.text or ""]
self.status = response.status_code
self.response = response
Expand Down
4 changes: 3 additions & 1 deletion sparkpost/tornado/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ def request(self, method, uri, headers, **kwargs):
raise gen.Return(True)
if response.code == 200:
result = None
# noinspection PyBroadException
try:
result = json.loads(response.body.decode("utf-8"))
except:
# TODO: select exception to catch here
except: # noqa: E722
pass
if result:
if 'results' in result:
Expand Down
4 changes: 3 additions & 1 deletion sparkpost/tornado/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
class SparkPostAPIException(RequestsSparkPostAPIException):
def __init__(self, response, *args, **kwargs):
errors = None
# noinspection PyBroadException
try:
data = json.loads(response.body.decode("utf-8"))
if data:
errors = data['errors']
errors = [e['message'] + ': ' + e.get('description', '')
for e in errors]
except:
# TODO: select exception to catch here
except: # noqa: E722
pass
if not errors:
errors = [response.body.decode("utf-8") or ""]
Expand Down
3 changes: 2 additions & 1 deletion sparkpost/transmissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,8 @@ def send(self, **kwargs):
"""

payload = self._translate_keys(**kwargs)
results = self.request('POST', self.uri, data=json.dumps(payload))
data = json.dumps(payload)
results = self.request('POST', self.uri, data=data)
return results

def _fetch_get(self, transmission_id):
Expand Down
27 changes: 27 additions & 0 deletions test/django/test_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,3 +228,30 @@ def test_reply_to():

assert message(reply_to=['replyone@example.com',
'replytwo@example.com']) == expected


def test_extra_headers():
email_message = EmailMessage(**base_options)
email_message.extra_headers['FOO'] = 'bar'

actual = SparkPostMessage(email_message)
expected = dict(
custom_headers={'FOO': 'bar'},
)
expected.update(base_expected)
assert actual == expected


def test_transactional():
email_message = EmailMessage(**base_options)
import json
msys_api = json.dumps({'options': {'transactional': True}})
email_message.extra_headers['X-MSYS-API'] = msys_api

actual = SparkPostMessage(email_message)
expected = dict(
custom_headers={'X-MSYS-API': msys_api},
transactional=True,
)
expected.update(base_expected)
assert actual == expected
3 changes: 2 additions & 1 deletion test/test_templates.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
try:
from urllib.parse import urlparse
except:
# TODO: select exception to catch here
except: # noqa: E722
from urlparse import urlparse

import pytest
Expand Down