"""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 authorization.models import Application from utils import exceptions as utils_exceptions # 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() # Serializers class SignupSerializer(BaseAuthSerializerMixin, serializers.ModelSerializer): """Signup serializer serializer mixin""" # REQUEST username = serializers.CharField( validators=(rest_validators.UniqueValidator(queryset=account_models.User.objects.all()),), write_only=True ) password = serializers.CharField(write_only=True) email = serializers.EmailField(write_only=True) newsletter = serializers.BooleanField() class Meta: model = account_models.User fields = ( 'username', 'first_name', 'last_name', 'password', 'newsletter', 'email', 'source' ) def validate_password(self, data): """Custom password validation""" try: password_validators.validate_password(password=data) except serializers.ValidationError as e: raise serializers.ValidationError(str(e)) else: return data def create(self, validated_data): """Override create method""" obj = account_models.User.objects.make( username=validated_data.get('username'), password=validated_data.get('password'), email=validated_data.get('email'), newsletter=validated_data.get('newsletter') ) 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') class RefreshTokenSerializer(BaseAuthSerializerMixin): """Serializer for refresh token view""" refresh_token = serializers.CharField(write_only=True) class LoginByEmailSerializer(LoginSerializerMixin, serializers.ModelSerializer): """Serializer for signing up user by email""" email = serializers.EmailField(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 LogoutSerializer(BaseAuthSerializerMixin): """Serializer for logout""" # OAuth class OAuth2Serialzier(BaseAuthSerializerMixin): """Serializer OAuth2 authorization""" token = serializers.CharField(max_length=255)