未验证 提交 02a2965e 编写于 作者: A Andrey Zhavoronkov 提交者: GitHub

Fixed reset password after switching to dj-rest-auth (#52)

上级 a912a445
......@@ -46,6 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Generated OpenAPI schema for several endpoints
- Annotation window might have top offset if try to move a locked object
- Image search in cloud storage (<https://github.com/cvat-ai/cvat/pull/8>)
- Reset password functionality (<https://github.com/cvat-ai/cvat/pull/52>)
### Security
- TDB
......
# Copyright (C) 2022 CVAT.ai Corporation
#
# SPDX-License-Identifier: MIT
from django.contrib.sites.shortcuts import get_current_site
from django.contrib.auth import get_user_model
from allauth.account.forms import default_token_generator
from allauth.account.utils import user_pk_to_url_str
from allauth.account.adapter import get_adapter
from dj_rest_auth.forms import AllAuthPasswordResetForm
UserModel = get_user_model()
class ResetPasswordFormEx(AllAuthPasswordResetForm):
def save(self, request=None, domain_override=None,
email_template_prefix='authentication/password_reset_key',
use_https=False, token_generator=default_token_generator,
extra_email_context=None, **kwargs):
"""
Generate a one-use only link for resetting password and send it to the
user.
"""
email = self.cleaned_data["email"]
if not domain_override:
current_site = get_current_site(request)
site_name = current_site.name
domain = current_site.domain
else:
site_name = domain = domain_override
email_field_name = UserModel.get_email_field_name()
for user in self.users:
user_email = getattr(user, email_field_name)
context = {
'email': user_email,
'domain': domain,
'site_name': site_name,
'uid': user_pk_to_url_str(user),
'user': user,
'token': token_generator.make_token(user),
'protocol': 'https' if use_https else 'http',
**(extra_email_context or {}),
}
get_adapter(request).send_mail(email_template_prefix, email, context)
return self.cleaned_data['email']
......@@ -9,6 +9,8 @@ from rest_framework import serializers
from django.conf import settings
from cvat.apps.iam.forms import ResetPasswordFormEx
class RegisterSerializerEx(RegisterSerializer):
first_name = serializers.CharField(required=False)
last_name = serializers.CharField(required=False)
......@@ -23,6 +25,10 @@ class RegisterSerializerEx(RegisterSerializer):
return data
class PasswordResetSerializerEx(PasswordResetSerializer):
@property
def password_reset_form_class(self):
return ResetPasswordFormEx
def get_email_options(self):
domain = None
if hasattr(settings, 'UI_HOST') and settings.UI_HOST:
......@@ -30,6 +36,5 @@ class PasswordResetSerializerEx(PasswordResetSerializer):
if hasattr(settings, 'UI_PORT') and settings.UI_PORT:
domain += ':{}'.format(settings.UI_PORT)
return {
'email_template_name': 'authentication/password_reset_email.html',
'domain_override': domain
}
{% load i18n %}{% autoescape off %}
{% blocktrans %}
<p>
You're receiving this email because you requested a password reset for your user account at {{ site_name }}.
</p>
{% endblocktrans %}
{% trans "Please go to the following page and choose a new password:" %}
{% block reset_link %}
<p>
<a href="{{ protocol }}://{{ domain }}/auth/password/reset/confirm?uid={{ uid }}&token={{ token }}">{{ protocol }}://{{ domain }}/auth/password/reset/confirm?uid={{ uid }}&token={{ token }}</a>
</p>
{% endblock %}
<p>
{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}
</p>
{% trans "Thanks for using our site!" %}
<p>
{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
</p>
{% endautoescape %}
{% load i18n %}
{% autoescape off %}
{% blocktrans %}Password Reset E-mail{% endblocktrans %}
{% endautoescape %}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册