Mailing: Add support for a from field

Add support to the mailing profiles for specifying a "from"
address. Closes GitLab issue #522.

This commit adds a new backend class property "class_fields"
which differs from the normal "fields" property. The "class_fields"
property specifies which of the backend fields will be used to
initialize a backend's driver class. This is to avoid passing
fields that the driver doesn't expect and getting an error.

When sending emails, the "send" method will attempt to get
a "from" key from the backend data and use that when sending
emails. If no "from" key is found a None is passes. Django's
behavior in this situation dictates that the "from" value will
then be taken from the DEFAULT_FROM_EMAIL setting.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2018-11-28 02:59:12 -04:00
parent b6976210a5
commit 29b41a7638
9 changed files with 123 additions and 17 deletions

View File

@@ -2,6 +2,7 @@ from __future__ import unicode_literals
TEST_BODY_HTML = '<strong>test body</strong>'
TEST_EMAIL_ADDRESS = 'test@example.com'
TEST_EMAIL_FROM_ADDRESS = 'from.test@example.com'
TEST_RECIPIENTS_MULTIPLE_COMMA = 'test@example.com,test2@example.com'
TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT = [
'test@example.com', 'test2@example.com'

View File

@@ -1,8 +1,13 @@
from __future__ import unicode_literals
import json
from ..models import UserMailer
from .literals import TEST_USER_MAILER_BACKEND_PATH, TEST_USER_MAILER_LABEL
from .literals import (
TEST_EMAIL_FROM_ADDRESS, TEST_USER_MAILER_BACKEND_PATH,
TEST_USER_MAILER_LABEL
)
class MailerTestMixin(object):
@@ -12,5 +17,9 @@ class MailerTestMixin(object):
enabled=True,
label=TEST_USER_MAILER_LABEL,
backend_path=TEST_USER_MAILER_BACKEND_PATH,
backend_data='{}'
backend_data=json.dumps(
{
'from': TEST_EMAIL_FROM_ADDRESS
}
)
)

View File

@@ -5,8 +5,9 @@ from django.core import mail
from mayan.apps.documents.tests.test_models import GenericDocumentTestCase
from .literals import (
TEST_BODY_HTML, TEST_EMAIL_ADDRESS, TEST_RECIPIENTS_MULTIPLE_COMMA,
TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT, TEST_RECIPIENTS_MULTIPLE_SEMICOLON,
TEST_BODY_HTML, TEST_EMAIL_ADDRESS, TEST_EMAIL_FROM_ADDRESS,
TEST_RECIPIENTS_MULTIPLE_COMMA, TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT,
TEST_RECIPIENTS_MULTIPLE_SEMICOLON,
TEST_RECIPIENTS_MULTIPLE_SEMICOLON_RESULT, TEST_RECIPIENTS_MULTIPLE_MIXED,
TEST_RECIPIENTS_MULTIPLE_MIXED_RESULT,
)
@@ -19,6 +20,7 @@ class ModelTestCase(MailerTestMixin, GenericDocumentTestCase):
self.user_mailer.send(to=TEST_EMAIL_ADDRESS)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(mail.outbox[0].to, [TEST_EMAIL_ADDRESS])
def test_send_simple_with_html(self):
@@ -26,6 +28,7 @@ class ModelTestCase(MailerTestMixin, GenericDocumentTestCase):
self.user_mailer.send(to=TEST_EMAIL_ADDRESS, body=TEST_BODY_HTML)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(mail.outbox[0].to, [TEST_EMAIL_ADDRESS])
self.assertEqual(mail.outbox[0].alternatives[0][0], TEST_BODY_HTML)
@@ -36,6 +39,7 @@ class ModelTestCase(MailerTestMixin, GenericDocumentTestCase):
)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(mail.outbox[0].to, [TEST_EMAIL_ADDRESS])
with self.document.open() as file_object:
self.assertEqual(
@@ -50,6 +54,7 @@ class ModelTestCase(MailerTestMixin, GenericDocumentTestCase):
self.user_mailer.send(to=TEST_RECIPIENTS_MULTIPLE_COMMA)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT
)
@@ -59,6 +64,7 @@ class ModelTestCase(MailerTestMixin, GenericDocumentTestCase):
self.user_mailer.send(to=TEST_RECIPIENTS_MULTIPLE_SEMICOLON)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_SEMICOLON_RESULT
)
@@ -68,6 +74,7 @@ class ModelTestCase(MailerTestMixin, GenericDocumentTestCase):
self.user_mailer.send(to=TEST_RECIPIENTS_MULTIPLE_MIXED)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_MIXED_RESULT
)

View File

@@ -12,10 +12,10 @@ from ..permissions import (
)
from .literals import (
TEST_EMAIL_ADDRESS, TEST_USER_MAILER_BACKEND_PATH, TEST_USER_MAILER_LABEL,
TEST_RECIPIENTS_MULTIPLE_COMMA, TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT,
TEST_RECIPIENTS_MULTIPLE_MIXED, TEST_RECIPIENTS_MULTIPLE_MIXED_RESULT,
TEST_RECIPIENTS_MULTIPLE_SEMICOLON,
TEST_EMAIL_ADDRESS, TEST_EMAIL_FROM_ADDRESS, TEST_USER_MAILER_BACKEND_PATH,
TEST_USER_MAILER_LABEL, TEST_RECIPIENTS_MULTIPLE_COMMA,
TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT, TEST_RECIPIENTS_MULTIPLE_MIXED,
TEST_RECIPIENTS_MULTIPLE_MIXED_RESULT, TEST_RECIPIENTS_MULTIPLE_SEMICOLON,
TEST_RECIPIENTS_MULTIPLE_SEMICOLON_RESULT
)
from .mailers import TestBackend
@@ -92,6 +92,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self._request_document_link_send()
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(mail.outbox[0].to, [TEST_EMAIL_ADDRESS])
def test_mail_document_view_no_permissions(self):
@@ -111,6 +112,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self._request_document_send()
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(mail.outbox[0].to, [TEST_EMAIL_ADDRESS])
def test_user_mailer_create_view_no_permissions(self):
@@ -198,6 +200,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self.assertEqual(response.status_code, 200)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(mail.outbox[0].to, [TEST_EMAIL_ADDRESS])
def test_send_multiple_recipients_comma(self):
@@ -211,6 +214,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
response = self._request_user_mailer_test()
self.assertEqual(response.status_code, 200)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT
)
@@ -226,6 +230,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
response = self._request_user_mailer_test()
self.assertEqual(response.status_code, 200)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_MIXED_RESULT
)
@@ -241,6 +246,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
response = self._request_user_mailer_test()
self.assertEqual(response.status_code, 200)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_SEMICOLON_RESULT
)
@@ -255,6 +261,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self._request_document_link_send()
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT
)
@@ -269,6 +276,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self._request_document_link_send()
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_MIXED_RESULT
)
@@ -283,6 +291,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self._request_document_link_send()
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_SEMICOLON_RESULT
)
@@ -297,6 +306,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self._request_document_send()
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT
)
@@ -311,6 +321,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self._request_document_send()
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_MIXED_RESULT
)
@@ -325,6 +336,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self._request_document_send()
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(
mail.outbox[0].to, TEST_RECIPIENTS_MULTIPLE_SEMICOLON_RESULT
)