/apps/users/serializers.py
https://gitlab.com/00KuX/clicoh · Python · 80 lines · 56 code · 23 blank · 1 comment · 2 complexity · 081c6ec15fe981bd48ab245b0ac5092b MD5 · raw file
- from django.contrib.auth import password_validation, authenticate
- from django.core.validators import RegexValidator, FileExtensionValidator
- from rest_framework import serializers
- from rest_framework.authtoken.models import Token
- from rest_framework.validators import UniqueValidator
- from apps.users.models import User
- class UserModelSerializer(serializers.ModelSerializer):
- class Meta:
- model = User
- fields = (
- 'username',
- 'first_name',
- 'last_name',
- 'email',
- )
- class UserLoginSerializer(serializers.Serializer):
- email = serializers.EmailField()
- password = serializers.CharField(min_length=8, max_length=64)
- def validate(self, data):
- user = authenticate(username=data['email'], password=data['password'])
- if not user:
- raise serializers.ValidationError('Las credenciales no son válidas')
- self.context['user'] = user
- return data
- def create(self, data):
- """Generar o recuperar token."""
- token, created = Token.objects.get_or_create(user=self.context['user'])
- return self.context['user'], token.key
- class UserSignUpSerializer(serializers.Serializer):
- email = serializers.EmailField(
- validators=[UniqueValidator(queryset=User.objects.all())]
- )
- username = serializers.CharField(
- min_length=4,
- max_length=20,
- validators=[UniqueValidator(queryset=User.objects.all())]
- )
-
- phone_regex = RegexValidator(
- regex=r'\+?1?\d{9,15}$',
- message="Debes introducir un número con el siguiente formato: +999999999. El límite son de 15 dígitos."
- )
- phone = serializers.CharField(validators=[phone_regex], required=False)
- password = serializers.CharField(min_length=8, max_length=64)
- password_confirmation = serializers.CharField(min_length=8, max_length=64)
- first_name = serializers.CharField(min_length=2, max_length=50)
- last_name = serializers.CharField(min_length=2, max_length=100)
- def validate(self, data):
- passwd = data['password']
- passwd_conf = data['password_confirmation']
- if passwd != passwd_conf:
- raise serializers.ValidationError("Las contraseñas no coinciden")
- password_validation.validate_password(passwd)
- return data
- def create(self, data):
- data.pop('password_confirmation')
- user = User.objects.create_user(**data)
- return user