mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2026-03-10 20:51:44 +00:00
2
.gitignore
vendored
2
.gitignore
vendored
@ -21,4 +21,4 @@ static/*
|
||||
__pycache__/
|
||||
*.env
|
||||
ve/*
|
||||
celerybeat-schedule
|
||||
celerybeat-schedule
|
||||
|
||||
@ -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
29
base/tasks.py
Normal 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
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user