diff --git a/apps/account/models.py b/apps/account/models.py index 40c06ca4..da1711bd 100644 --- a/apps/account/models.py +++ b/apps/account/models.py @@ -222,6 +222,17 @@ class ResetPasswordToken(PlatformMixin, ProjectBaseMixin): def __str__(self): return "Password reset token for user {user}".format(user=self.user) + def save(self, *args, **kwargs): + """Override save method""" + if not self.expiry_datetime: + self.expiry_datetime = ( + timezone.now() + + timezone.timedelta(hours=self.get_resetting_token_expiration) + ) + if not self.key: + self.key = self.generate_token + return super(ResetPasswordToken, self).save(*args, **kwargs) + @property def get_resetting_token_expiration(self): """Get resetting token expiration""" @@ -256,14 +267,3 @@ class ResetPasswordToken(PlatformMixin, ProjectBaseMixin): """Overdue instance""" self.expiry_datetime = timezone.now() self.save() - - def save(self, *args, **kwargs): - """Override save method""" - if not self.expiry_datetime: - self.expiry_datetime = ( - timezone.now() + - timezone.timedelta(hours=self.get_resetting_token_expiration) - ) - if not self.key: - self.key = self.generate_token - return super(ResetPasswordToken, self).save(*args, **kwargs) diff --git a/apps/account/serializers/common.py b/apps/account/serializers/common.py index 4fbdb0f1..2d293c68 100644 --- a/apps/account/serializers/common.py +++ b/apps/account/serializers/common.py @@ -118,7 +118,7 @@ class ChangeEmailSerializer(serializers.ModelSerializer): def validate_email(self, value): """Validate email value""" if value == self.instance.email: - # todo: added custom exception + # todo: add custom exception raise serializers.ValidationError() return value @@ -126,7 +126,7 @@ class ChangeEmailSerializer(serializers.ModelSerializer): """Override validate method""" email_confirmed = self.instance.email_confirmed if not email_confirmed: - # todo: added custom exception + # todo: add custom exception raise serializers.ValidationError() return attrs diff --git a/apps/account/serializers/web.py b/apps/account/serializers/web.py index ceb65c08..d9fddfae 100644 --- a/apps/account/serializers/web.py +++ b/apps/account/serializers/web.py @@ -1,6 +1,7 @@ """Serializers for account web""" from django.conf import settings from django.contrib.auth import password_validation as password_validators +from django.db.models import Q from rest_framework import serializers from account import models @@ -10,36 +11,38 @@ from utils import exceptions as utils_exceptions class PasswordResetSerializer(serializers.ModelSerializer): """Serializer from model PasswordReset""" - email = serializers.EmailField(required=False, - write_only=True) + username_or_email = serializers.CharField(required=False, + write_only=True,) class Meta: """Meta class""" model = models.ResetPasswordToken fields = ( - 'email', + 'username_or_email', ) def validate(self, attrs): """Override validate method""" user = self.context.get('request').user - email = attrs.get('email') + username_or_email = attrs.pop('username_or_email') - if not user.is_anonymous: - attrs['user'] = user - else: + if user.is_anonymous: # Check user in DB - user_qs = models.User.objects.filter(email=email) + user_qs = models.User.objects.filter(Q(email=username_or_email) | + Q(username=username_or_email)) if user_qs.exists(): attrs['user'] = user_qs.first() else: raise utils_exceptions.UserNotFoundError() + else: + attrs['user'] = user return attrs def create(self, validated_data, *args, **kwargs): """Override create method""" user = validated_data.pop('user') ip_address = self.context.get('request').META.get('REMOTE_ADDR') + obj = models.ResetPasswordToken.objects.create( user=user, ip_address=ip_address, diff --git a/apps/account/views/web.py b/apps/account/views/web.py index acd8978b..152c818a 100644 --- a/apps/account/views/web.py +++ b/apps/account/views/web.py @@ -156,7 +156,7 @@ class FormPasswordResetConfirmView(PasswordContextMixin, FormView): def form_valid(self, form): # Saving form form.save() - # Pop token + # Pop session token del self.request.session[self.INTERNAL_RESET_SESSION_TOKEN] return super().form_valid(form) diff --git a/project/templates/authorization/confirm_email.html b/project/templates/authorization/confirm_email.html index f3b00c4a..7fa06aa5 100644 --- a/project/templates/authorization/confirm_email.html +++ b/project/templates/authorization/confirm_email.html @@ -3,7 +3,7 @@ {% trans "Please confirm your email address to complete the registration:" %} {% block signup_confirm %} -http://{{ domain_uri }}{% url 'auth:signup-confirm' uidb64=uid token=token %} +http://{{ domain_uri }}{% url 'auth:signup-confirm' uidb64=uidb64 token=token %} {% endblock %} {% trans "Thanks for using our site!" %} diff --git a/requirements/base.txt b/requirements/base.txt index 3d7987c0..1c70e7c2 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -20,7 +20,6 @@ geoip2==2.9.0 django-phonenumber-field[phonenumbers]==2.1.0 # auth socials -djangorestframework-oauth django-rest-framework-social-oauth2==1.1.0 django-extensions==2.2.1