92 lines
3.0 KiB
Python
92 lines
3.0 KiB
Python
"""Common serializer for application authorization"""
|
|
from django.contrib.auth import password_validation as password_validators
|
|
from rest_framework import serializers
|
|
from rest_framework import validators as rest_validators
|
|
|
|
from account import models as account_models
|
|
from utils import exceptions as utils_exceptions
|
|
from authorization.models import Application
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
# Mixins
|
|
class BaseAuthSerializerMixin(serializers.Serializer):
|
|
"""Base authorization serializer mixin"""
|
|
source = serializers.ChoiceField(choices=Application.SOURCES)
|
|
|
|
|
|
class LoginSerializerMixin(BaseAuthSerializerMixin):
|
|
"""Mixin for login serializers"""
|
|
password = serializers.CharField(write_only=True)
|
|
|
|
|
|
class ClassicAuthSerializerMixin(BaseAuthSerializerMixin):
|
|
"""Classic authorization serializer mixin"""
|
|
password = serializers.CharField(write_only=True)
|
|
newsletter = serializers.BooleanField()
|
|
|
|
|
|
# Classic
|
|
class LoginByEmailSerializer(LoginSerializerMixin, serializers.ModelSerializer):
|
|
"""Serializer for signing up user by email"""
|
|
email = serializers.CharField(write_only=True)
|
|
|
|
class Meta:
|
|
"""Meta-class"""
|
|
model = account_models.User
|
|
fields = ('email', 'password', 'source')
|
|
|
|
def validate(self, attrs):
|
|
"""Override validate method"""
|
|
try:
|
|
user = account_models.User.objects.get(email=attrs.get('email'))
|
|
attrs['username'] = user.get_username
|
|
except account_models.User.DoesNotExist:
|
|
raise utils_exceptions.UserNotFoundError()
|
|
else:
|
|
return attrs
|
|
|
|
|
|
class UsernameSignUpSerializer(ClassicAuthSerializerMixin, serializers.ModelSerializer):
|
|
"""Serializer for signing up user by username"""
|
|
username = serializers.CharField(
|
|
validators=(rest_validators.UniqueValidator(queryset=account_models.User.objects.all()), ),
|
|
write_only=True
|
|
)
|
|
|
|
class Meta:
|
|
"""Meta-class"""
|
|
model = account_models.User
|
|
fields = ('username', 'newsletter', 'password', 'source')
|
|
|
|
def validate_password(self, data):
|
|
"""Custom password validation"""
|
|
try:
|
|
password_validators.validate_password(password=data)
|
|
except serializers.ValidationError as e:
|
|
raise serializers.ValidationError(e)
|
|
else:
|
|
return data
|
|
|
|
def create(self, validated_data):
|
|
"""Override create method"""
|
|
obj = account_models.User.objects.make(**validated_data)
|
|
return obj
|
|
|
|
|
|
class LoginSerializer(BaseAuthSerializerMixin, serializers.ModelSerializer):
|
|
"""Serializer for login user"""
|
|
username = serializers.CharField(write_only=True)
|
|
password = serializers.CharField(write_only=True)
|
|
|
|
class Meta:
|
|
"""Meta-class"""
|
|
model = account_models.User
|
|
fields = ('username', 'password', 'source')
|
|
|
|
|
|
# OAuth
|
|
class OAuth2Serialzier(BaseAuthSerializerMixin):
|
|
"""Serializer OAuth2 authorization"""
|
|
token = serializers.CharField(max_length=255)
|