from rest_framework import serializers from django.contrib.auth import get_user_model from .models import ResetOTP import random from django.core.mail import EmailMessage, EmailMultiAlternatives, message, get_connection import uuid User = get_user_model() import MNF.settings as settings class PasswordResetEmailSerializer(serializers.Serializer): email = serializers.EmailField(max_length=255) class Meta: fields = ['email'] def recovery_code(self): while True: random_number = random.randint(1000, 9999) if 1000 <= random_number <= 9999: if ResetOTP.objects.filter(otp=random_number).exists(): continue return random_number def recovery_uuid(self): while True: uid = uuid.uuid4() if ResetOTP.objects.filter(uid=uid).exists(): continue return uid def validate(self, attrs): email = attrs.get('email') user = None otp_obj = None if User.objects.filter(username=email): user = User.objects.get(username=email) if User.objects.filter(email=email): user = User.objects.get(email=email) else: raise serializers.ValidationError('You are not a Registered User') if ResetOTP.objects.filter(user=user): print('otp objects found') otp_obj = ResetOTP.objects.filter(user=user).first() else: print('otp objects not found') otp_obj = ResetOTP(user=user) otp_obj.otp = self.recovery_code() otp_obj.uid =self.recovery_uuid() otp_obj.save() connection = get_connection( host=settings.smtp_host, port=settings.smtp_port, username=settings.smtp_username, password=settings.smtp_password, use_tls=True ) mail_subject = 'Reset your MNF account password!' message = f"Hi,\n\nWe've received your request to reset your password. Your one time password is {otp_obj.otp}" email_sender = EmailMessage(mail_subject, message, to=[email], connection=connection) email_sender = email_sender.send() return attrs class VerifyEmailSerializer(serializers.Serializer): code = serializers.CharField(required=True) class PasswordResetSerializer(serializers.Serializer): token = serializers.CharField(required=True, max_length=255) password = serializers.CharField( max_length=255, style={'input_type': 'password'}) class Meta: fields = ['token', 'password']