mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2025-07-16 10:26:16 +00:00
jira-27 invite guardian api
This commit is contained in:
@ -80,7 +80,8 @@ ERROR_CODE = {
|
|||||||
# invalid junior id msg
|
# invalid junior id msg
|
||||||
"2047": "Invalid Junior ID ",
|
"2047": "Invalid Junior ID ",
|
||||||
"2048": "Choose right file for image",
|
"2048": "Choose right file for image",
|
||||||
"2049": "This task is already requested "
|
"2049": "This task is already requested ",
|
||||||
|
"2059": "Already exist junior"
|
||||||
}
|
}
|
||||||
"""Success message code"""
|
"""Success message code"""
|
||||||
SUCCESS_CODE = {
|
SUCCESS_CODE = {
|
||||||
@ -128,6 +129,7 @@ SUCCESS_CODE = {
|
|||||||
"3031": "Article Survey has been removed successfully.",
|
"3031": "Article Survey has been removed successfully.",
|
||||||
"3032": "Task request sent successfully",
|
"3032": "Task request sent successfully",
|
||||||
"3033": "Valid Referral code",
|
"3033": "Valid Referral code",
|
||||||
|
"3034": "Invite guardian successfully"
|
||||||
}
|
}
|
||||||
"""status code error"""
|
"""status code error"""
|
||||||
STATUS_CODE_ERROR = {
|
STATUS_CODE_ERROR = {
|
||||||
|
Binary file not shown.
@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 4.2.2 on 2023-07-24 13:21
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('guardian', '0016_juniortask_completed_on_juniortask_rejected_on_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='juniortask',
|
||||||
|
name='is_invited',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='juniortask',
|
||||||
|
name='is_password_set',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,21 @@
|
|||||||
|
# Generated by Django 4.2.2 on 2023-07-24 13:23
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('guardian', '0017_juniortask_is_invited_juniortask_is_password_set'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='juniortask',
|
||||||
|
name='is_invited',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='juniortask',
|
||||||
|
name='is_password_set',
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 4.2.2 on 2023-07-24 13:23
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('guardian', '0018_remove_juniortask_is_invited_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='guardian',
|
||||||
|
name='is_invited',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='guardian',
|
||||||
|
name='is_password_set',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
]
|
@ -53,6 +53,10 @@ class Guardian(models.Model):
|
|||||||
gender = models.CharField(choices=GENDERS, max_length=15, null=True, blank=True, default=None)
|
gender = models.CharField(choices=GENDERS, max_length=15, null=True, blank=True, default=None)
|
||||||
"""date of birth of the guardian"""
|
"""date of birth of the guardian"""
|
||||||
dob = models.DateField(max_length=15, null=True, blank=True, default=None)
|
dob = models.DateField(max_length=15, null=True, blank=True, default=None)
|
||||||
|
# invited junior"""
|
||||||
|
is_invited = models.BooleanField(default=False)
|
||||||
|
# Profile activity"""
|
||||||
|
is_password_set = models.BooleanField(default=True)
|
||||||
"""Profile activity"""
|
"""Profile activity"""
|
||||||
is_active = models.BooleanField(default=True)
|
is_active = models.BooleanField(default=True)
|
||||||
"""guardian is verified or not"""
|
"""guardian is verified or not"""
|
||||||
|
@ -17,7 +17,8 @@ from guardian.models import Guardian, JuniorTask
|
|||||||
from account.models import UserEmailOtp
|
from account.models import UserEmailOtp
|
||||||
from junior.utils import junior_notification_email, junior_approval_mail
|
from junior.utils import junior_notification_email, junior_approval_mail
|
||||||
from guardian.utils import real_time, update_referral_points
|
from guardian.utils import real_time, update_referral_points
|
||||||
|
from notifications.utils import send_notification
|
||||||
|
from notifications.constants import INVITED_GUARDIAN, APPROVED_JUNIOR
|
||||||
|
|
||||||
|
|
||||||
class ListCharField(serializers.ListField):
|
class ListCharField(serializers.ListField):
|
||||||
@ -272,7 +273,6 @@ class AddJuniorSerializer(serializers.ModelSerializer):
|
|||||||
user_data = User.objects.create(username=email, email=email,
|
user_data = User.objects.create(username=email, email=email,
|
||||||
first_name=self.context['first_name'],
|
first_name=self.context['first_name'],
|
||||||
last_name=self.context['last_name'])
|
last_name=self.context['last_name'])
|
||||||
|
|
||||||
password = User.objects.make_random_password()
|
password = User.objects.make_random_password()
|
||||||
user_data.set_password(password)
|
user_data.set_password(password)
|
||||||
user_data.save()
|
user_data.save()
|
||||||
@ -288,8 +288,6 @@ class AddJuniorSerializer(serializers.ModelSerializer):
|
|||||||
expiry_time = timezone.now() + timezone.timedelta(days=1)
|
expiry_time = timezone.now() + timezone.timedelta(days=1)
|
||||||
UserEmailOtp.objects.create(email=email, otp=otp_value,
|
UserEmailOtp.objects.create(email=email, otp=otp_value,
|
||||||
user_type='1', expired_at=expiry_time, is_verified=True)
|
user_type='1', expired_at=expiry_time, is_verified=True)
|
||||||
"""Send email to the register user"""
|
|
||||||
send_otp_email(email, otp_value)
|
|
||||||
"""Notification email"""
|
"""Notification email"""
|
||||||
junior_notification_email(email, full_name, email, password)
|
junior_notification_email(email, full_name, email, password)
|
||||||
junior_approval_mail(guardian, full_name)
|
junior_approval_mail(guardian, full_name)
|
||||||
@ -374,3 +372,59 @@ class JuniorPointsSerializer(serializers.ModelSerializer):
|
|||||||
model = Junior
|
model = Junior
|
||||||
fields = ['junior_id', 'total_points', 'position', 'pending_task', 'in_progress_task', 'completed_task',
|
fields = ['junior_id', 'total_points', 'position', 'pending_task', 'in_progress_task', 'completed_task',
|
||||||
'requested_task', 'rejected_task']
|
'requested_task', 'rejected_task']
|
||||||
|
|
||||||
|
class AddGuardianSerializer(serializers.ModelSerializer):
|
||||||
|
"""Add guardian serializer"""
|
||||||
|
auth_token = serializers.SerializerMethodField('get_auth_token')
|
||||||
|
|
||||||
|
def get_auth_token(self, obj):
|
||||||
|
"""auth token"""
|
||||||
|
refresh = RefreshToken.for_user(obj)
|
||||||
|
access_token = str(refresh.access_token)
|
||||||
|
return access_token
|
||||||
|
|
||||||
|
class Meta(object):
|
||||||
|
"""Meta info"""
|
||||||
|
model = Guardian
|
||||||
|
fields = ['id', 'auth_token']
|
||||||
|
|
||||||
|
|
||||||
|
def create(self, validated_data):
|
||||||
|
""" invite and create guardian"""
|
||||||
|
with transaction.atomic():
|
||||||
|
email = self.context['email']
|
||||||
|
junior = self.context['user']
|
||||||
|
full_name = self.context['first_name'] + ' ' + self.context['last_name']
|
||||||
|
junior_data = Junior.objects.filter(auth__username=junior).last()
|
||||||
|
instance = User.objects.filter(username=email).last()
|
||||||
|
if instance:
|
||||||
|
guardian_data = Guardian.objects.filter(user=user).update(is_invited=True,
|
||||||
|
referral_code=generate_code(ZOD,
|
||||||
|
instance.id),
|
||||||
|
referral_code_used=junior_data.referral_code,
|
||||||
|
is_verified=True)
|
||||||
|
return guardian_data
|
||||||
|
else:
|
||||||
|
user = User.objects.create(username=email, email=email,
|
||||||
|
first_name=self.context['first_name'],
|
||||||
|
last_name=self.context['last_name'])
|
||||||
|
|
||||||
|
password = User.objects.make_random_password()
|
||||||
|
user.set_password(password)
|
||||||
|
user.save()
|
||||||
|
Guardian.objects.create(user=user, is_invited=True,
|
||||||
|
referral_code=generate_code(ZOD, user.id),
|
||||||
|
referral_code_used=junior_data.referral_code,
|
||||||
|
is_password_set=False, is_verified=True)
|
||||||
|
"""Generate otp"""
|
||||||
|
otp_value = generate_otp()
|
||||||
|
expiry_time = timezone.now() + timezone.timedelta(days=1)
|
||||||
|
UserEmailOtp.objects.create(email=email, otp=otp_value,
|
||||||
|
user_type=str(NUMBER['two']), expired_at=expiry_time,
|
||||||
|
is_verified=True)
|
||||||
|
"""Notification email"""
|
||||||
|
junior_notification_email(email, full_name, email, password)
|
||||||
|
junior_approval_mail(email, full_name)
|
||||||
|
send_notification(INVITED_GUARDIAN, None, junior_data.auth.id, {})
|
||||||
|
send_notification(APPROVED_JUNIOR, None, email, {})
|
||||||
|
return instance
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from .views import (UpdateJuniorProfile, ValidateGuardianCode, JuniorListAPIView, AddJuniorAPIView,
|
from .views import (UpdateJuniorProfile, ValidateGuardianCode, JuniorListAPIView, AddJuniorAPIView,
|
||||||
InvitedJuniorAPIView, FilterJuniorAPIView, RemoveJuniorAPIView, JuniorTaskListAPIView,
|
InvitedJuniorAPIView, FilterJuniorAPIView, RemoveJuniorAPIView, JuniorTaskListAPIView,
|
||||||
CompleteJuniorTaskAPIView, JuniorPointsListAPIView, ValidateReferralCode)
|
CompleteJuniorTaskAPIView, JuniorPointsListAPIView, ValidateReferralCode,
|
||||||
|
InviteGuardianAPIView)
|
||||||
"""Third party import"""
|
"""Third party import"""
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
@ -38,6 +39,8 @@ router.register('junior-task-list', JuniorTaskListAPIView, basename='junior-task
|
|||||||
router.register('junior-points', JuniorPointsListAPIView, basename='junior-points')
|
router.register('junior-points', JuniorPointsListAPIView, basename='junior-points')
|
||||||
# validate referral code API"""
|
# validate referral code API"""
|
||||||
router.register('validate-referral-code', ValidateReferralCode, basename='validate-referral-code')
|
router.register('validate-referral-code', ValidateReferralCode, basename='validate-referral-code')
|
||||||
|
# invite guardian API"""
|
||||||
|
router.register('invite-guardian', InviteGuardianAPIView, basename='invite-guardian')
|
||||||
# Define url pattern"""
|
# Define url pattern"""
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('api/v1/', include(router.urls)),
|
path('api/v1/', include(router.urls)),
|
||||||
|
@ -4,6 +4,7 @@ import os
|
|||||||
from rest_framework import viewsets, status, generics,views
|
from rest_framework import viewsets, status, generics,views
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework.pagination import PageNumberPagination
|
from rest_framework.pagination import PageNumberPagination
|
||||||
|
from django.contrib.auth.models import User
|
||||||
import requests
|
import requests
|
||||||
"""Django app import"""
|
"""Django app import"""
|
||||||
|
|
||||||
@ -21,7 +22,8 @@ import requests
|
|||||||
# import junior serializer
|
# import junior serializer
|
||||||
from junior.models import Junior, JuniorPoints
|
from junior.models import Junior, JuniorPoints
|
||||||
from .serializers import (CreateJuniorSerializer, JuniorDetailListSerializer, AddJuniorSerializer,\
|
from .serializers import (CreateJuniorSerializer, JuniorDetailListSerializer, AddJuniorSerializer,\
|
||||||
RemoveJuniorSerializer, CompleteTaskSerializer, JuniorPointsSerializer)
|
RemoveJuniorSerializer, CompleteTaskSerializer, JuniorPointsSerializer,
|
||||||
|
AddGuardianSerializer)
|
||||||
from guardian.models import Guardian, JuniorTask
|
from guardian.models import Guardian, JuniorTask
|
||||||
from guardian.serializers import TaskDetailsSerializer
|
from guardian.serializers import TaskDetailsSerializer
|
||||||
from base.messages import ERROR_CODE, SUCCESS_CODE
|
from base.messages import ERROR_CODE, SUCCESS_CODE
|
||||||
@ -117,6 +119,9 @@ class AddJuniorAPIView(viewsets.ModelViewSet):
|
|||||||
""" junior list"""
|
""" junior list"""
|
||||||
info = {'user': request.user, 'email': request.data['email'], 'first_name': request.data['first_name'],
|
info = {'user': request.user, 'email': request.data['email'], 'first_name': request.data['first_name'],
|
||||||
'last_name': request.data['last_name']}
|
'last_name': request.data['last_name']}
|
||||||
|
if User.objects.filter(username=request.data['email']):
|
||||||
|
return custom_error_response(ERROR_CODE['2059'], response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
# use AddJuniorSerializer serializer
|
# use AddJuniorSerializer serializer
|
||||||
serializer = AddJuniorSerializer(data=request.data, context=info)
|
serializer = AddJuniorSerializer(data=request.data, context=info)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
@ -257,7 +262,7 @@ class CompleteJuniorTaskAPIView(views.APIView):
|
|||||||
task_queryset = JuniorTask.objects.filter(id=task_id, junior__auth__email=self.request.user).last()
|
task_queryset = JuniorTask.objects.filter(id=task_id, junior__auth__email=self.request.user).last()
|
||||||
if task_queryset:
|
if task_queryset:
|
||||||
# use CompleteTaskSerializer serializer
|
# use CompleteTaskSerializer serializer
|
||||||
if task_queryset.task_status in ['4', '5']:
|
if task_queryset.task_status in [str(NUMBER['four']), str(NUMBER['five'])]:
|
||||||
"""Already request send """
|
"""Already request send """
|
||||||
return custom_error_response(ERROR_CODE['2049'], response_status=status.HTTP_400_BAD_REQUEST)
|
return custom_error_response(ERROR_CODE['2049'], response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
serializer = CompleteTaskSerializer(task_queryset, data={'image': image_url}, partial=True)
|
serializer = CompleteTaskSerializer(task_queryset, data={'image': image_url}, partial=True)
|
||||||
@ -311,3 +316,20 @@ class ValidateReferralCode(viewsets.ViewSet):
|
|||||||
if self.get_queryset():
|
if self.get_queryset():
|
||||||
return custom_response(SUCCESS_CODE['3033'], response_status=status.HTTP_200_OK)
|
return custom_response(SUCCESS_CODE['3033'], response_status=status.HTTP_200_OK)
|
||||||
return custom_error_response(ERROR_CODE["2019"], response_status=status.HTTP_400_BAD_REQUEST)
|
return custom_error_response(ERROR_CODE["2019"], response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
class InviteGuardianAPIView(viewsets.ModelViewSet):
|
||||||
|
"""Invite guardian by junior"""
|
||||||
|
serializer_class = AddGuardianSerializer
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
""" junior list"""
|
||||||
|
info = {'user': request.user, 'email': request.data['email'], 'first_name': request.data['first_name'],
|
||||||
|
'last_name': request.data['last_name']}
|
||||||
|
# use AddJuniorSerializer serializer
|
||||||
|
serializer = AddGuardianSerializer(data=request.data, context=info)
|
||||||
|
if serializer.is_valid():
|
||||||
|
# save serializer
|
||||||
|
serializer.save()
|
||||||
|
return custom_response(SUCCESS_CODE['3034'], serializer.data, response_status=status.HTTP_200_OK)
|
||||||
|
return custom_error_response(serializer.error, response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
@ -3,6 +3,8 @@ notification constants file
|
|||||||
"""
|
"""
|
||||||
REGISTRATION = 1
|
REGISTRATION = 1
|
||||||
TASK_CREATED = 2
|
TASK_CREATED = 2
|
||||||
|
INVITED_GUARDIAN = 3
|
||||||
|
APPROVED_JUNIOR = 4
|
||||||
TEST_NOTIFICATION = 99
|
TEST_NOTIFICATION = 99
|
||||||
|
|
||||||
NOTIFICATION_DICT = {
|
NOTIFICATION_DICT = {
|
||||||
@ -14,6 +16,14 @@ NOTIFICATION_DICT = {
|
|||||||
"title": "Task created!",
|
"title": "Task created!",
|
||||||
"body": "Task created successfully."
|
"body": "Task created successfully."
|
||||||
},
|
},
|
||||||
|
INVITED_GUARDIAN: {
|
||||||
|
"title": "Invite guardian",
|
||||||
|
"body": "Invite guardian successfully"
|
||||||
|
},
|
||||||
|
APPROVED_JUNIOR: {
|
||||||
|
"title": "Approve junior",
|
||||||
|
"body": "You have request for associate the junior"
|
||||||
|
},
|
||||||
TEST_NOTIFICATION: {
|
TEST_NOTIFICATION: {
|
||||||
"title": "Test Notification",
|
"title": "Test Notification",
|
||||||
"body": "This notification is for testing purpose"
|
"body": "This notification is for testing purpose"
|
||||||
|
Reference in New Issue
Block a user