Fixed #24944 -- Added extra_email_context parameter to password_reset() view.

This commit is contained in:
sujayskumar 2015-06-18 18:19:35 +05:30 committed by Tim Graham
parent aac2a2d2ae
commit d8d853378b
8 changed files with 34 additions and 4 deletions

View File

@ -667,6 +667,7 @@ answer newbie questions, and generally made Django that much better:
Stephen Burrows <stephen.r.burrows@gmail.com> Stephen Burrows <stephen.r.burrows@gmail.com>
Steven L. Smith (fvox13) <steven@stevenlsmith.com> Steven L. Smith (fvox13) <steven@stevenlsmith.com>
Stuart Langridge <http://www.kryogenix.org/> Stuart Langridge <http://www.kryogenix.org/>
Sujay S Kumar <sujay.skumar141295@gmail.com>
Sune Kirkeby <http://ibofobi.dk/> Sune Kirkeby <http://ibofobi.dk/>
Sung-Jin Hong <serialx.net@gmail.com> Sung-Jin Hong <serialx.net@gmail.com>
SuperJared SuperJared

View File

@ -229,7 +229,8 @@ class PasswordResetForm(forms.Form):
subject_template_name='registration/password_reset_subject.txt', subject_template_name='registration/password_reset_subject.txt',
email_template_name='registration/password_reset_email.html', email_template_name='registration/password_reset_email.html',
use_https=False, token_generator=default_token_generator, use_https=False, token_generator=default_token_generator,
from_email=None, request=None, html_email_template_name=None): from_email=None, request=None, html_email_template_name=None,
extra_email_context=None):
""" """
Generates a one-use only link for resetting password and sends to the Generates a one-use only link for resetting password and sends to the
user. user.
@ -251,7 +252,8 @@ class PasswordResetForm(forms.Form):
'token': token_generator.make_token(user), 'token': token_generator.make_token(user),
'protocol': 'https' if use_https else 'http', 'protocol': 'https' if use_https else 'http',
} }
if extra_email_context is not None:
context.update(extra_email_context)
self.send_mail(subject_template_name, email_template_name, self.send_mail(subject_template_name, email_template_name,
context, from_email, user.email, context, from_email, user.email,
html_email_template_name=html_email_template_name) html_email_template_name=html_email_template_name)

View File

@ -175,7 +175,8 @@ def password_reset(request, is_admin_site=False,
post_reset_redirect=None, post_reset_redirect=None,
from_email=None, from_email=None,
extra_context=None, extra_context=None,
html_email_template_name=None): html_email_template_name=None,
extra_email_context=None):
if post_reset_redirect is None: if post_reset_redirect is None:
post_reset_redirect = reverse('password_reset_done') post_reset_redirect = reverse('password_reset_done')
else: else:
@ -191,6 +192,7 @@ def password_reset(request, is_admin_site=False,
'subject_template_name': subject_template_name, 'subject_template_name': subject_template_name,
'request': request, 'request': request,
'html_email_template_name': html_email_template_name, 'html_email_template_name': html_email_template_name,
'extra_email_context': extra_email_context,
} }
if is_admin_site: if is_admin_site:
warnings.warn( warnings.warn(

View File

@ -209,6 +209,9 @@ Minor features
makes it possible to use ``REMOTE_USER`` for setups where the header is only makes it possible to use ``REMOTE_USER`` for setups where the header is only
populated on login pages instead of every request in the session. populated on login pages instead of every request in the session.
* The :func:`~django.contrib.auth.views.password_reset` view accepts an
``extra_email_context`` parameter.
:mod:`django.contrib.contenttypes` :mod:`django.contrib.contenttypes`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -1219,7 +1219,7 @@ implementation details see :ref:`using-the-views`.
The ``current_app`` parameter is deprecated and will be removed in The ``current_app`` parameter is deprecated and will be removed in
Django 2.0. Callers should set ``request.current_app`` instead. Django 2.0. Callers should set ``request.current_app`` instead.
.. function:: password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html', email_template_name='registration/password_reset_email.html', subject_template_name='registration/password_reset_subject.txt', password_reset_form=PasswordResetForm, token_generator=default_token_generator, post_reset_redirect=None, from_email=None, current_app=None, extra_context=None, html_email_template_name=None) .. function:: password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html', email_template_name='registration/password_reset_email.html', subject_template_name='registration/password_reset_subject.txt', password_reset_form=PasswordResetForm, token_generator=default_token_generator, post_reset_redirect=None, from_email=None, current_app=None, extra_context=None, html_email_template_name=None, extra_email_context=None)
Allows a user to reset their password by generating a one-time use link Allows a user to reset their password by generating a one-time use link
that can be used to reset the password, and sending that link to the that can be used to reset the password, and sending that link to the
@ -1280,6 +1280,9 @@ implementation details see :ref:`using-the-views`.
for generating a ``text/html`` multipart email with the password reset for generating a ``text/html`` multipart email with the password reset
link. By default, HTML email is not sent. link. By default, HTML email is not sent.
* ``extra_email_context``: A dictionary of context data that will available
in the email template.
.. deprecated:: 1.8 .. deprecated:: 1.8
The ``is_admin_site`` argument is deprecated and will be removed in The ``is_admin_site`` argument is deprecated and will be removed in
@ -1290,6 +1293,10 @@ implementation details see :ref:`using-the-views`.
The ``current_app`` parameter is deprecated and will be removed in The ``current_app`` parameter is deprecated and will be removed in
Django 2.0. Callers should set ``request.current_app`` instead. Django 2.0. Callers should set ``request.current_app`` instead.
.. versionadded:: 1.9
The ``extra_email_context`` parameter was added.
**Template context:** **Template context:**
* ``form``: The form (see ``password_reset_form`` above) for resetting * ``form``: The form (see ``password_reset_form`` above) for resetting

View File

@ -1 +1,2 @@
{{ protocol }}://{{ domain }}/reset/{{ uid }}/{{ token }}/ {{ protocol }}://{{ domain }}/reset/{{ uid }}/{{ token }}/
Email email context: "{{ greeting }}"

View File

@ -174,6 +174,18 @@ class PasswordResetTest(AuthViewsTestCase):
# default functionality is 100% the same # default functionality is 100% the same
self.assertFalse(mail.outbox[0].message().is_multipart()) self.assertFalse(mail.outbox[0].message().is_multipart())
def test_extra_email_context(self):
"""
extra_email_context should be available in the email template context.
"""
response = self.client.post(
'/password_reset_extra_email_context/',
{'email': 'staffmember@example.com'},
)
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
self.assertIn('Email email context: "Hello!"', mail.outbox[0].body)
def test_html_mail_template(self): def test_html_mail_template(self):
""" """
A multipart email with text/plain and text/html is sent A multipart email with text/plain and text/html is sent

View File

@ -71,6 +71,8 @@ urlpatterns = auth_urlpatterns + [
url(r'^logout/next_page/named/$', views.logout, dict(next_page='password_reset')), url(r'^logout/next_page/named/$', views.logout, dict(next_page='password_reset')),
url(r'^remote_user/$', remote_user_auth_view), url(r'^remote_user/$', remote_user_auth_view),
url(r'^password_reset_from_email/$', views.password_reset, dict(from_email='staffmember@example.com')), url(r'^password_reset_from_email/$', views.password_reset, dict(from_email='staffmember@example.com')),
url(r'^password_reset_extra_email_context/$', views.password_reset,
dict(extra_email_context=dict(greeting='Hello!'))),
url(r'^password_reset/custom_redirect/$', views.password_reset, dict(post_reset_redirect='/custom/')), url(r'^password_reset/custom_redirect/$', views.password_reset, dict(post_reset_redirect='/custom/')),
url(r'^password_reset/custom_redirect/named/$', views.password_reset, dict(post_reset_redirect='password_reset')), url(r'^password_reset/custom_redirect/named/$', views.password_reset, dict(post_reset_redirect='password_reset')),
url(r'^password_reset/html_email_template/$', views.password_reset, url(r'^password_reset/html_email_template/$', views.password_reset,