mirror of
https://github.com/django/django.git
synced 2024-12-28 03:55:50 +00:00
ede59ef6f3
Thanks Florian Apolloner for contributing to this patch and Collin Anderson, Markus Holtermann, and Tim Graham for review.
42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
import re
|
|
|
|
from django.contrib.auth.views import (
|
|
INTERNAL_RESET_SESSION_TOKEN, INTERNAL_RESET_URL_TOKEN,
|
|
)
|
|
from django.test import Client
|
|
|
|
|
|
def extract_token_from_url(url):
|
|
token_search = re.search(r'/reset/.*/(.+?)/', url)
|
|
if token_search:
|
|
return token_search.group(1)
|
|
|
|
|
|
class PasswordResetConfirmClient(Client):
|
|
"""
|
|
This client eases testing the password reset flow by emulating the
|
|
PasswordResetConfirmView's redirect and saving of the reset token in the
|
|
user's session. This request puts 'my-token' in the session and redirects
|
|
to '/reset/bla/set-password/':
|
|
|
|
>>> client = PasswordResetConfirmClient()
|
|
>>> client.get('/reset/bla/my-token/')
|
|
"""
|
|
def _get_password_reset_confirm_redirect_url(self, url):
|
|
token = extract_token_from_url(url)
|
|
if not token:
|
|
return url
|
|
# Add the token to the session
|
|
session = self.session
|
|
session[INTERNAL_RESET_SESSION_TOKEN] = token
|
|
session.save()
|
|
return url.replace(token, INTERNAL_RESET_URL_TOKEN)
|
|
|
|
def get(self, path, *args, **kwargs):
|
|
redirect_url = self._get_password_reset_confirm_redirect_url(path)
|
|
return super(PasswordResetConfirmClient, self).get(redirect_url, *args, **kwargs)
|
|
|
|
def post(self, path, *args, **kwargs):
|
|
redirect_url = self._get_password_reset_confirm_redirect_url(path)
|
|
return super(PasswordResetConfirmClient, self).post(redirect_url, *args, **kwargs)
|