"""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