gault-millau/apps/authorization/serializers/common.py

68 lines
2.1 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 authorization.models import Application
# Mixins
class BaseAuthSerializerMixin(serializers.Serializer):
"""Base authorization serializer mixin"""
source = serializers.ChoiceField(choices=Application.SOURCES)
# Classic
class SignUpSerializer(BaseAuthSerializerMixin, serializers.ModelSerializer):
"""Serializer for signing up user"""
email = serializers.CharField(
validators=(rest_validators.UniqueValidator(queryset=account_models.User.objects.all()), ),
write_only=True
)
username = serializers.CharField(
validators=(rest_validators.UniqueValidator(queryset=account_models.User.objects.all()), ),
write_only=True
)
password = serializers.CharField(write_only=True)
newsletter = serializers.BooleanField()
class Meta:
"""Meta-class"""
model = account_models.User
fields = ('email', '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)