82 lines
2.9 KiB
Python
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
|