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

82 lines
2.9 KiB
Python

"""Serializers for application authorization"""
from rest_framework import serializers
from rest_framework.authentication import authenticate
from rest_framework import validators as rest_validators
from account import models as account_models
from django.contrib.auth import password_validation as password_validators
from django.utils.translation import gettext_lazy as _
class AuthTokenClassicSerializer(serializers.Serializer):
username = serializers.CharField(
label=_('Username'),
required=False
)
password = serializers.CharField(
label=_("Password"),
style={'input_type': 'password'},
trim_whitespace=False
)
email = serializers.EmailField(
label=_("Email"),
required=False
)
def validate(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
email = attrs.get('email')
if username and password:
user = authenticate(request=self.context.get('request'),
username=username, password=password)
elif email and password:
user = authenticate(request=self.context.get('request'),
email=email, password=password)
else:
msg = _('Must include "phone" and "password".')
raise serializers.ValidationError(msg, code='authorization')
if user:
# From Django 1.10 onwards the `authenticate` call simply
# returns `None` for is_active=False users.
# (Assuming the default `ModelBackend` authentication backend.)
if not user.is_active:
msg = _('User account is disabled.')
raise serializers.ValidationError(msg, code='authorization')
attrs['user'] = user
return attrs
class SignUpSerializer(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')
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