From ffd3a54514efdf65fca2f05db8d3a0e0dbec2886 Mon Sep 17 00:00:00 2001 From: ask4git Date: Mon, 23 Dec 2024 23:24:13 +0900 Subject: [PATCH 1/2] :wrench: Edit `authx.serializers` --- beanlibapi/apps/authx/serializers.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/beanlibapi/apps/authx/serializers.py b/beanlibapi/apps/authx/serializers.py index 71299b5..f8f2c8e 100644 --- a/beanlibapi/apps/authx/serializers.py +++ b/beanlibapi/apps/authx/serializers.py @@ -36,12 +36,21 @@ def validate_user_status(self, user): class PasswordResetSerializer(_PasswordResetSerializer): - @property - def password_reset_form_class(self): - if 'allauth' in settings.INSTALLED_APPS: - return AllAuthPasswordResetForm - else: - return PasswordResetForm + password_reset_form_class = PasswordResetForm + + def get_email_options(self): + return { + 'html_email_template_name': 'registration/password_reset_email.html', + 'email_template_name': 'registration/password_reset_email.txt' + } + + def validate_email_address(self, email_address): + # if not email_address_exists(email_address): + # raise EmailNotFoundError() + return super().validate_email(email_address) + + # def validate_email(self, value): + # return value class GoogleSocialLoginSerializer(_SocialLoginSerializer): From fafaf3c4cf148b01196c7947afffe5024efb3b39 Mon Sep 17 00:00:00 2001 From: ask4git Date: Tue, 24 Dec 2024 03:21:43 +0900 Subject: [PATCH 2/2] :wrench: Add `PasswordResetView` form --- beanlibapi/apps/authx/forms.py | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/beanlibapi/apps/authx/forms.py b/beanlibapi/apps/authx/forms.py index 8f482e9..65b4364 100644 --- a/beanlibapi/apps/authx/forms.py +++ b/beanlibapi/apps/authx/forms.py @@ -66,3 +66,46 @@ def save(self, request, **kwargs): 'account/email/password_reset_key', email, context ) return self.cleaned_data['email'] + + +class PasswordResetForm(_AllAuthPasswordResetForm): + def get_users(self, email): + UserModel = get_user_model() + + if not validate_email(email, verify=False, check_mx=False): + raise exc.InvalidEmailFormat({'email': [_('Not a valid email address')]}) + + active_users = UserModel._default_manager.filter(**{ + '%s__iexact' % UserModel.get_email_field_name(): email, + 'is_active': True, + }) + users = (u for u in active_users) + + if not users: + raise exc.UserNotFound({'email': [_('User who has the email address is not found')]}) + if settings.CHECK_EMAIL_MX and not validate_email(email, check_mx=True, smtp_timeout=5): + raise exc.MxServerNotFound({'email': [_('Mail server does not respond')]}) + + return users + + +def save(self, domain_override=None, + subject_template_name='registration/password_reset_subject.txt', + email_template_name='registration/password_reset_email.html', + use_https=False, token_generator=default_token_generator, + from_email=None, request=None, html_email_template_name=None, + extra_email_context=None): + email = self.cleaned_data["email"] + for user in self.get_users(email): + context = { + 'email': email, + 'uid': urlsafe_base64_encode(force_bytes(user.pk)), + 'user': user, + 'token': token_generator.make_token(user), + 'protocol': 'https' if use_https else 'http', + 'app_domain': settings.APP_DOMAIN, + } + super().send_mail( + subject_template_name, email_template_name, context, from_email, + email, html_email_template_name=html_email_template_name, + )