Skip to content

Commit 5110a7d

Browse files
authored
Merge pull request #3 from dkainama/feature/pass-context-to-mixins
Feature: pass context to mixins on BaseEmailMessage
2 parents 6d12a4a + c5b7964 commit 5110a7d

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed

templated_mail/mail.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
from copy import deepcopy
2-
31
from django.conf import settings
42
from django.contrib.sites.shortcuts import get_current_site
53
from django.core import mail
64
from django.template.context import make_context
75
from django.template.loader import get_template
6+
from django.views.generic.base import ContextMixin
87

98

10-
class BaseEmailMessage(mail.EmailMultiAlternatives):
9+
class BaseEmailMessage(mail.EmailMultiAlternatives, ContextMixin):
1110
_node_map = {
1211
'subject': 'subject',
1312
'text_body': 'body',
@@ -26,8 +25,9 @@ def __init__(self, request=None, context=None, template_name=None,
2625
if template_name is not None:
2726
self.template_name = template_name
2827

29-
def get_context_data(self):
30-
context = deepcopy(self.context)
28+
def get_context_data(self, **kwargs):
29+
ctx = super(BaseEmailMessage, self).get_context_data(**kwargs)
30+
context = dict(ctx, **self.context)
3131
if self.request:
3232
site = get_current_site(self.request)
3333
domain = context.get('domain') or (

tests/helpers.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from django.views.generic.base import ContextMixin
2+
from templated_mail.mail import BaseEmailMessage
3+
4+
5+
class MockMailContext(ContextMixin):
6+
def get_context_data(self, **kwargs):
7+
context = super(MockMailContext, self).get_context_data(**kwargs)
8+
context['thing'] = 42
9+
return context
10+
11+
12+
class MockMail(BaseEmailMessage, MockMailContext):
13+
pass

tests/test_mail.py

+12
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from django.test import RequestFactory, TestCase
1010
from templated_mail.mail import BaseEmailMessage
1111

12+
from .helpers import MockMail
13+
1214

1315
class TestBaseEmailMessage(TestCase):
1416
def setUp(self):
@@ -203,3 +205,13 @@ def test_mail_from_email_is_sent_with_valid_from_email(self):
203205
self.assertEqual(mail.outbox[0].body, 'Foobar email content')
204206
self.assertEqual(mail.outbox[0].alternatives, [])
205207
self.assertEqual(mail.outbox[0].content_subtype, 'plain')
208+
209+
def test_extending_mail_with_context_mixin(self):
210+
email_message = MockMail(
211+
template_name='text_mail.html', context={'foo': 'bar'}
212+
)
213+
214+
context = email_message.get_context_data()
215+
216+
self.assertEquals(context['foo'], 'bar')
217+
self.assertEquals(context['thing'], 42)

0 commit comments

Comments
 (0)