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,
'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):
"""Reset password token query set"""

View File

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

View File

@ -11,6 +11,4 @@ urlpatterns = [
path('change-email/confirm/<uidb64>/<token>/', views.ChangeEmailConfirmView.as_view(),
name='change-email-confirm'),
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,)
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):
"""Implement GET-method"""
uidb64 = kwargs.get('uidb64')

View File

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