from django.contrib.auth.password_validation import validate_password as django_validate_password from django.core.exceptions import ValidationError from rest_framework import serializers from apps.user.models import User from apps.tasks import send_email class RegisterSerializer(serializers.ModelSerializer): class Meta: model = User fields = ["username", "email", "password"] extra_kwargs = { "password": {"write_only": True} } def validate_email(self, value): if User.objects.filter(email=value).exists(): raise serializers.ValidationError("Email already taken") return value def validate_password(self, value): try: django_validate_password(value) except ValidationError as error: raise serializers.ValidationError(error.messages) return value def create(self, validated_data): user = User.objects.create_user( validated_data["username"], validated_data["email"], validated_data["password"] ) send_email.delay(user.pk) return user