mirror of
https://github.com/django/django.git
synced 2025-03-13 02:40:47 +00:00
Fixed #36087 -- Supported password reset on a custom user model with a composite primary key.
This commit is contained in:
parent
d83fb782d3
commit
23c6effac0
@ -478,11 +478,12 @@ class PasswordResetForm(forms.Form):
|
|||||||
email_field_name = UserModel.get_email_field_name()
|
email_field_name = UserModel.get_email_field_name()
|
||||||
for user in self.get_users(email):
|
for user in self.get_users(email):
|
||||||
user_email = getattr(user, email_field_name)
|
user_email = getattr(user, email_field_name)
|
||||||
|
user_pk_bytes = force_bytes(UserModel._meta.pk.value_to_string(user))
|
||||||
context = {
|
context = {
|
||||||
"email": user_email,
|
"email": user_email,
|
||||||
"domain": domain,
|
"domain": domain,
|
||||||
"site_name": site_name,
|
"site_name": site_name,
|
||||||
"uid": urlsafe_base64_encode(force_bytes(user.pk)),
|
"uid": urlsafe_base64_encode(user_pk_bytes),
|
||||||
"user": user,
|
"user": user,
|
||||||
"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",
|
||||||
|
@ -301,7 +301,8 @@ class PasswordResetConfirmView(PasswordContextMixin, FormView):
|
|||||||
try:
|
try:
|
||||||
# urlsafe_base64_decode() decodes to bytestring
|
# urlsafe_base64_decode() decodes to bytestring
|
||||||
uid = urlsafe_base64_decode(uidb64).decode()
|
uid = urlsafe_base64_decode(uidb64).decode()
|
||||||
user = UserModel._default_manager.get(pk=uid)
|
pk = UserModel._meta.pk.to_python(uid)
|
||||||
|
user = UserModel._default_manager.get(pk=pk)
|
||||||
except (
|
except (
|
||||||
TypeError,
|
TypeError,
|
||||||
ValueError,
|
ValueError,
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
from .custom_permissions import CustomPermissionsUser
|
from .custom_permissions import CustomPermissionsUser
|
||||||
from .custom_user import CustomUser, CustomUserWithoutIsActiveField, ExtensionUser
|
from .custom_user import (
|
||||||
|
CustomUser,
|
||||||
|
CustomUserCompositePrimaryKey,
|
||||||
|
CustomUserWithoutIsActiveField,
|
||||||
|
ExtensionUser,
|
||||||
|
)
|
||||||
from .invalid_models import CustomUserNonUniqueUsername
|
from .invalid_models import CustomUserNonUniqueUsername
|
||||||
from .is_active import IsActiveTestUser1
|
from .is_active import IsActiveTestUser1
|
||||||
from .minimal import MinimalUser
|
from .minimal import MinimalUser
|
||||||
@ -17,6 +22,7 @@ __all__ = (
|
|||||||
"CustomEmailField",
|
"CustomEmailField",
|
||||||
"CustomPermissionsUser",
|
"CustomPermissionsUser",
|
||||||
"CustomUser",
|
"CustomUser",
|
||||||
|
"CustomUserCompositePrimaryKey",
|
||||||
"CustomUserNonUniqueUsername",
|
"CustomUserNonUniqueUsername",
|
||||||
"CustomUserWithFK",
|
"CustomUserWithFK",
|
||||||
"CustomUserWithM2M",
|
"CustomUserWithM2M",
|
||||||
|
@ -119,6 +119,19 @@ class CustomUserWithoutIsActiveField(AbstractBaseUser):
|
|||||||
USERNAME_FIELD = "username"
|
USERNAME_FIELD = "username"
|
||||||
|
|
||||||
|
|
||||||
|
class CustomUserCompositePrimaryKey(AbstractBaseUser):
|
||||||
|
pk = models.CompositePrimaryKey("email", "date_of_birth")
|
||||||
|
email = models.EmailField(verbose_name="email address", max_length=255, unique=True)
|
||||||
|
is_active = models.BooleanField(default=True)
|
||||||
|
is_admin = models.BooleanField(default=False)
|
||||||
|
date_of_birth = models.DateField()
|
||||||
|
|
||||||
|
custom_objects = CustomUserManager()
|
||||||
|
|
||||||
|
USERNAME_FIELD = "email"
|
||||||
|
REQUIRED_FIELDS = ["date_of_birth"]
|
||||||
|
|
||||||
|
|
||||||
# The extension user is a simple extension of the built-in user class,
|
# The extension user is a simple extension of the built-in user class,
|
||||||
# adding a required date_of_birth field. This allows us to check for
|
# adding a required date_of_birth field. This allows us to check for
|
||||||
# any hard references to the name "User" in forms/handlers etc.
|
# any hard references to the name "User" in forms/handlers etc.
|
||||||
|
@ -38,7 +38,7 @@ from django.urls import NoReverseMatch, reverse, reverse_lazy
|
|||||||
from django.utils.http import urlsafe_base64_encode
|
from django.utils.http import urlsafe_base64_encode
|
||||||
|
|
||||||
from .client import PasswordResetConfirmClient
|
from .client import PasswordResetConfirmClient
|
||||||
from .models import CustomUser, UUIDUser
|
from .models import CustomUser, CustomUserCompositePrimaryKey, UUIDUser
|
||||||
from .settings import AUTH_TEMPLATES
|
from .settings import AUTH_TEMPLATES
|
||||||
|
|
||||||
|
|
||||||
@ -540,6 +540,18 @@ class CustomUserPasswordResetTest(AuthViewsTestCase):
|
|||||||
self.assertRedirects(response, "/reset/done/")
|
self.assertRedirects(response, "/reset/done/")
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(AUTH_USER_MODEL="auth_tests.CustomUserCompositePrimaryKey")
|
||||||
|
class CustomUserCompositePrimaryKeyPasswordResetTest(CustomUserPasswordResetTest):
|
||||||
|
@classmethod
|
||||||
|
def setUpTestData(cls):
|
||||||
|
cls.u1 = CustomUserCompositePrimaryKey.custom_objects.create(
|
||||||
|
email="staffmember@example.com",
|
||||||
|
date_of_birth=datetime.date(1976, 11, 8),
|
||||||
|
)
|
||||||
|
cls.u1.set_password("password")
|
||||||
|
cls.u1.save()
|
||||||
|
|
||||||
|
|
||||||
@override_settings(AUTH_USER_MODEL="auth_tests.UUIDUser")
|
@override_settings(AUTH_USER_MODEL="auth_tests.UUIDUser")
|
||||||
class UUIDUserPasswordResetTest(CustomUserPasswordResetTest):
|
class UUIDUserPasswordResetTest(CustomUserPasswordResetTest):
|
||||||
def _test_confirm_start(self):
|
def _test_confirm_start(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user