/apps/users/serializers.py

https://gitlab.com/00KuX/clicoh · Python · 80 lines · 56 code · 23 blank · 1 comment · 2 complexity · 081c6ec15fe981bd48ab245b0ac5092b MD5 · raw file

  1. from django.contrib.auth import password_validation, authenticate
  2. from django.core.validators import RegexValidator, FileExtensionValidator
  3. from rest_framework import serializers
  4. from rest_framework.authtoken.models import Token
  5. from rest_framework.validators import UniqueValidator
  6. from apps.users.models import User
  7. class UserModelSerializer(serializers.ModelSerializer):
  8. class Meta:
  9. model = User
  10. fields = (
  11. 'username',
  12. 'first_name',
  13. 'last_name',
  14. 'email',
  15. )
  16. class UserLoginSerializer(serializers.Serializer):
  17. email = serializers.EmailField()
  18. password = serializers.CharField(min_length=8, max_length=64)
  19. def validate(self, data):
  20. user = authenticate(username=data['email'], password=data['password'])
  21. if not user:
  22. raise serializers.ValidationError('Las credenciales no son válidas')
  23. self.context['user'] = user
  24. return data
  25. def create(self, data):
  26. """Generar o recuperar token."""
  27. token, created = Token.objects.get_or_create(user=self.context['user'])
  28. return self.context['user'], token.key
  29. class UserSignUpSerializer(serializers.Serializer):
  30. email = serializers.EmailField(
  31. validators=[UniqueValidator(queryset=User.objects.all())]
  32. )
  33. username = serializers.CharField(
  34. min_length=4,
  35. max_length=20,
  36. validators=[UniqueValidator(queryset=User.objects.all())]
  37. )
  38. phone_regex = RegexValidator(
  39. regex=r'\+?1?\d{9,15}$',
  40. message="Debes introducir un número con el siguiente formato: +999999999. El límite son de 15 dígitos."
  41. )
  42. phone = serializers.CharField(validators=[phone_regex], required=False)
  43. password = serializers.CharField(min_length=8, max_length=64)
  44. password_confirmation = serializers.CharField(min_length=8, max_length=64)
  45. first_name = serializers.CharField(min_length=2, max_length=50)
  46. last_name = serializers.CharField(min_length=2, max_length=100)
  47. def validate(self, data):
  48. passwd = data['password']
  49. passwd_conf = data['password_confirmation']
  50. if passwd != passwd_conf:
  51. raise serializers.ValidationError("Las contraseñas no coinciden")
  52. password_validation.validate_password(passwd)
  53. return data
  54. def create(self, data):
  55. data.pop('password_confirmation')
  56. user = User.objects.create_user(**data)
  57. return user