GM-81: Доарботать механизм авторизации при невалидированном email и изменении email
This commit is contained in:
parent
efe1539dad
commit
64b101516d
|
|
@ -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"""
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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'),
|
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user