diff --git a/AUTHORS.rst b/AUTHORS.rst index 697d4b4..a8adee7 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -21,4 +21,5 @@ Patches and suggestions - `@gnarvaja `_ - `@pegler `_ - `@puttu `_ +- Janusz Skonieczny `@wooyek `_ - ADD YOURSELF HERE (and link to your github page) diff --git a/sparkpost/django/message.py b/sparkpost/django/message.py index 568fa5a..9b12222 100644 --- a/sparkpost/django/message.py +++ b/sparkpost/django/message.py @@ -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) diff --git a/sparkpost/exceptions.py b/sparkpost/exceptions.py index 3c2a9e9..db1d392 100644 --- a/sparkpost/exceptions.py +++ b/sparkpost/exceptions.py @@ -5,6 +5,7 @@ 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" @@ -12,7 +13,8 @@ def __init__(self, response, *args, **kwargs): 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 diff --git a/sparkpost/tornado/base.py b/sparkpost/tornado/base.py index d4bc331..a891ae9 100644 --- a/sparkpost/tornado/base.py +++ b/sparkpost/tornado/base.py @@ -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: diff --git a/sparkpost/tornado/exceptions.py b/sparkpost/tornado/exceptions.py index bf028e3..9055473 100644 --- a/sparkpost/tornado/exceptions.py +++ b/sparkpost/tornado/exceptions.py @@ -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 ""] diff --git a/sparkpost/transmissions.py b/sparkpost/transmissions.py index dcb7f86..89fcd44 100644 --- a/sparkpost/transmissions.py +++ b/sparkpost/transmissions.py @@ -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): diff --git a/test/django/test_message.py b/test/django/test_message.py index 08606b8..ff57ca3 100644 --- a/test/django/test_message.py +++ b/test/django/test_message.py @@ -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 diff --git a/test/test_templates.py b/test/test_templates.py index e0dc663..27ae50d 100644 --- a/test/test_templates.py +++ b/test/test_templates.py @@ -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