diff --git a/AUTHORS b/AUTHORS index e41a4aa4db..cec85c093f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -575,6 +575,7 @@ answer newbie questions, and generally made Django that much better: Aaron Swartz Ville Säävuori Mart Sõmermaa + Susan Tan Christian Tanzer Tyler Tarabula Tyson Tate diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py index cf3d37e5c3..cf1ca8ca1f 100644 --- a/django/contrib/auth/models.py +++ b/django/contrib/auth/models.py @@ -400,11 +400,11 @@ class AbstractUser(AbstractBaseUser, PermissionsMixin): "Returns the short name for the user." return self.first_name - def email_user(self, subject, message, from_email=None): + def email_user(self, subject, message, from_email=None, **kwargs): """ Sends an email to this User. """ - send_mail(subject, message, from_email, [self.email]) + send_mail(subject, message, from_email, [self.email], **kwargs) class User(AbstractUser): diff --git a/django/contrib/auth/tests/test_models.py b/django/contrib/auth/tests/test_models.py index fa20775a8d..1373a3c1c1 100644 --- a/django/contrib/auth/tests/test_models.py +++ b/django/contrib/auth/tests/test_models.py @@ -1,6 +1,7 @@ from django.contrib.auth import get_user_model -from django.contrib.auth.models import Group, User, UserManager +from django.contrib.auth.models import AbstractUser, Group, User, UserManager from django.contrib.auth.tests.utils import skipIfCustomUser +from django.core import mail from django.db.models.signals import post_save from django.test import TestCase from django.test.utils import override_settings @@ -73,6 +74,29 @@ class UserManagerTestCase(TestCase): User.objects.create_user, username='') +class AbstractUserTestCase(TestCase): + def test_email_user(self): + # valid send_mail parameters + kwargs = { + "fail_silently": False, + "auth_user": None, + "auth_password": None, + "connection": None, + "html_message": None, + } + abstract_user = AbstractUser(email='foo@bar.com') + abstract_user.email_user(subject="Subject here", + message="This is a message", from_email="from@domain.com", **kwargs) + # Test that one message has been sent. + self.assertEqual(len(mail.outbox), 1) + # Verify that test email contains the correct attributes: + message = mail.outbox[0] + self.assertEqual(message.subject, "Subject here") + self.assertEqual(message.body, "This is a message") + self.assertEqual(message.from_email, "from@domain.com") + self.assertEqual(message.to, [abstract_user.email]) + + class IsActiveTestCase(TestCase): """ Tests the behavior of the guaranteed is_active attribute diff --git a/docs/ref/contrib/auth.txt b/docs/ref/contrib/auth.txt index 4fe87e9872..ba4c9425a5 100644 --- a/docs/ref/contrib/auth.txt +++ b/docs/ref/contrib/auth.txt @@ -215,11 +215,16 @@ Methods (the Django app label). If the user is inactive, this method will always return ``False``. - .. method:: email_user(subject, message, from_email=None) + .. method:: email_user(subject, message, from_email=None, **kwargs) Sends an email to the user. If ``from_email`` is ``None``, Django uses the :setting:`DEFAULT_FROM_EMAIL`. + .. versionchanged:: 1.7 + + Any ``**kwargs`` are passed to the underlying + :meth:`~django.core.mail.send_mail()` call. + Manager methods --------------- diff --git a/docs/releases/1.7.txt b/docs/releases/1.7.txt index 9fe8fc89df..f4bbd058d6 100644 --- a/docs/releases/1.7.txt +++ b/docs/releases/1.7.txt @@ -152,6 +152,10 @@ Minor features Each radio button or checkbox includes an ``id_for_label`` attribute to output the element's ID. +* Any ``**kwargs`` passed to + :meth:`~django.contrib.auth.models.User.email_user()` are passed to the + underlying :meth:`~django.core.mail.send_mail()` call. + Backwards incompatible changes in 1.7 =====================================