Skip to content

Commit 02a2965

Browse files
authored
Fixed reset password after switching to dj-rest-auth (cvat-ai#52)
1 parent a912a44 commit 02a2965

File tree

6 files changed

+83
-1
lines changed

6 files changed

+83
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4646
- Generated OpenAPI schema for several endpoints
4747
- Annotation window might have top offset if try to move a locked object
4848
- Image search in cloud storage (<https://github.com/cvat-ai/cvat/pull/8>)
49+
- Reset password functionality (<https://github.com/cvat-ai/cvat/pull/52>)
4950

5051
### Security
5152
- TDB

cvat/apps/iam/forms.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Copyright (C) 2022 CVAT.ai Corporation
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
from django.contrib.sites.shortcuts import get_current_site
6+
from django.contrib.auth import get_user_model
7+
8+
from allauth.account.forms import default_token_generator
9+
from allauth.account.utils import user_pk_to_url_str
10+
from allauth.account.adapter import get_adapter
11+
from dj_rest_auth.forms import AllAuthPasswordResetForm
12+
13+
UserModel = get_user_model()
14+
15+
class ResetPasswordFormEx(AllAuthPasswordResetForm):
16+
def save(self, request=None, domain_override=None,
17+
email_template_prefix='authentication/password_reset_key',
18+
use_https=False, token_generator=default_token_generator,
19+
extra_email_context=None, **kwargs):
20+
21+
"""
22+
Generate a one-use only link for resetting password and send it to the
23+
user.
24+
"""
25+
email = self.cleaned_data["email"]
26+
if not domain_override:
27+
current_site = get_current_site(request)
28+
site_name = current_site.name
29+
domain = current_site.domain
30+
else:
31+
site_name = domain = domain_override
32+
email_field_name = UserModel.get_email_field_name()
33+
for user in self.users:
34+
user_email = getattr(user, email_field_name)
35+
context = {
36+
'email': user_email,
37+
'domain': domain,
38+
'site_name': site_name,
39+
'uid': user_pk_to_url_str(user),
40+
'user': user,
41+
'token': token_generator.make_token(user),
42+
'protocol': 'https' if use_https else 'http',
43+
**(extra_email_context or {}),
44+
}
45+
46+
get_adapter(request).send_mail(email_template_prefix, email, context)
47+
48+
return self.cleaned_data['email']

cvat/apps/iam/serializers.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
from django.conf import settings
1111

12+
from cvat.apps.iam.forms import ResetPasswordFormEx
13+
1214
class RegisterSerializerEx(RegisterSerializer):
1315
first_name = serializers.CharField(required=False)
1416
last_name = serializers.CharField(required=False)
@@ -23,13 +25,16 @@ def get_cleaned_data(self):
2325
return data
2426

2527
class PasswordResetSerializerEx(PasswordResetSerializer):
28+
@property
29+
def password_reset_form_class(self):
30+
return ResetPasswordFormEx
31+
2632
def get_email_options(self):
2733
domain = None
2834
if hasattr(settings, 'UI_HOST') and settings.UI_HOST:
2935
domain = settings.UI_HOST
3036
if hasattr(settings, 'UI_PORT') and settings.UI_PORT:
3137
domain += ':{}'.format(settings.UI_PORT)
3238
return {
33-
'email_template_name': 'authentication/password_reset_email.html',
3439
'domain_override': domain
3540
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{% load i18n %}{% autoescape off %}
2+
{% blocktrans %}
3+
<p>
4+
You're receiving this email because you requested a password reset for your user account at {{ site_name }}.
5+
</p>
6+
{% endblocktrans %}
7+
8+
{% trans "Please go to the following page and choose a new password:" %}
9+
{% block reset_link %}
10+
<p>
11+
<a href="{{ protocol }}://{{ domain }}/auth/password/reset/confirm?uid={{ uid }}&token={{ token }}">{{ protocol }}://{{ domain }}/auth/password/reset/confirm?uid={{ uid }}&token={{ token }}</a>
12+
</p>
13+
{% endblock %}
14+
<p>
15+
{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}
16+
</p>
17+
18+
{% trans "Thanks for using our site!" %}
19+
20+
<p>
21+
{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
22+
</p>
23+
24+
{% endautoescape %}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{% load i18n %}
2+
{% autoescape off %}
3+
{% blocktrans %}Password Reset E-mail{% endblocktrans %}
4+
{% endautoescape %}

0 commit comments

Comments
 (0)