Files
zod-backend/web_admin/serializers/auth_serializer.py
2023-08-24 13:33:34 +05:30

137 lines
4.4 KiB
Python

"""
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