Merge pull request #124 from KiwiTechLLC/dev

merging dev into qa
This commit is contained in:
Abu Talib
2023-07-27 22:04:51 +05:30
committed by GitHub
6 changed files with 68 additions and 45 deletions

2
.gitignore vendored
View File

@ -21,4 +21,4 @@ static/*
__pycache__/
*.env
ve/*
celerybeat-schedule
celerybeat-schedule

View File

@ -90,7 +90,8 @@ ERROR_CODE = {
# email not null
"2062": "Please enter email address",
"2063": "Unauthorized access.",
"2064": "To change your password first request an OTP and get it verify then change your password."
"2064": "To change your password first request an OTP and get it verify then change your password.",
"2065": "Passwords do not match. Please try again."
}
"""Success message code"""
SUCCESS_CODE = {

29
base/tasks.py Normal file
View File

@ -0,0 +1,29 @@
"""
web_admin tasks file
"""
# third party imports
from celery import shared_task
from templated_email import send_templated_mail
# django imports
from django.conf import settings
@shared_task
def send_email_otp(email, verification_code):
"""
used to send otp on email
:param email: e-mail
:param verification_code: otp
"""
from_email = settings.EMAIL_FROM_ADDRESS
recipient_list = [email]
send_templated_mail(
template_name='email_reset_verification.email',
from_email=from_email,
recipient_list=recipient_list,
context={
'verification_code': verification_code
}
)
return True

View File

@ -99,7 +99,7 @@ def update_expired_task_status(data=None):
Update task of the status if due date is in past
"""
try:
task_status = [str(NUMBER['one']), str(NUMBER['two'])]
task_status = [str(NUMBER['one']), str(NUMBER['two']), str(NUMBER['four'])]
JuniorTask.objects.filter(due_date__lt=datetime.today().date(),
task_status__in=task_status).update(task_status=str(NUMBER['six']))
except ObjectDoesNotExist as e:

View File

@ -7,15 +7,14 @@ from datetime import datetime
# django imports
from rest_framework import serializers
from django.contrib.auth import get_user_model
from django.conf import settings
from django.utils import timezone
from templated_email import send_templated_mail
# 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_email_otp
USER = get_user_model()
@ -37,9 +36,9 @@ class AdminOTPSerializer(serializers.ModelSerializer):
""" used to validate the incoming data """
user = USER.objects.filter(email=attrs.get('email')).first()
if not user:
raise serializers.ValidationError(ERROR_CODE['2004'])
raise serializers.ValidationError({'details': ERROR_CODE['2004']})
elif not user.is_superuser:
raise serializers.ValidationError(ERROR_CODE['2063'])
raise serializers.ValidationError({'details': ERROR_CODE['2063']})
attrs.update({'user': user})
return attrs
@ -53,26 +52,16 @@ class AdminOTPSerializer(serializers.ModelSerializer):
verification_code = generate_otp()
# Send the verification code to the user's email
from_email = settings.EMAIL_FROM_ADDRESS
recipient_list = [email]
send_templated_mail(
template_name='email_reset_verification.email',
from_email=from_email,
recipient_list=recipient_list,
context={
'verification_code': verification_code
}
)
send_email_otp.delay(email, verification_code)
expiry = timezone.now() + timezone.timedelta(days=1)
user_data, created = UserEmailOtp.objects.get_or_create(email=email)
if created:
user_data.expired_at = expiry
user_data.user_type = dict(USER_TYPE).get('3')
if user_data:
user_data.otp = verification_code
user_data.expired_at = expiry
user_data.user_type = dict(USER_TYPE).get('3')
user_data.save()
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
@ -98,11 +87,11 @@ class AdminVerifyOTPSerializer(serializers.Serializer):
# 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(ERROR_CODE['2064'])
raise serializers.ValidationError({'details': ERROR_CODE['2064']})
if user_otp_details.user_type != dict(USER_TYPE).get('3'):
raise serializers.ValidationError(ERROR_CODE['2063'])
raise serializers.ValidationError({'details': ERROR_CODE['2063']})
if user_otp_details.expired_at.replace(tzinfo=None) < datetime.utcnow():
raise serializers.ValidationError(ERROR_CODE['2029'])
raise serializers.ValidationError({'details': ERROR_CODE['2029']})
user_otp_details.is_verified = True
user_otp_details.save()
return attrs
@ -134,14 +123,14 @@ class AdminCreatePasswordSerializer(serializers.ModelSerializer):
# matching password
if new_password != confirm_password:
raise serializers.ValidationError('password do not match')
raise serializers.ValidationError({'details': ERROR_CODE['2065']})
user_otp_details = UserEmailOtp.objects.filter(email=email).last()
if not user_otp_details:
raise serializers.ValidationError(ERROR_CODE['2064'])
raise serializers.ValidationError({'details': ERROR_CODE['2064']})
if user_otp_details.user_type != dict(USER_TYPE).get('3'):
raise serializers.ValidationError(ERROR_CODE['2063'])
raise serializers.ValidationError({'details': ERROR_CODE['2063']})
if not user_otp_details.is_verified:
raise serializers.ValidationError(ERROR_CODE['2064'])
raise serializers.ValidationError({'details': ERROR_CODE['2064']})
user_otp_details.delete()
return attrs

View File

@ -4,11 +4,12 @@ web_admin auth views file
# django imports
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
from rest_framework import status
from django.contrib.auth import get_user_model
# local imports
from account.utils import custom_response
from base.messages import SUCCESS_CODE
from account.utils import custom_response, custom_error_response
from base.messages import SUCCESS_CODE, ERROR_CODE
from web_admin.serializers.auth_serializer import (AdminOTPSerializer, AdminVerifyOTPSerializer,
AdminCreatePasswordSerializer)
@ -29,9 +30,10 @@ class ForgotAndResetPasswordViewSet(GenericViewSet):
:return: success message
"""
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return custom_response(SUCCESS_CODE['3015'])
if serializer.is_valid():
serializer.save()
return custom_response(SUCCESS_CODE['3015'])
return custom_error_response(ERROR_CODE['2063'], status.HTTP_400_BAD_REQUEST)
@action(methods=['post'], url_name='verify-otp', url_path='verify-otp',
detail=False, serializer_class=AdminVerifyOTPSerializer)
@ -41,8 +43,9 @@ class ForgotAndResetPasswordViewSet(GenericViewSet):
:return: success message
"""
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
return custom_response(SUCCESS_CODE['3011'])
if serializer.is_valid():
return custom_response(SUCCESS_CODE['3011'])
return custom_error_response(ERROR_CODE['2063'], status.HTTP_400_BAD_REQUEST)
@action(methods=['post'], url_name='create-password', url_path='create-password',
detail=False, serializer_class=AdminCreatePasswordSerializer)
@ -52,8 +55,9 @@ class ForgotAndResetPasswordViewSet(GenericViewSet):
:return: success message
"""
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
user = USER.objects.filter(email=serializer.validated_data.get('email')).first()
user.set_password(serializer.validated_data.get('new_password'))
user.save()
return custom_response(SUCCESS_CODE['3007'])
if serializer.is_valid():
user = USER.objects.filter(email=serializer.validated_data.get('email')).first()
user.set_password(serializer.validated_data.get('new_password'))
user.save()
return custom_response(SUCCESS_CODE['3007'])
return custom_error_response(ERROR_CODE['2064'], status.HTTP_400_BAD_REQUEST)