version 0.0.9: added single endpoint to login using username or email and password, remove separated login endpoints

This commit is contained in:
Anatoly 2019-08-14 15:52:27 +03:00
parent 7fe903b01b
commit 379ae2831a
3 changed files with 20 additions and 49 deletions

View File

@ -3,6 +3,7 @@ from django.contrib.auth import password_validation as password_validators
from rest_framework import serializers
from rest_framework import validators as rest_validators
from django.contrib.auth import authenticate
from django.db.models import Q
from django.conf import settings
from account import models as account_models
@ -67,7 +68,9 @@ class SignupSerializer(JWTBaseMixin, serializers.ModelSerializer):
write_only=True
)
password = serializers.CharField(write_only=True)
email = serializers.EmailField(write_only=True)
email = serializers.EmailField(
validators=(rest_validators.UniqueValidator(queryset=account_models.User.objects.all()),),
write_only=True)
newsletter = serializers.BooleanField(write_only=True)
class Meta:
@ -97,54 +100,31 @@ class SignupSerializer(JWTBaseMixin, serializers.ModelSerializer):
return obj
class LoginByUsernameSerializer(JWTBaseMixin, serializers.ModelSerializer):
"""Serializer for login user by username and password"""
username = serializers.CharField(write_only=True)
password = serializers.CharField(write_only=True)
class Meta:
"""Meta-class"""
model = account_models.User
fields = (
'username', 'password', 'refresh_token', 'access_token'
)
def validate(self, attrs):
"""Override validate method"""
username = attrs.pop('username')
password = attrs.pop('password')
user = authenticate(username=username,
password=password)
if not user:
raise utils_exceptions.UserNotFoundError()
self.instance = user
return attrs
class LoginByEmailSerializer(JWTBaseMixin, serializers.ModelSerializer):
class LoginByUsernameOrEmailSerializer(JWTBaseMixin, serializers.ModelSerializer):
"""Serializer for login user"""
email = serializers.EmailField(write_only=True)
username_or_email = serializers.CharField(write_only=True)
password = serializers.CharField(write_only=True)
class Meta:
"""Meta-class"""
model = account_models.User
fields = (
'email', 'password', 'refresh_token', 'access_token'
'username_or_email', 'password', 'refresh_token', 'access_token'
)
def validate(self, attrs):
"""Override validate method"""
email = attrs.pop('email')
username_or_email = attrs.pop('username_or_email')
password = attrs.pop('password')
try:
user = account_models.User.objects.get(email=email)
except account_models.User.DoesNotExist:
user_qs = account_models.User.objects.filter(Q(username=username_or_email) |
Q(email=username_or_email))
if not user_qs.exists():
raise utils_exceptions.UserNotFoundError()
else:
user = authenticate(username=user.get_username(),
password=password)
if not user:
user = user_qs.first()
authentication = authenticate(username=user.get_username(),
password=password)
if not authentication:
raise utils_exceptions.UserNotFoundError()
self.instance = user
return attrs

View File

@ -32,10 +32,8 @@ urlpatterns_jwt = [
path('signup/', views.SignUpView.as_view(),
name='signup'),
# sign in
path('login/username/', views.LoginByUsernameView.as_view(),
name='login-username'),
path('login/email/', views.LoginByEmailView.as_view(),
name='login-email'),
path('login/', views.LoginByUsernameOrEmailView.as_view(),
name='login'),
# refresh token
path('refresh-token/', views.RefreshTokenView.as_view(),
name="refresh-token"),

View File

@ -201,18 +201,11 @@ class SignUpView(JWTViewMixin):
response=response)
# Login by username + password
class LoginByUsernameView(JWTViewMixin):
"""Login by username"""
permission_classes = (permissions.AllowAny,)
serializer_class = serializers.LoginByUsernameSerializer
# Login by email + password
class LoginByEmailView(JWTViewMixin):
# Login by username|email + password
class LoginByUsernameOrEmailView(JWTViewMixin):
"""Login by email and password"""
permission_classes = (permissions.AllowAny,)
serializer_class = serializers.LoginByEmailSerializer
serializer_class = serializers.LoginByUsernameOrEmailSerializer
# Refresh access_token