""" web_admin auth serializers file """ # python imports from datetime import datetime # django imports from rest_framework import serializers from django.contrib.auth import get_user_model from django.utils import timezone # local imports from account.models import UserEmailOtp from base.constants import USER_TYPE from base.messages import ERROR_CODE from guardian.tasks import generate_otp from base.tasks import send_mail USER = get_user_model() class AdminOTPSerializer(serializers.ModelSerializer): """ admin forgot password serializer """ email = serializers.EmailField() class Meta: """ meta class """ model = USER fields = ('email',) def validate(self, attrs): """ used to validate the incoming data """ user = USER.objects.filter(email=attrs.get('email')).first() if not user: raise serializers.ValidationError({'details': ERROR_CODE['2004']}) elif not user.is_superuser: raise serializers.ValidationError({'details': ERROR_CODE['2063']}) attrs.update({'user': user}) return attrs def create(self, validated_data): """ to send otp :return: user_data """ email = validated_data['email'] verification_code = generate_otp() template = 'email_reset_verification.email' # Send the verification code to the user's email data = { "verification_code": verification_code } send_mail.delay([email], template, data) expiry = timezone.now() + timezone.timedelta(days=1) user_data, created = UserEmailOtp.objects.update_or_create(email=email, defaults={ "otp": verification_code, "expired_at": expiry, "user_type": dict(USER_TYPE).get('3'), }) return user_data class AdminVerifyOTPSerializer(serializers.Serializer): """ admin verify otp serializer """ email = serializers.EmailField() otp = serializers.CharField(max_length=6, min_length=6) class Meta: """ meta class """ fields = ('email', 'otp',) def validate(self, attrs): """ to validate data :return: validated data """ email = attrs.get('email') otp = attrs.get('otp') # fetch email otp object of the user user_otp_details = UserEmailOtp.objects.filter(email=email, otp=otp).last() if not user_otp_details: raise serializers.ValidationError({'details': ERROR_CODE['2008']}) if user_otp_details.user_type != dict(USER_TYPE).get('3'): raise serializers.ValidationError({'details': ERROR_CODE['2008']}) if user_otp_details.expired_at.replace(tzinfo=None) < datetime.utcnow(): raise serializers.ValidationError({'details': ERROR_CODE['2029']}) user_otp_details.is_verified = True user_otp_details.save() return attrs class AdminCreatePasswordSerializer(serializers.ModelSerializer): """ admin create new password serializer """ email = serializers.EmailField() new_password = serializers.CharField() confirm_password = serializers.CharField() class Meta: """ meta class """ model = USER fields = ('email', 'new_password', 'confirm_password') def validate(self, attrs): """ to validate data :return: validated data """ email = attrs.get('email') new_password = attrs.get('new_password') confirm_password = attrs.get('confirm_password') # matching password if new_password != confirm_password: raise serializers.ValidationError({'details': ERROR_CODE['2065']}) user_otp_details = UserEmailOtp.objects.filter(email=email, is_verified=True).last() if not user_otp_details: raise serializers.ValidationError({'details': ERROR_CODE['2064']}) if user_otp_details.user_type != dict(USER_TYPE).get('3'): raise serializers.ValidationError({'details': ERROR_CODE['2063']}) user_otp_details.delete() return attrs