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 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

View File

@ -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"),

View File

@ -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