from django.db import transaction from rest_framework import serializers from core.apps.accounts.models import User from core.apps.accounts.cache import get_user_credentials, get_user_confirmation_code class RegisterSerializer(serializers.Serializer): passport_id = serializers.CharField() pnfl = serializers.CharField() email = serializers.EmailField() password = serializers.CharField() def validate_email(self, value): if User.objects.filter(email=value).exists(): raise serializers.ValidationError("User with this email already exists") user_data = get_user_credentials(email=value) if user_data: raise serializers.ValidationError("User with this email already exists") return value class ConfirmUserSerializer(serializers.Serializer): email = serializers.EmailField() code = serializers.IntegerField() def validate(self, data): if User.objects.filter(email=data['email']).exists(): raise serializers.ValidationError('User with this email already exists') user_data = get_user_credentials(email=data.get('email')) print(user_data) if not user_data: raise serializers.ValidationError("User with this email not found") confirm_data = get_user_confirmation_code(data['email'], data['code']) if not confirm_data: raise serializers.ValidationError("Invalid confirmation code") data['user_data'] = user_data return data def create(self, validated_data): with transaction.atomic(): user_data = validated_data.get('user_data') user = User.objects.create( email=user_data.get('email'), passport_id=user_data.get('passport_id'), pnfl=user_data.get('pnfl'), ) user.set_password(user_data.get('password')) user.save() return user