version 0.0.9: added single endpoint to login using username or email and password, remove separated login endpoints
This commit is contained in:
parent
7fe903b01b
commit
379ae2831a
|
|
@ -3,6 +3,7 @@ from django.contrib.auth import password_validation as password_validators
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from rest_framework import validators as rest_validators
|
from rest_framework import validators as rest_validators
|
||||||
from django.contrib.auth import authenticate
|
from django.contrib.auth import authenticate
|
||||||
|
from django.db.models import Q
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from account import models as account_models
|
from account import models as account_models
|
||||||
|
|
@ -67,7 +68,9 @@ class SignupSerializer(JWTBaseMixin, serializers.ModelSerializer):
|
||||||
write_only=True
|
write_only=True
|
||||||
)
|
)
|
||||||
password = serializers.CharField(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)
|
newsletter = serializers.BooleanField(write_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
@ -97,54 +100,31 @@ class SignupSerializer(JWTBaseMixin, serializers.ModelSerializer):
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
class LoginByUsernameSerializer(JWTBaseMixin, serializers.ModelSerializer):
|
class LoginByUsernameOrEmailSerializer(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):
|
|
||||||
"""Serializer for login user"""
|
"""Serializer for login user"""
|
||||||
email = serializers.EmailField(write_only=True)
|
username_or_email = serializers.CharField(write_only=True)
|
||||||
password = serializers.CharField(write_only=True)
|
password = serializers.CharField(write_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta-class"""
|
"""Meta-class"""
|
||||||
model = account_models.User
|
model = account_models.User
|
||||||
fields = (
|
fields = (
|
||||||
'email', 'password', 'refresh_token', 'access_token'
|
'username_or_email', 'password', 'refresh_token', 'access_token'
|
||||||
)
|
)
|
||||||
|
|
||||||
def validate(self, attrs):
|
def validate(self, attrs):
|
||||||
"""Override validate method"""
|
"""Override validate method"""
|
||||||
email = attrs.pop('email')
|
username_or_email = attrs.pop('username_or_email')
|
||||||
password = attrs.pop('password')
|
password = attrs.pop('password')
|
||||||
try:
|
user_qs = account_models.User.objects.filter(Q(username=username_or_email) |
|
||||||
user = account_models.User.objects.get(email=email)
|
Q(email=username_or_email))
|
||||||
except account_models.User.DoesNotExist:
|
if not user_qs.exists():
|
||||||
raise utils_exceptions.UserNotFoundError()
|
raise utils_exceptions.UserNotFoundError()
|
||||||
else:
|
else:
|
||||||
user = authenticate(username=user.get_username(),
|
user = user_qs.first()
|
||||||
password=password)
|
authentication = authenticate(username=user.get_username(),
|
||||||
if not user:
|
password=password)
|
||||||
|
if not authentication:
|
||||||
raise utils_exceptions.UserNotFoundError()
|
raise utils_exceptions.UserNotFoundError()
|
||||||
self.instance = user
|
self.instance = user
|
||||||
return attrs
|
return attrs
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,8 @@ urlpatterns_jwt = [
|
||||||
path('signup/', views.SignUpView.as_view(),
|
path('signup/', views.SignUpView.as_view(),
|
||||||
name='signup'),
|
name='signup'),
|
||||||
# sign in
|
# sign in
|
||||||
path('login/username/', views.LoginByUsernameView.as_view(),
|
path('login/', views.LoginByUsernameOrEmailView.as_view(),
|
||||||
name='login-username'),
|
name='login'),
|
||||||
path('login/email/', views.LoginByEmailView.as_view(),
|
|
||||||
name='login-email'),
|
|
||||||
# refresh token
|
# refresh token
|
||||||
path('refresh-token/', views.RefreshTokenView.as_view(),
|
path('refresh-token/', views.RefreshTokenView.as_view(),
|
||||||
name="refresh-token"),
|
name="refresh-token"),
|
||||||
|
|
|
||||||
|
|
@ -201,18 +201,11 @@ class SignUpView(JWTViewMixin):
|
||||||
response=response)
|
response=response)
|
||||||
|
|
||||||
|
|
||||||
# Login by username + password
|
# Login by username|email + password
|
||||||
class LoginByUsernameView(JWTViewMixin):
|
class LoginByUsernameOrEmailView(JWTViewMixin):
|
||||||
"""Login by username"""
|
|
||||||
permission_classes = (permissions.AllowAny,)
|
|
||||||
serializer_class = serializers.LoginByUsernameSerializer
|
|
||||||
|
|
||||||
|
|
||||||
# Login by email + password
|
|
||||||
class LoginByEmailView(JWTViewMixin):
|
|
||||||
"""Login by email and password"""
|
"""Login by email and password"""
|
||||||
permission_classes = (permissions.AllowAny,)
|
permission_classes = (permissions.AllowAny,)
|
||||||
serializer_class = serializers.LoginByEmailSerializer
|
serializer_class = serializers.LoginByUsernameOrEmailSerializer
|
||||||
|
|
||||||
|
|
||||||
# Refresh access_token
|
# Refresh access_token
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user