GM-81: Доарботать механизм авторизации при невалидированном email и изменении email

This commit is contained in:
Anatoly 2019-09-09 15:45:51 +03:00
parent efe1539dad
commit 64b101516d
5 changed files with 20 additions and 35 deletions

View File

@ -181,6 +181,13 @@ class User(ImageMixin, AbstractUser):
'domain_uri': settings.DOMAIN_URI, 'domain_uri': settings.DOMAIN_URI,
'site_name': settings.SITE_NAME}) 'site_name': settings.SITE_NAME})
@property
def fullname(self):
fullname = []
if self.first_name: fullname.append(self.first_name)
if self.last_name: fullname.append(self.last_name)
return ' '.join(fullname)
class ResetPasswordTokenQuerySet(models.QuerySet): class ResetPasswordTokenQuerySet(models.QuerySet):
"""Reset password token query set""" """Reset password token query set"""

View File

@ -14,31 +14,39 @@ class UserSerializer(serializers.ModelSerializer):
"""User serializer.""" """User serializer."""
# RESPONSE # RESPONSE
email_confirmed = serializers.BooleanField(read_only=True) email_confirmed = serializers.BooleanField(read_only=True)
fullname = serializers.SerializerMethodField()
# REQUEST # REQUEST
username = serializers.CharField(required=False)
first_name = serializers.CharField(required=False, write_only=True)
last_name = serializers.CharField(required=False, write_only=True)
image = serializers.ImageField(required=False) image = serializers.ImageField(required=False)
cropped_image = serializers.ImageField(required=False) cropped_image = serializers.ImageField(required=False)
email = serializers.EmailField(required=False) email = serializers.EmailField(required=False)
username = serializers.CharField(required=False)
newsletter = serializers.BooleanField(required=False) newsletter = serializers.BooleanField(required=False)
class Meta: class Meta:
model = models.User model = models.User
fields = [ fields = [
'username',
'first_name',
'last_name',
'fullname',
'cropped_image', 'cropped_image',
'image', 'image',
'email', 'email',
'email_confirmed', 'email_confirmed',
'username',
'newsletter', 'newsletter',
] ]
def get_fullname(self, obj):
"""Get user full name"""
return obj.fullname
def validate_email(self, value): def validate_email(self, value):
"""Validate email value""" """Validate email value"""
if value == self.instance.email: if value == self.instance.email:
raise serializers.ValidationError() raise serializers.ValidationError()
if not self.instance.email_confirmed:
raise serializers.ValidationError()
return value return value
def validate_username(self, value): def validate_username(self, value):

View File

@ -11,6 +11,4 @@ urlpatterns = [
path('change-email/confirm/<uidb64>/<token>/', views.ChangeEmailConfirmView.as_view(), path('change-email/confirm/<uidb64>/<token>/', views.ChangeEmailConfirmView.as_view(),
name='change-email-confirm'), name='change-email-confirm'),
path('confirm-email/', views.ConfirmEmailView.as_view(), name='confirm-email'), path('confirm-email/', views.ConfirmEmailView.as_view(), name='confirm-email'),
path('confirm-email/<uidb64>/<token>/', views.ConfirmInactiveEmailView.as_view(),
name='inactive-email-confirm'),
] ]

View File

@ -60,33 +60,6 @@ class ChangeEmailConfirmView(JWTGenericViewMixin):
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
def get(self, request, *args, **kwargs):
"""Implement GET-method"""
uidb64 = kwargs.get('uidb64')
token = kwargs.get('token')
uid = force_text(urlsafe_base64_decode(uidb64))
user_qs = models.User.objects.filter(pk=uid)
if user_qs.exists():
user = user_qs.first()
if not GMTokenGenerator(GMTokenGenerator.CHANGE_EMAIL).check_token(
user, token):
raise utils_exceptions.NotValidTokenError()
# Approve email status
user.confirm_email()
# Expire user tokens
user.expire_access_tokens()
user.expire_refresh_tokens()
return Response(status=status.HTTP_200_OK)
else:
raise utils_exceptions.UserNotFoundError()
class ConfirmInactiveEmailView(generics.GenericAPIView):
"""View for confirm inactive email"""
permission_classes = (permissions.AllowAny,)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
"""Implement GET-method""" """Implement GET-method"""
uidb64 = kwargs.get('uidb64') uidb64 = kwargs.get('uidb64')

View File

@ -100,8 +100,7 @@ class LoginByUsernameOrEmailSerializer(SourceSerializerMixin,
username_or_email = attrs.pop('username_or_email') username_or_email = attrs.pop('username_or_email')
password = attrs.pop('password') password = attrs.pop('password')
user_qs = account_models.User.objects.filter(Q(username=username_or_email) | user_qs = account_models.User.objects.filter(Q(username=username_or_email) |
(Q(email=username_or_email) & (Q(email=username_or_email)))
Q(email_confirmed=True)))
if not user_qs.exists(): if not user_qs.exists():
raise utils_exceptions.UserNotFoundError() raise utils_exceptions.UserNotFoundError()
else: else: