mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2026-03-10 22:41:45 +00:00
Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c9ee482512 | |||
| 10a1ea9b76 | |||
| f3e2ab9a34 | |||
| 685f627707 | |||
| ceb5bc13c3 | |||
| ae0fc4fe8d | |||
| 0a1b9c7e70 | |||
| f2cf1488e9 | |||
| 0426974539 | |||
| b0e26f41b9 | |||
| c20249730a | |||
| b3b499e661 | |||
| f377e283fd | |||
| 648a2ec4d5 | |||
| 83ec922584 | |||
| 88221ec77a | |||
| e853346910 | |||
| a088764b7b | |||
| 4a2f36cde8 | |||
| 401ee1ddf8 | |||
| baacb1a18f | |||
| 5f1c645e3a | |||
| 79648637aa | |||
| 756bea0471 | |||
| 465632f519 | |||
| b9e2d9bc8a | |||
| d82c8cd4ae | |||
| dd0f2b027a | |||
| 3806d1f3a6 | |||
| b2d172eae5 | |||
| 404825dc85 | |||
| 6e6f0a55d0 | |||
| 75d0b12008 | |||
| 2a4011ca5d | |||
| ebb468166e | |||
| 06176912ee | |||
| ed8fc156ac | |||
| bff97f59b2 | |||
| 4c3aa03e13 | |||
| f3a8b52617 | |||
| 0c3a77cd11 | |||
| 329df77790 |
@ -137,6 +137,37 @@ class ForgotPasswordSerializer(serializers.Serializer):
|
||||
"""Forget password serializer"""
|
||||
email = serializers.EmailField()
|
||||
|
||||
|
||||
class AdminLoginSerializer(serializers.ModelSerializer):
|
||||
"""admin login serializer"""
|
||||
email = serializers.EmailField(required=True)
|
||||
password = serializers.CharField(required=True)
|
||||
|
||||
class Meta:
|
||||
"""
|
||||
meta class
|
||||
"""
|
||||
model = User
|
||||
fields = ('email', 'password')
|
||||
|
||||
def validate(self, attrs):
|
||||
user = User.objects.filter(email__iexact=attrs['email'], is_superuser=True
|
||||
).only('id', 'first_name', 'last_name', 'email', 'is_superuser').first()
|
||||
|
||||
if not user:
|
||||
raise serializers.ValidationError({'details': ERROR_CODE['2002']})
|
||||
elif not user.check_password(attrs['password']):
|
||||
raise serializers.ValidationError({'details': ERROR_CODE['2002']})
|
||||
self.context.update({'user': user})
|
||||
return attrs
|
||||
|
||||
def create(self, validated_data):
|
||||
"""
|
||||
used to return the user object after validation
|
||||
"""
|
||||
return self.context['user']
|
||||
|
||||
|
||||
class SuperUserSerializer(serializers.ModelSerializer):
|
||||
"""Super admin serializer"""
|
||||
user_type = serializers.SerializerMethodField('get_user_type')
|
||||
|
||||
@ -28,14 +28,15 @@ from .views import (UserLogin, SendPhoneOtp, UserPhoneVerification, UserEmailVer
|
||||
ForgotPasswordAPIView, ResetPasswordAPIView, ChangePasswordAPIView, UpdateProfileImage,
|
||||
GoogleLoginViewSet, SigninWithApple, ProfileAPIViewSet, UploadImageAPIViewSet,
|
||||
DefaultImageAPIViewSet, DeleteUserProfileAPIViewSet, UserNotificationAPIViewSet,
|
||||
UpdateUserNotificationAPIViewSet, SendSupportEmail, LogoutAPIView, AccessTokenAPIView)
|
||||
UpdateUserNotificationAPIViewSet, SendSupportEmail, LogoutAPIView, AccessTokenAPIView,
|
||||
AdminLoginViewSet)
|
||||
"""Router"""
|
||||
router = routers.SimpleRouter()
|
||||
|
||||
"""API End points with router"""
|
||||
router.register('user', UserLogin, basename='user')
|
||||
"""super admin login"""
|
||||
router.register('admin', UserLogin, basename='admin')
|
||||
router.register('admin', AdminLoginViewSet, basename='admin')
|
||||
"""google login end point"""
|
||||
router.register('google-login', GoogleLoginViewSet, basename='admin')
|
||||
router.register('send-phone-otp', SendPhoneOtp, basename='send-phone-otp')
|
||||
|
||||
@ -138,12 +138,14 @@ def send_support_email(name, sender, subject, message):
|
||||
}
|
||||
)
|
||||
return name
|
||||
def custom_response(detail, data=None, response_status=status.HTTP_200_OK):
|
||||
|
||||
|
||||
def custom_response(detail, data=None, response_status=status.HTTP_200_OK, count=None):
|
||||
"""Custom response code"""
|
||||
if not data:
|
||||
"""when data is none"""
|
||||
data = None
|
||||
return Response({"data": data, "message": detail, "status": "success", "code": response_status})
|
||||
return Response({"data": data, "message": detail, "status": "success", "code": response_status, "count": count})
|
||||
|
||||
|
||||
def custom_error_response(detail, response_status):
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
"""Account view """
|
||||
from notifications.utils import remove_fcm_token
|
||||
|
||||
"""Django import"""
|
||||
# django imports
|
||||
from datetime import datetime, timedelta
|
||||
from rest_framework import viewsets, status, views
|
||||
from rest_framework.decorators import action
|
||||
@ -18,19 +18,21 @@ import google.auth.transport.requests
|
||||
from rest_framework import status
|
||||
import requests
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import mixins
|
||||
from django.conf import settings
|
||||
"""App Import"""
|
||||
|
||||
# local imports
|
||||
from guardian.models import Guardian
|
||||
from junior.models import Junior
|
||||
from guardian.utils import upload_image_to_alibaba
|
||||
from account.models import UserDeviceDetails, UserPhoneOtp, UserEmailOtp, DefaultTaskImages, UserNotification
|
||||
from django.contrib.auth.models import User
|
||||
"""Account serializer"""
|
||||
from .serializers import (SuperUserSerializer, GuardianSerializer, JuniorSerializer, EmailVerificationSerializer,
|
||||
ForgotPasswordSerializer, ResetPasswordSerializer, ChangePasswordSerializer,
|
||||
GoogleLoginSerializer, UpdateGuardianImageSerializer, UpdateJuniorProfileImageSerializer,
|
||||
DefaultTaskImagesSerializer, DefaultTaskImagesDetailsSerializer, UserDeleteSerializer,
|
||||
UserNotificationSerializer, UpdateUserNotificationSerializer, UserPhoneOtpSerializer)
|
||||
UserNotificationSerializer, UpdateUserNotificationSerializer, UserPhoneOtpSerializer,
|
||||
AdminLoginSerializer)
|
||||
from rest_framework_simplejwt.tokens import RefreshToken
|
||||
from base.messages import ERROR_CODE, SUCCESS_CODE
|
||||
from base.constants import NUMBER, ZOD, JUN, GRD
|
||||
@ -327,24 +329,42 @@ class UserLogin(viewsets.ViewSet):
|
||||
|
||||
@action(methods=['post'], detail=False)
|
||||
def admin_login(self, request):
|
||||
username = request.data.get('username')
|
||||
email = request.data.get('email')
|
||||
password = request.data.get('password')
|
||||
user = authenticate(request, username=username, password=password)
|
||||
try:
|
||||
if user is not None:
|
||||
login(request, user)
|
||||
if user.is_superuser:
|
||||
serializer = SuperUserSerializer(user)
|
||||
return custom_response(SUCCESS_CODE['3003'], serializer.data, response_status=status.HTTP_200_OK)
|
||||
else:
|
||||
return custom_error_response(ERROR_CODE["2002"], response_status=status.HTTP_401_UNAUTHORIZED)
|
||||
except Exception as e:
|
||||
logging.error(e)
|
||||
refresh = RefreshToken.for_user(user)
|
||||
access_token = str(refresh.access_token)
|
||||
refresh_token = str(refresh)
|
||||
data = {"auth_token": access_token, "refresh_token":refresh_token, "user_type": '3'}
|
||||
return custom_response(None, data, response_status=status.HTTP_200_OK)
|
||||
user = User.objects.filter(email__iexact=email, is_superuser=True
|
||||
).only('id', 'first_name', 'last_name', 'email', 'is_superuser').first()
|
||||
|
||||
if not user:
|
||||
return custom_error_response(ERROR_CODE["2002"], response_status=status.HTTP_400_BAD_REQUEST)
|
||||
elif not user.check_password(password):
|
||||
return custom_error_response(ERROR_CODE["2002"], response_status=status.HTTP_400_BAD_REQUEST)
|
||||
serializer = SuperUserSerializer(user)
|
||||
return custom_response(SUCCESS_CODE['3003'], serializer.data, response_status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class AdminLoginViewSet(viewsets.GenericViewSet):
|
||||
"""
|
||||
admin login api
|
||||
"""
|
||||
serializer_class = AdminLoginSerializer
|
||||
|
||||
@action(methods=['post'], url_name='login', url_path='login', detail=False)
|
||||
def admin_login(self, request, *args, **kwargs):
|
||||
"""
|
||||
:param request:
|
||||
:return:
|
||||
"""
|
||||
serializer = self.serializer_class(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
user = serializer.save()
|
||||
refresh = RefreshToken.for_user(user)
|
||||
access_token = str(refresh.access_token)
|
||||
refresh_token = str(refresh)
|
||||
data = {"auth_token": access_token, "refresh_token": refresh_token, "username": user.username,
|
||||
"email": user.email, "first_name": user.first_name, "last_name": user.last_name,
|
||||
"is_active": user.is_active, "user_type": '3', "is_superuser": user.is_superuser}
|
||||
return custom_response(None, data)
|
||||
|
||||
|
||||
class UserEmailVerification(viewsets.ModelViewSet):
|
||||
"""User Email verification"""
|
||||
|
||||
@ -83,6 +83,7 @@ IN_PROGRESS = 2
|
||||
REJECTED = 3
|
||||
REQUESTED = 4
|
||||
COMPLETED = 5
|
||||
EXPIRED = 6
|
||||
TASK_POINTS = 5
|
||||
# duplicate name used defined in constant PROJECT_NAME
|
||||
PROJECT_NAME = 'Zod Bank'
|
||||
|
||||
@ -23,15 +23,15 @@ ERROR_CODE_REQUIRED = {
|
||||
|
||||
# Error code
|
||||
ERROR_CODE = {
|
||||
"2000": "Email not found.",
|
||||
"2000": "Invalid email address. Please enter a registered email.",
|
||||
"2001": "This is your existing password. Please choose other one",
|
||||
"2002": "Invalid login credentials.",
|
||||
"2002": "Invalid username or password.",
|
||||
"2003": "An account already exists with this email address.",
|
||||
"2004": "User not found.",
|
||||
"2005": "Your account has been activated.",
|
||||
"2006": "Your account is not activated.",
|
||||
"2007": "Your account already activated.",
|
||||
"2008": "Invalid OTP.",
|
||||
"2008": "The OTP entered is not correct.",
|
||||
"2009": "The user provided cannot be found or the reset password token has become invalid/timed out.",
|
||||
"2010": "Invalid Link.",
|
||||
"2011": "Your profile has not been completed yet.",
|
||||
@ -54,7 +54,7 @@ ERROR_CODE = {
|
||||
"2026": "New password should not same as old password",
|
||||
"2027": "data should contain `identityToken`",
|
||||
"2028": "You are not authorized person to sign up on this platform",
|
||||
"2029": "Validity of otp verification is expired",
|
||||
"2029": "Validity of otp verification has expired. Please request a new one.",
|
||||
"2030": "Use correct user type and token",
|
||||
# invalid password
|
||||
"2031": "Invalid password",
|
||||
@ -91,7 +91,11 @@ ERROR_CODE = {
|
||||
"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.",
|
||||
"2065": "Passwords do not match. Please try again."
|
||||
"2065": "Passwords do not match. Please try again.",
|
||||
"2066": "Task does not exist or not in expired state",
|
||||
"2067": "Action not allowed. User type missing.",
|
||||
"2068": "No guardian associated with this junior"
|
||||
|
||||
}
|
||||
"""Success message code"""
|
||||
SUCCESS_CODE = {
|
||||
@ -107,7 +111,7 @@ SUCCESS_CODE = {
|
||||
# Success code for link verified
|
||||
"3005": "Your account is deleted successfully.",
|
||||
# Success code for password reset
|
||||
"3006": "Your password has been reset successfully.",
|
||||
"3006": "Password reset successful. You can now log in with your new password.",
|
||||
# Success code for password update
|
||||
"3007": "Your password has been changed successfully.",
|
||||
# Success code for valid link
|
||||
@ -120,8 +124,8 @@ SUCCESS_CODE = {
|
||||
"3012": "Phone OTP Verified successfully",
|
||||
"3013": "Valid Guardian code",
|
||||
"3014": "Password has been updated successfully.",
|
||||
"3015": "Verification code sent on your email.",
|
||||
"3016": "Send otp on your Email successfully",
|
||||
"3015": "Verification code has been sent on your email.",
|
||||
"3016": "An OTP has been sent on your email.",
|
||||
"3017": "Profile image update successfully",
|
||||
"3018": "Task created successfully",
|
||||
"3019": "Support Email sent successfully",
|
||||
@ -140,7 +144,12 @@ SUCCESS_CODE = {
|
||||
"3032": "Task request sent successfully",
|
||||
"3033": "Valid Referral code",
|
||||
"3034": "Invite guardian successfully",
|
||||
"3035": "Task started successfully"
|
||||
"3035": "Task started successfully",
|
||||
"3036": "Task reassign successfully",
|
||||
"3037": "Profile has been updated successfully.",
|
||||
"3038": "Status has been changed successfully.",
|
||||
# notification read
|
||||
"3039": "Notification read successfully"
|
||||
}
|
||||
"""status code error"""
|
||||
STATUS_CODE_ERROR = {
|
||||
|
||||
Binary file not shown.
@ -1,5 +1,5 @@
|
||||
"""Serializer of Guardian"""
|
||||
"""Third party Django app"""
|
||||
# third party imports
|
||||
import logging
|
||||
from rest_framework import serializers
|
||||
# Import Refresh token of jwt
|
||||
@ -7,7 +7,8 @@ from rest_framework_simplejwt.tokens import RefreshToken
|
||||
from django.db import transaction
|
||||
from django.contrib.auth.models import User
|
||||
from datetime import datetime, time
|
||||
"""Import Django app"""
|
||||
import pytz
|
||||
from django.utils import timezone
|
||||
# Import guardian's model,
|
||||
# Import junior's model,
|
||||
# Import account's model,
|
||||
@ -16,14 +17,14 @@ from datetime import datetime, time
|
||||
# Import messages from
|
||||
# base package,
|
||||
# Import some functions
|
||||
# from utils file"""
|
||||
# local imports
|
||||
from .models import Guardian, JuniorTask
|
||||
from account.models import UserProfile, UserEmailOtp, UserNotification
|
||||
from account.utils import generate_code
|
||||
from junior.serializers import JuniorDetailSerializer
|
||||
from base.messages import ERROR_CODE, SUCCESS_CODE
|
||||
from base.constants import NUMBER, JUN, ZOD, GRD
|
||||
from junior.models import Junior, JuniorPoints
|
||||
from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship
|
||||
from .utils import real_time, convert_timedelta_into_datetime, update_referral_points
|
||||
# notification's constant
|
||||
from notifications.constants import TASK_POINTS, TASK_REJECTED
|
||||
@ -211,7 +212,7 @@ class GuardianDetailSerializer(serializers.ModelSerializer):
|
||||
"""Meta info"""
|
||||
model = Guardian
|
||||
fields = ['id', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'gender', 'dob',
|
||||
'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image',
|
||||
'guardian_code','is_active', 'is_complete_profile', 'created_at', 'image',
|
||||
'updated_at']
|
||||
class TaskDetailsSerializer(serializers.ModelSerializer):
|
||||
"""Task detail serializer"""
|
||||
@ -224,7 +225,10 @@ class TaskDetailsSerializer(serializers.ModelSerializer):
|
||||
""" remaining time to complete task"""
|
||||
due_date_datetime = datetime.combine(obj.due_date, datetime.max.time())
|
||||
# fetch real time
|
||||
current_datetime = real_time()
|
||||
# current_datetime = real_time()
|
||||
# new code
|
||||
due_date_datetime = due_date_datetime.astimezone(pytz.utc)
|
||||
current_datetime = timezone.now().astimezone(pytz.utc)
|
||||
# Perform the subtraction
|
||||
if due_date_datetime > current_datetime:
|
||||
time_difference = due_date_datetime - current_datetime
|
||||
@ -244,6 +248,34 @@ class TaskDetailsSerializer(serializers.ModelSerializer):
|
||||
'requested_on', 'rejected_on', 'completed_on', 'is_expired',
|
||||
'junior', 'task_status', 'is_active', 'remaining_time', 'created_at','updated_at']
|
||||
|
||||
class TaskDetailsjuniorSerializer(serializers.ModelSerializer):
|
||||
"""Task detail serializer"""
|
||||
|
||||
guardian = GuardianDetailSerializer()
|
||||
remaining_time = serializers.SerializerMethodField('get_remaining_time')
|
||||
|
||||
def get_remaining_time(self, obj):
|
||||
""" remaining time to complete task"""
|
||||
due_date_datetime = datetime.combine(obj.due_date, datetime.max.time())
|
||||
# fetch real time
|
||||
# current_datetime = real_time()
|
||||
# new code
|
||||
due_date_datetime = due_date_datetime.astimezone(pytz.utc)
|
||||
current_datetime = timezone.now().astimezone(pytz.utc)
|
||||
# Perform the subtraction
|
||||
if due_date_datetime > current_datetime:
|
||||
time_difference = due_date_datetime - current_datetime
|
||||
time_only = convert_timedelta_into_datetime(time_difference)
|
||||
return str(time_difference.days) + ' days ' + str(time_only)
|
||||
return str(NUMBER['zero']) + ' days ' + '00:00:00:00000'
|
||||
|
||||
|
||||
class Meta(object):
|
||||
"""Meta info"""
|
||||
model = JuniorTask
|
||||
fields = ['id', 'guardian', 'task_name', 'task_description', 'points', 'due_date','default_image', 'image',
|
||||
'requested_on', 'rejected_on', 'completed_on',
|
||||
'junior', 'task_status', 'is_active', 'remaining_time', 'created_at','updated_at']
|
||||
|
||||
class TopJuniorSerializer(serializers.ModelSerializer):
|
||||
"""Top junior serializer"""
|
||||
@ -320,7 +352,7 @@ class ApproveJuniorSerializer(serializers.ModelSerializer):
|
||||
"""update guardian code"""
|
||||
instance = self.context['junior']
|
||||
instance.guardian_code = [self.context['guardian_code']]
|
||||
instance.is_invited = True
|
||||
instance.guardian_code_approved = True
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
@ -346,7 +378,8 @@ class ApproveTaskSerializer(serializers.ModelSerializer):
|
||||
# update total task point
|
||||
junior_data.total_points = junior_data.total_points + instance.points
|
||||
# update complete time of task
|
||||
instance.completed_on = real_time()
|
||||
# instance.completed_on = real_time()
|
||||
instance.completed_on = timezone.now().astimezone(pytz.utc)
|
||||
send_notification.delay(TASK_POINTS, None, junior_details.auth.id, {})
|
||||
else:
|
||||
# reject the task
|
||||
@ -355,9 +388,43 @@ class ApproveTaskSerializer(serializers.ModelSerializer):
|
||||
# update total task point
|
||||
junior_data.total_points = junior_data.total_points - instance.points
|
||||
# update reject time of task
|
||||
instance.rejected_on = real_time()
|
||||
# instance.rejected_on = real_time()
|
||||
instance.rejected_on = timezone.now().astimezone(pytz.utc)
|
||||
send_notification.delay(TASK_REJECTED, None, junior_details.auth.id, {})
|
||||
instance.save()
|
||||
junior_data.save()
|
||||
return junior_details
|
||||
|
||||
class GuardianDetailListSerializer(serializers.ModelSerializer):
|
||||
"""Guardian serializer"""
|
||||
|
||||
first_name = serializers.SerializerMethodField('get_first_name')
|
||||
last_name = serializers.SerializerMethodField('get_last_name')
|
||||
email = serializers.SerializerMethodField('get_email')
|
||||
image = serializers.SerializerMethodField('get_image')
|
||||
guardian_id = serializers.SerializerMethodField('get_guardian_id')
|
||||
|
||||
class Meta(object):
|
||||
"""Meta info"""
|
||||
model = JuniorGuardianRelationship
|
||||
fields = ['guardian_id', 'first_name', 'last_name', 'email', 'relationship', 'image', 'created_at',
|
||||
'updated_at']
|
||||
|
||||
def get_guardian_id(self,obj):
|
||||
"""first name of guardian"""
|
||||
return obj.guardian.id
|
||||
def get_first_name(self,obj):
|
||||
"""first name of guardian"""
|
||||
return obj.guardian.user.first_name
|
||||
|
||||
def get_last_name(self,obj):
|
||||
"""last name of guardian"""
|
||||
return obj.guardian.user.last_name
|
||||
|
||||
def get_email(self,obj):
|
||||
"""emailof guardian"""
|
||||
return obj.guardian.user.email
|
||||
|
||||
def get_image(self,obj):
|
||||
"""first name of guardian"""
|
||||
return obj.guardian.image
|
||||
|
||||
@ -2,7 +2,8 @@
|
||||
"""Django import"""
|
||||
from django.urls import path, include
|
||||
from .views import (SignupViewset, UpdateGuardianProfile, AllTaskListAPIView, CreateTaskAPIView, TaskListAPIView,
|
||||
SearchTaskListAPIView, TopJuniorListAPIView, ApproveJuniorAPIView, ApproveTaskAPIView)
|
||||
SearchTaskListAPIView, TopJuniorListAPIView, ApproveJuniorAPIView, ApproveTaskAPIView,
|
||||
GuardianListAPIView)
|
||||
"""Third party import"""
|
||||
from rest_framework import routers
|
||||
|
||||
@ -36,6 +37,8 @@ router.register('filter-task', SearchTaskListAPIView, basename='filter-task')
|
||||
router.register('approve-junior', ApproveJuniorAPIView, basename='approve-junior')
|
||||
# Approve junior API"""
|
||||
router.register('approve-task', ApproveTaskAPIView, basename='approve-task')
|
||||
# guardian list API"""
|
||||
router.register('guardian-list', GuardianListAPIView, basename='guardian-list')
|
||||
# Define Url pattern"""
|
||||
urlpatterns = [
|
||||
path('api/v1/', include(router.urls)),
|
||||
|
||||
@ -41,7 +41,10 @@ def upload_image_to_alibaba(image, filename):
|
||||
# Save the image object to a temporary file
|
||||
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
|
||||
"""write image in temporary file"""
|
||||
temp_file.write(image.read())
|
||||
if type(image) == bytes:
|
||||
temp_file.write(image)
|
||||
else:
|
||||
temp_file.write(image.read())
|
||||
"""auth of bucket"""
|
||||
auth = oss2.Auth(settings.ALIYUN_OSS_ACCESS_KEY_ID, settings.ALIYUN_OSS_ACCESS_KEY_SECRET)
|
||||
"""fetch bucket details"""
|
||||
|
||||
@ -10,6 +10,8 @@ from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework import viewsets, status
|
||||
from rest_framework.pagination import PageNumberPagination
|
||||
from django.contrib.auth.models import User
|
||||
from rest_framework.filters import SearchFilter
|
||||
|
||||
from django.utils import timezone
|
||||
|
||||
# Import guardian's model,
|
||||
@ -26,9 +28,10 @@ from django.utils import timezone
|
||||
# Import notification constant
|
||||
# Import send_notification function
|
||||
from .serializers import (UserSerializer, CreateGuardianSerializer, TaskSerializer, TaskDetailsSerializer,
|
||||
TopJuniorSerializer, ApproveJuniorSerializer, ApproveTaskSerializer)
|
||||
TopJuniorSerializer, ApproveJuniorSerializer, ApproveTaskSerializer,
|
||||
GuardianDetailListSerializer)
|
||||
from .models import Guardian, JuniorTask
|
||||
from junior.models import Junior, JuniorPoints
|
||||
from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship
|
||||
from account.models import UserEmailOtp, UserNotification
|
||||
from .tasks import generate_otp
|
||||
from account.utils import custom_response, custom_error_response, OTP_EXPIRY, send_otp_email
|
||||
@ -126,38 +129,69 @@ class AllTaskListAPIView(viewsets.ModelViewSet):
|
||||
serializer = TaskDetailsSerializer(queryset, many=True)
|
||||
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
|
||||
|
||||
# class TaskListAPIView(viewsets.ModelViewSet):
|
||||
# """Update guardian profile"""
|
||||
# serializer_class = TaskDetailsSerializer
|
||||
# permission_classes = [IsAuthenticated]
|
||||
# pagination_class = PageNumberPagination
|
||||
# http_method_names = ('get',)
|
||||
#
|
||||
# def list(self, request, *args, **kwargs):
|
||||
# """Create guardian profile"""
|
||||
# try:
|
||||
# status_value = self.request.GET.get('status')
|
||||
# search = self.request.GET.get('search')
|
||||
# if search and str(status_value) == '0':
|
||||
# queryset = JuniorTask.objects.filter(guardian__user=request.user,
|
||||
# task_name__icontains=search).order_by('due_date', 'created_at')
|
||||
# elif search and str(status_value) != '0':
|
||||
# queryset = JuniorTask.objects.filter(guardian__user=request.user,task_name__icontains=search,
|
||||
# task_status=status_value).order_by('due_date', 'created_at')
|
||||
# if search is None and str(status_value) == '0':
|
||||
# queryset = JuniorTask.objects.filter(guardian__user=request.user).order_by('due_date', 'created_at')
|
||||
# elif search is None and str(status_value) != '0':
|
||||
# queryset = JuniorTask.objects.filter(guardian__user=request.user,
|
||||
# task_status=status_value).order_by('due_date','created_at')
|
||||
# paginator = self.pagination_class()
|
||||
# # use Pagination
|
||||
# paginated_queryset = paginator.paginate_queryset(queryset, request)
|
||||
# # use TaskDetailsSerializer serializer
|
||||
# serializer = TaskDetailsSerializer(paginated_queryset, many=True)
|
||||
# return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
|
||||
# except Exception as e:
|
||||
# return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class TaskListAPIView(viewsets.ModelViewSet):
|
||||
"""Update guardian profile"""
|
||||
serializer_class = TaskDetailsSerializer
|
||||
permission_classes = [IsAuthenticated]
|
||||
filter_backends = (SearchFilter,)
|
||||
search_fields = ['task_name', ]
|
||||
pagination_class = PageNumberPagination
|
||||
queryset = JuniorTask.objects.all()
|
||||
http_method_names = ('get',)
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = JuniorTask.objects.filter(guardian__user=self.request.user
|
||||
).prefetch_related('junior', 'junior__auth'
|
||||
).order_by('due_date', 'created_at')
|
||||
|
||||
queryset = self.filter_queryset(queryset)
|
||||
return queryset
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
"""Create guardian profile"""
|
||||
try:
|
||||
status_value = self.request.GET.get('status')
|
||||
search = self.request.GET.get('search')
|
||||
if search and str(status_value) == '0':
|
||||
queryset = JuniorTask.objects.filter(guardian__user=request.user,
|
||||
task_name__icontains=search).order_by('due_date', 'created_at')
|
||||
elif search and str(status_value) != '0':
|
||||
queryset = JuniorTask.objects.filter(guardian__user=request.user,task_name__icontains=search,
|
||||
task_status=status_value).order_by('due_date', 'created_at')
|
||||
if search is None and str(status_value) == '0':
|
||||
queryset = JuniorTask.objects.filter(guardian__user=request.user).order_by('due_date', 'created_at')
|
||||
elif search is None and str(status_value) != '0':
|
||||
queryset = JuniorTask.objects.filter(guardian__user=request.user,
|
||||
task_status=status_value).order_by('due_date','created_at')
|
||||
paginator = self.pagination_class()
|
||||
# use Pagination
|
||||
paginated_queryset = paginator.paginate_queryset(queryset, request)
|
||||
# use TaskDetailsSerializer serializer
|
||||
serializer = TaskDetailsSerializer(paginated_queryset, many=True)
|
||||
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
|
||||
except Exception as e:
|
||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
||||
status_value = self.request.GET.get('status')
|
||||
queryset = self.get_queryset()
|
||||
if status_value and status_value != '0':
|
||||
queryset = queryset.filter(task_status=status_value)
|
||||
paginator = self.pagination_class()
|
||||
# use Pagination
|
||||
paginated_queryset = paginator.paginate_queryset(queryset, request)
|
||||
# use TaskDetailsSerializer serializer
|
||||
serializer = self.serializer_class(paginated_queryset, many=True)
|
||||
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class CreateTaskAPIView(viewsets.ModelViewSet):
|
||||
"""create task for junior"""
|
||||
@ -329,3 +363,22 @@ class ApproveTaskAPIView(viewsets.ViewSet):
|
||||
except Exception as e:
|
||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
class GuardianListAPIView(viewsets.ModelViewSet):
|
||||
"""Guardian list of assosicated junior"""
|
||||
|
||||
serializer_class = GuardianDetailListSerializer
|
||||
permission_classes = [IsAuthenticated]
|
||||
http_method_names = ('get',)
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
""" junior list"""
|
||||
try:
|
||||
guardian_data = JuniorGuardianRelationship.objects.filter(junior__auth__email=self.request.user)
|
||||
# fetch junior object
|
||||
if guardian_data:
|
||||
# use GuardianDetailListSerializer serializer
|
||||
serializer = GuardianDetailListSerializer(guardian_data, many=True)
|
||||
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
|
||||
return custom_error_response(ERROR_CODE['2068'], response_status=status.HTTP_200_OK)
|
||||
except Exception as e:
|
||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@ -0,0 +1,22 @@
|
||||
# Generated by Django 4.2.2 on 2023-08-02 11:27
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('junior', '0017_juniorguardianrelationship'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='junior',
|
||||
name='relationship',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='junior',
|
||||
name='guardian_code_approved',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
]
|
||||
@ -71,6 +71,8 @@ class Junior(models.Model):
|
||||
passcode = models.IntegerField(null=True, blank=True, default=None)
|
||||
# junior is verified or not"""
|
||||
is_verified = models.BooleanField(default=False)
|
||||
"""guardian code is approved or not"""
|
||||
guardian_code_approved = models.BooleanField(default=False)
|
||||
# Profile created and updated time"""
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
"""Serializer file for junior"""
|
||||
"""Import Django 3rd party app"""
|
||||
# third party imports
|
||||
import pytz
|
||||
|
||||
# django imports
|
||||
from rest_framework import serializers
|
||||
from django.contrib.auth.models import User
|
||||
from django.db import transaction
|
||||
@ -7,12 +10,12 @@ from datetime import datetime
|
||||
from django.utils import timezone
|
||||
from rest_framework_simplejwt.tokens import RefreshToken
|
||||
|
||||
"""Import django app"""
|
||||
# local imports
|
||||
from account.utils import send_otp_email, generate_code
|
||||
from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship
|
||||
from guardian.tasks import generate_otp
|
||||
from base.messages import ERROR_CODE, SUCCESS_CODE
|
||||
from base.constants import PENDING, IN_PROGRESS, REJECTED, REQUESTED, COMPLETED, NUMBER, JUN, ZOD
|
||||
from base.constants import PENDING, IN_PROGRESS, REJECTED, REQUESTED, COMPLETED, NUMBER, JUN, ZOD, EXPIRED
|
||||
from guardian.models import Guardian, JuniorTask
|
||||
from account.models import UserEmailOtp, UserNotification
|
||||
from junior.utils import junior_notification_email, junior_approval_mail
|
||||
@ -89,7 +92,10 @@ class CreateJuniorSerializer(serializers.ModelSerializer):
|
||||
"""condition for guardian code"""
|
||||
if guardian_code:
|
||||
junior.guardian_code = guardian_code
|
||||
junior.dob = validated_data.get('dob',junior.dob)
|
||||
guardian_data = Guardian.objects.filter(guardian_code=guardian_code[0]).last()
|
||||
if guardian_data:
|
||||
JuniorGuardianRelationship.objects.get_or_create(guardian=guardian_data, junior=junior)
|
||||
junior.dob = validated_data.get('dob', junior.dob)
|
||||
junior.passcode = validated_data.get('passcode', junior.passcode)
|
||||
junior.country_name = validated_data.get('country_name', junior.country_name)
|
||||
"""Update country code and phone number"""
|
||||
@ -246,7 +252,7 @@ class JuniorProfileSerializer(serializers.ModelSerializer):
|
||||
fields = ['id', 'email', 'first_name', 'last_name', 'country_name', 'country_code', 'phone', 'gender', 'dob',
|
||||
'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image',
|
||||
'updated_at', 'notification_count', 'total_count', 'complete_field_count', 'signup_method',
|
||||
'is_invited', 'passcode']
|
||||
'is_invited', 'passcode', 'guardian_code_approved']
|
||||
|
||||
class AddJuniorSerializer(serializers.ModelSerializer):
|
||||
"""Add junior serializer"""
|
||||
@ -289,7 +295,6 @@ class AddJuniorSerializer(serializers.ModelSerializer):
|
||||
UserNotification.objects.get_or_create(user=user_data)
|
||||
"""Notification email"""
|
||||
junior_notification_email(email, full_name, email, password)
|
||||
junior_approval_mail(guardian, full_name)
|
||||
# push notification
|
||||
send_notification.delay(SKIPPED_PROFILE_SETUP, None, junior_data.auth.id, {})
|
||||
return junior_data
|
||||
@ -318,7 +323,8 @@ class CompleteTaskSerializer(serializers.ModelSerializer):
|
||||
fields = ('id', 'image')
|
||||
def update(self, instance, validated_data):
|
||||
instance.image = validated_data.get('image', instance.image)
|
||||
instance.requested_on = real_time()
|
||||
# instance.requested_on = real_time()
|
||||
instance.requested_on = timezone.now().astimezone(pytz.utc)
|
||||
instance.task_status = str(NUMBER['four'])
|
||||
instance.is_approved = False
|
||||
instance.save()
|
||||
@ -335,6 +341,7 @@ class JuniorPointsSerializer(serializers.ModelSerializer):
|
||||
requested_task = serializers.SerializerMethodField('get_requested_task')
|
||||
rejected_task = serializers.SerializerMethodField('get_rejected_task')
|
||||
pending_task = serializers.SerializerMethodField('get_pending_task')
|
||||
expired_task = serializers.SerializerMethodField('get_expired_task')
|
||||
position = serializers.SerializerMethodField('get_position')
|
||||
|
||||
def get_junior_id(self, obj):
|
||||
@ -370,11 +377,14 @@ class JuniorPointsSerializer(serializers.ModelSerializer):
|
||||
def get_pending_task(self, obj):
|
||||
return JuniorTask.objects.filter(junior=obj.junior, task_status=PENDING).count()
|
||||
|
||||
def get_expired_task(self, obj):
|
||||
return JuniorTask.objects.filter(junior=obj.junior, task_status=EXPIRED).count()
|
||||
|
||||
class Meta(object):
|
||||
"""Meta info"""
|
||||
model = Junior
|
||||
fields = ['junior_id', 'total_points', 'position', 'pending_task', 'in_progress_task', 'completed_task',
|
||||
'requested_task', 'rejected_task']
|
||||
'requested_task', 'rejected_task', 'expired_task']
|
||||
|
||||
class AddGuardianSerializer(serializers.ModelSerializer):
|
||||
"""Add guardian serializer"""
|
||||
@ -439,7 +449,10 @@ class StartTaskSerializer(serializers.ModelSerializer):
|
||||
""" remaining time to complete task"""
|
||||
due_date = datetime.combine(obj.due_date, datetime.max.time())
|
||||
# fetch real time
|
||||
real_datetime = real_time()
|
||||
# real_datetime = real_time()
|
||||
# new code
|
||||
due_date = due_date.astimezone(pytz.utc)
|
||||
real_datetime = timezone.now().astimezone(pytz.utc)
|
||||
# Perform the subtraction
|
||||
if due_date > real_datetime:
|
||||
time_difference = due_date - real_datetime
|
||||
@ -454,3 +467,17 @@ class StartTaskSerializer(serializers.ModelSerializer):
|
||||
instance.task_status = str(NUMBER['two'])
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
class ReAssignTaskSerializer(serializers.ModelSerializer):
|
||||
"""User task Serializer"""
|
||||
class Meta(object):
|
||||
"""Meta class"""
|
||||
model = JuniorTask
|
||||
fields = ('id', 'due_date')
|
||||
def update(self, instance, validated_data):
|
||||
instance.task_status = str(NUMBER['one'])
|
||||
instance.due_date = validated_data.get('due_date')
|
||||
instance.is_approved = False
|
||||
instance.requested_on = None
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
@ -4,7 +4,7 @@ from django.urls import path, include
|
||||
from .views import (UpdateJuniorProfile, ValidateGuardianCode, JuniorListAPIView, AddJuniorAPIView,
|
||||
InvitedJuniorAPIView, FilterJuniorAPIView, RemoveJuniorAPIView, JuniorTaskListAPIView,
|
||||
CompleteJuniorTaskAPIView, JuniorPointsListAPIView, ValidateReferralCode,
|
||||
InviteGuardianAPIView, StartTaskAPIView)
|
||||
InviteGuardianAPIView, StartTaskAPIView, ReAssignJuniorTaskAPIView)
|
||||
"""Third party import"""
|
||||
from rest_framework import routers
|
||||
|
||||
@ -46,5 +46,6 @@ urlpatterns = [
|
||||
path('api/v1/', include(router.urls)),
|
||||
path('api/v1/remove-junior/', RemoveJuniorAPIView.as_view()),
|
||||
path('api/v1/complete-task/', CompleteJuniorTaskAPIView.as_view()),
|
||||
path('api/v1/start-task/', StartTaskAPIView.as_view())
|
||||
path('api/v1/start-task/', StartTaskAPIView.as_view()),
|
||||
path('api/v1/reassign-task/', ReAssignJuniorTaskAPIView.as_view()),
|
||||
]
|
||||
|
||||
@ -27,12 +27,12 @@ import requests
|
||||
# Import upload_image_to_alibaba
|
||||
# Import custom_response, custom_error_response
|
||||
# Import constants
|
||||
from junior.models import Junior, JuniorPoints
|
||||
from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship
|
||||
from .serializers import (CreateJuniorSerializer, JuniorDetailListSerializer, AddJuniorSerializer,\
|
||||
RemoveJuniorSerializer, CompleteTaskSerializer, JuniorPointsSerializer,
|
||||
AddGuardianSerializer, StartTaskSerializer)
|
||||
AddGuardianSerializer, StartTaskSerializer, ReAssignTaskSerializer)
|
||||
from guardian.models import Guardian, JuniorTask
|
||||
from guardian.serializers import TaskDetailsSerializer
|
||||
from guardian.serializers import TaskDetailsSerializer, TaskDetailsjuniorSerializer
|
||||
from base.messages import ERROR_CODE, SUCCESS_CODE
|
||||
from base.constants import NUMBER
|
||||
from account.utils import custom_response, custom_error_response
|
||||
@ -144,7 +144,6 @@ class JuniorListAPIView(viewsets.ModelViewSet):
|
||||
|
||||
class AddJuniorAPIView(viewsets.ModelViewSet):
|
||||
"""Add Junior by guardian"""
|
||||
queryset = Junior.objects.all()
|
||||
serializer_class = AddJuniorSerializer
|
||||
permission_classes = [IsAuthenticated]
|
||||
http_method_names = ('post',)
|
||||
@ -172,6 +171,8 @@ class AddJuniorAPIView(viewsets.ModelViewSet):
|
||||
guardian = Guardian.objects.filter(user=self.request.user).first()
|
||||
junior.guardian_code = [guardian.guardian_code]
|
||||
junior.save()
|
||||
JuniorGuardianRelationship.objects.get_or_create(guardian=guardian, junior=junior,
|
||||
relationship=str(self.request.data['relationship']))
|
||||
return True
|
||||
|
||||
|
||||
@ -246,8 +247,7 @@ class RemoveJuniorAPIView(views.APIView):
|
||||
junior_id = self.request.GET.get('id')
|
||||
guardian = Guardian.objects.filter(user__email=self.request.user).last()
|
||||
# fetch junior query
|
||||
junior_queryset = Junior.objects.filter(id=junior_id, guardian_code__icontains=str(guardian.guardian_code),
|
||||
is_invited=True).last()
|
||||
junior_queryset = Junior.objects.filter(id=junior_id, guardian_code__icontains=str(guardian.guardian_code)).last()
|
||||
if junior_queryset:
|
||||
# use RemoveJuniorSerializer serializer
|
||||
serializer = RemoveJuniorSerializer(junior_queryset, data=request.data, partial=True)
|
||||
@ -265,7 +265,7 @@ class RemoveJuniorAPIView(views.APIView):
|
||||
|
||||
class JuniorTaskListAPIView(viewsets.ModelViewSet):
|
||||
"""Update guardian profile"""
|
||||
serializer_class = TaskDetailsSerializer
|
||||
serializer_class = TaskDetailsjuniorSerializer
|
||||
permission_classes = [IsAuthenticated]
|
||||
pagination_class = PageNumberPagination
|
||||
queryset = JuniorTask.objects.all()
|
||||
@ -295,7 +295,7 @@ class JuniorTaskListAPIView(viewsets.ModelViewSet):
|
||||
# use Pagination
|
||||
paginated_queryset = paginator.paginate_queryset(queryset, request)
|
||||
# use TaskDetailsSerializer serializer
|
||||
serializer = TaskDetailsSerializer(paginated_queryset, many=True)
|
||||
serializer = TaskDetailsjuniorSerializer(paginated_queryset, many=True)
|
||||
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
|
||||
except Exception as e:
|
||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
||||
@ -434,3 +434,27 @@ class StartTaskAPIView(views.APIView):
|
||||
return custom_error_response(ERROR_CODE['2060'], response_status=status.HTTP_400_BAD_REQUEST)
|
||||
except Exception as e:
|
||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
class ReAssignJuniorTaskAPIView(views.APIView):
|
||||
"""Update junior task API"""
|
||||
serializer_class = ReAssignTaskSerializer
|
||||
model = JuniorTask
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
def put(self, request, format=None):
|
||||
try:
|
||||
task_id = self.request.data.get('task_id')
|
||||
task_queryset = JuniorTask.objects.filter(id=task_id, guardian__user__email=self.request.user).last()
|
||||
if task_queryset and task_queryset.task_status == str(NUMBER['six']):
|
||||
# use StartTaskSerializer serializer
|
||||
serializer = ReAssignTaskSerializer(task_queryset, data=request.data, partial=True)
|
||||
if serializer.is_valid():
|
||||
# save serializer
|
||||
serializer.save()
|
||||
return custom_response(SUCCESS_CODE['3036'], response_status=status.HTTP_200_OK)
|
||||
return custom_error_response(serializer.errors, response_status=status.HTTP_400_BAD_REQUEST)
|
||||
else:
|
||||
# task in another state
|
||||
return custom_error_response(ERROR_CODE['2066'], response_status=status.HTTP_400_BAD_REQUEST)
|
||||
except Exception as e:
|
||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@ -6,6 +6,7 @@ from rest_framework import serializers
|
||||
|
||||
# local imports
|
||||
from notifications.utils import register_fcm_token
|
||||
from notifications.models import Notification
|
||||
|
||||
|
||||
class RegisterDevice(serializers.Serializer):
|
||||
@ -26,3 +27,19 @@ class RegisterDevice(serializers.Serializer):
|
||||
device_type = validated_data['type']
|
||||
return register_fcm_token(self.context['user_id'], registration_id,
|
||||
validated_data['device_id'], device_type)
|
||||
|
||||
|
||||
class NotificationListSerializer(serializers.ModelSerializer):
|
||||
"""List of notification"""
|
||||
|
||||
class Meta(object):
|
||||
"""meta info"""
|
||||
model = Notification
|
||||
fields = ['id', 'data', 'is_read']
|
||||
|
||||
class ReadNotificationSerializer(serializers.ModelSerializer):
|
||||
"""User task Serializer"""
|
||||
class Meta(object):
|
||||
"""Meta class"""
|
||||
model = Notification
|
||||
fields = ('id',)
|
||||
|
||||
@ -6,7 +6,7 @@ from django.urls import path, include
|
||||
from rest_framework import routers
|
||||
|
||||
# local imports
|
||||
from notifications.views import NotificationViewSet
|
||||
from notifications.views import NotificationViewSet, ReadNotification
|
||||
|
||||
# initiate router
|
||||
router = routers.SimpleRouter()
|
||||
@ -15,4 +15,5 @@ router.register('notifications', NotificationViewSet, basename='notifications')
|
||||
|
||||
urlpatterns = [
|
||||
path('api/v1/', include(router.urls)),
|
||||
path('api/v1/read-notification/', ReadNotification.as_view()),
|
||||
]
|
||||
|
||||
@ -3,24 +3,40 @@ notifications views file
|
||||
"""
|
||||
# django imports
|
||||
from django.db.models import Q
|
||||
from rest_framework import viewsets
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
|
||||
from rest_framework import viewsets, status, views
|
||||
# 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 notifications.constants import TEST_NOTIFICATION
|
||||
from notifications.serializers import RegisterDevice
|
||||
from notifications.serializers import RegisterDevice, NotificationListSerializer, ReadNotificationSerializer
|
||||
from notifications.utils import send_notification
|
||||
from notifications.models import Notification
|
||||
|
||||
|
||||
class NotificationViewSet(viewsets.GenericViewSet):
|
||||
""" used to do the notification actions """
|
||||
serializer_class = RegisterDevice
|
||||
serializer_class = NotificationListSerializer
|
||||
permission_classes = [IsAuthenticated, ]
|
||||
|
||||
def list(self, request, *args, **kwargs) -> Response:
|
||||
""" list the notifications """
|
||||
queryset = Notification.objects.filter(notification_to_id=request.auth.payload['user_id']
|
||||
).select_related('notification_to').order_by('-id')
|
||||
paginator = self.pagination_class()
|
||||
paginated_queryset = paginator.paginate_queryset(queryset, request)
|
||||
serializer = self.serializer_class(paginated_queryset, many=True)
|
||||
self.mark_notifications_as_read(serializer.data)
|
||||
return custom_response(None, serializer.data)
|
||||
|
||||
@staticmethod
|
||||
def mark_notifications_as_read(data):
|
||||
""" used to mark notification queryset as read """
|
||||
ids = [obj['id'] for obj in data]
|
||||
Notification.objects.filter(id__in=ids).update(is_read=True)
|
||||
|
||||
@action(methods=['post'], detail=False, url_path='device', url_name='device', serializer_class=RegisterDevice)
|
||||
def fcm_registration(self, request):
|
||||
"""
|
||||
@ -40,3 +56,33 @@ class NotificationViewSet(viewsets.GenericViewSet):
|
||||
"""
|
||||
send_notification.delay(TEST_NOTIFICATION, None, request.auth.payload['user_id'], {})
|
||||
return custom_response(SUCCESS_CODE["3000"])
|
||||
|
||||
@action(methods=['get'], detail=False, url_path='list', url_name='list',
|
||||
serializer_class=NotificationListSerializer)
|
||||
def notification_list(self, request):
|
||||
"""
|
||||
notification list
|
||||
"""
|
||||
try:
|
||||
queryset = Notification.objects.filter(notification_to=request.user)
|
||||
serializer = NotificationListSerializer(queryset, many=True)
|
||||
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
|
||||
except Exception as e:
|
||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class ReadNotification(views.APIView):
|
||||
"""Update notification API"""
|
||||
serializer_class = ReadNotificationSerializer
|
||||
model = Notification
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
def put(self, request, format=None):
|
||||
try:
|
||||
notification_id = self.request.data.get('notification_id')
|
||||
notification_queryset = Notification.objects.filter(id__in=notification_id,
|
||||
notification_to=self.request.user).update(is_read=True)
|
||||
if notification_queryset:
|
||||
return custom_response(SUCCESS_CODE['3039'], response_status=status.HTTP_200_OK)
|
||||
except Exception as e:
|
||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@ -21,15 +21,15 @@ class ArticleCardSerializer(serializers.ModelSerializer):
|
||||
Article Card serializer
|
||||
"""
|
||||
id = serializers.IntegerField(required=False)
|
||||
image = serializers.FileField(required=False)
|
||||
image_url = serializers.URLField(required=False)
|
||||
image_name = serializers.CharField(required=False)
|
||||
image_url = serializers.CharField(required=False)
|
||||
|
||||
class Meta:
|
||||
"""
|
||||
meta class
|
||||
"""
|
||||
model = ArticleCard
|
||||
fields = ('id', 'title', 'description', 'image', 'image_url')
|
||||
fields = ('id', 'title', 'description', 'image_name', 'image_url')
|
||||
|
||||
def create(self, validated_data):
|
||||
validated_data['image_url'] = get_image_url(validated_data)
|
||||
@ -215,52 +215,21 @@ class DefaultArticleCardImageSerializer(serializers.ModelSerializer):
|
||||
card_image = DefaultArticleCardImage.objects.create(**validated_data)
|
||||
return card_image
|
||||
|
||||
|
||||
class UserManagementListSerializer(serializers.ModelSerializer):
|
||||
class ArticleListSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
user management serializer
|
||||
serializer for article API
|
||||
"""
|
||||
name = serializers.SerializerMethodField()
|
||||
phone_number = serializers.SerializerMethodField()
|
||||
user_type = serializers.SerializerMethodField()
|
||||
article_cards = ArticleCardSerializer(many=True)
|
||||
total_points = serializers.SerializerMethodField('get_total_points')
|
||||
|
||||
class Meta:
|
||||
"""
|
||||
meta class
|
||||
"""
|
||||
model = USER
|
||||
fields = ('name', 'email', 'phone_number', 'user_type', 'is_active')
|
||||
model = Article
|
||||
fields = ('id', 'title', 'description', 'article_cards', 'total_points')
|
||||
|
||||
@staticmethod
|
||||
def get_name(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: full name
|
||||
"""
|
||||
return (obj.first_name + obj.last_name) if obj.last_name else obj.first_name
|
||||
|
||||
@staticmethod
|
||||
def get_phone_number(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: user phone number
|
||||
"""
|
||||
if profile := obj.guardian_profile.all().first():
|
||||
return profile.phone
|
||||
elif profile := obj.junior_profile.all().first():
|
||||
return profile.phone
|
||||
else:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_user_type(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: user type
|
||||
"""
|
||||
if obj.guardian_profile.all().first():
|
||||
return dict(USER_TYPE).get('2')
|
||||
elif obj.junior_profile.all().first():
|
||||
return dict(USER_TYPE).get('1')
|
||||
else:
|
||||
return None
|
||||
def get_total_points(self, obj):
|
||||
"""total points of article"""
|
||||
total_question = ArticleSurvey.objects.filter(article=obj).count()
|
||||
return total_question * 5
|
||||
|
||||
298
web_admin/serializers/user_management_serializer.py
Normal file
298
web_admin/serializers/user_management_serializer.py
Normal file
@ -0,0 +1,298 @@
|
||||
"""
|
||||
web_admin user_management serializers file
|
||||
"""
|
||||
# django imports
|
||||
from rest_framework import serializers
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
from base.constants import USER_TYPE
|
||||
# local imports
|
||||
from base.messages import ERROR_CODE, SUCCESS_CODE
|
||||
from guardian.models import Guardian
|
||||
from junior.models import Junior
|
||||
|
||||
USER = get_user_model()
|
||||
|
||||
|
||||
class UserManagementListSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
user management serializer
|
||||
"""
|
||||
name = serializers.SerializerMethodField()
|
||||
country_code = serializers.SerializerMethodField()
|
||||
phone = serializers.SerializerMethodField()
|
||||
user_type = serializers.SerializerMethodField()
|
||||
is_active = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
"""
|
||||
meta class
|
||||
"""
|
||||
model = USER
|
||||
fields = ('id', 'name', 'email', 'country_code', 'phone', 'user_type', 'is_active')
|
||||
|
||||
@staticmethod
|
||||
def get_name(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: full name
|
||||
"""
|
||||
return f"{obj.first_name} {obj.last_name}" if obj.last_name else obj.first_name
|
||||
|
||||
@staticmethod
|
||||
def get_country_code(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: user phone number
|
||||
"""
|
||||
if profile := obj.guardian_profile.all().first():
|
||||
return profile.country_code if profile.country_code else None
|
||||
elif profile := obj.junior_profile.all().first():
|
||||
return profile.country_code if profile.country_code else None
|
||||
else:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_phone(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: user phone number
|
||||
"""
|
||||
if profile := obj.guardian_profile.all().first():
|
||||
return profile.phone if profile.phone else None
|
||||
elif profile := obj.junior_profile.all().first():
|
||||
return profile.phone if profile.phone else None
|
||||
else:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_user_type(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: user type
|
||||
"""
|
||||
if obj.guardian_profile.all().first():
|
||||
return dict(USER_TYPE).get('2')
|
||||
elif obj.junior_profile.all().first():
|
||||
return dict(USER_TYPE).get('1')
|
||||
else:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_is_active(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: user type
|
||||
"""
|
||||
if profile := obj.guardian_profile.all().first():
|
||||
return profile.is_active
|
||||
elif profile := obj.junior_profile.all().first():
|
||||
return profile.is_active
|
||||
else:
|
||||
return obj.is_active
|
||||
|
||||
|
||||
class GuardianSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
guardian serializer
|
||||
"""
|
||||
name = serializers.SerializerMethodField()
|
||||
first_name = serializers.SerializerMethodField()
|
||||
last_name = serializers.SerializerMethodField()
|
||||
username = serializers.SerializerMethodField()
|
||||
email = serializers.EmailField(required=False)
|
||||
|
||||
class Meta:
|
||||
"""
|
||||
meta class
|
||||
"""
|
||||
model = Guardian
|
||||
fields = ('id', 'name', 'first_name', 'last_name', 'username', 'dob', 'gender', 'country_code', 'phone',
|
||||
'is_active', 'country_name', 'image', 'email')
|
||||
|
||||
def validate(self, attrs):
|
||||
"""
|
||||
to validate request data
|
||||
:return: validated attrs
|
||||
"""
|
||||
email = attrs.get('email')
|
||||
phone = attrs.get('phone')
|
||||
if USER.objects.filter(email=email).exclude(id=self.context.get('user_id')).exists():
|
||||
raise serializers.ValidationError({'details': ERROR_CODE['2003']})
|
||||
if Guardian.objects.filter(phone=phone).exclude(user__id=self.context.get('user_id')).exists():
|
||||
raise serializers.ValidationError({'details': ERROR_CODE['2012']})
|
||||
return attrs
|
||||
|
||||
def update(self, instance, validated_data):
|
||||
"""
|
||||
to update user and its related profile
|
||||
:param instance: user's guardian object
|
||||
:param validated_data:
|
||||
:return: guardian object
|
||||
"""
|
||||
instance.user.email = self.validated_data.get('email', instance.user.email)
|
||||
instance.user.username = self.validated_data.get('email', instance.user.username)
|
||||
instance.user.save()
|
||||
instance.country_code = validated_data.get('country_code', instance.country_code)
|
||||
instance.phone = validated_data.get('phone', instance.phone)
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
@staticmethod
|
||||
def get_name(obj):
|
||||
"""
|
||||
:param obj: guardian object
|
||||
:return: full name
|
||||
"""
|
||||
return f"{obj.user.first_name} {obj.user.last_name}" if obj.user.last_name else obj.user.first_name
|
||||
|
||||
@staticmethod
|
||||
def get_first_name(obj):
|
||||
"""
|
||||
:param obj: guardian object
|
||||
:return: first name
|
||||
"""
|
||||
return obj.user.first_name
|
||||
|
||||
@staticmethod
|
||||
def get_last_name(obj):
|
||||
"""
|
||||
:param obj: guardian object
|
||||
:return: last name
|
||||
"""
|
||||
return obj.user.last_name
|
||||
|
||||
@staticmethod
|
||||
def get_username(obj):
|
||||
"""
|
||||
:param obj: guardian object
|
||||
:return: email
|
||||
"""
|
||||
return obj.user.username
|
||||
|
||||
|
||||
class JuniorSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
junior serializer
|
||||
"""
|
||||
name = serializers.SerializerMethodField()
|
||||
first_name = serializers.SerializerMethodField()
|
||||
last_name = serializers.SerializerMethodField()
|
||||
username = serializers.SerializerMethodField()
|
||||
email = serializers.EmailField(required=False)
|
||||
|
||||
class Meta:
|
||||
"""
|
||||
meta class
|
||||
"""
|
||||
model = Junior
|
||||
fields = ('id', 'name', 'first_name', 'last_name', 'username', 'dob', 'gender', 'country_code', 'phone',
|
||||
'is_active', 'country_name', 'image', 'email')
|
||||
|
||||
def validate(self, attrs):
|
||||
"""
|
||||
to validate request data
|
||||
:return: validated attrs
|
||||
"""
|
||||
email = attrs.get('email')
|
||||
phone = attrs.get('phone')
|
||||
if email and USER.objects.filter(email=email).exclude(id=self.context.get('user_id')).exists():
|
||||
raise serializers.ValidationError({'details': ERROR_CODE['2003']})
|
||||
if phone and Junior.objects.filter(phone=phone).exclude(auth__id=self.context.get('user_id')).exists():
|
||||
raise serializers.ValidationError({'details': ERROR_CODE['2012']})
|
||||
return attrs
|
||||
|
||||
def update(self, instance, validated_data):
|
||||
"""
|
||||
:param instance: user's junior object
|
||||
:param validated_data: validated data
|
||||
:return: instance
|
||||
"""
|
||||
instance.auth.email = self.validated_data.get('email', instance.auth.email)
|
||||
instance.auth.username = self.validated_data.get('email', instance.auth.username)
|
||||
instance.auth.save()
|
||||
instance.country_code = validated_data.get('country_code', instance.country_code)
|
||||
instance.phone = validated_data.get('phone', instance.phone)
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
@staticmethod
|
||||
def get_name(obj):
|
||||
"""
|
||||
:param obj: junior object
|
||||
:return: full name
|
||||
"""
|
||||
return f"{obj.auth.first_name} {obj.auth.last_name}" if obj.auth.last_name else obj.auth.first_name
|
||||
|
||||
@staticmethod
|
||||
def get_first_name(obj):
|
||||
"""
|
||||
:param obj: junior object
|
||||
:return: first name
|
||||
"""
|
||||
return obj.auth.first_name
|
||||
|
||||
@staticmethod
|
||||
def get_last_name(obj):
|
||||
"""
|
||||
:param obj: junior object
|
||||
:return: last name
|
||||
"""
|
||||
return obj.auth.last_name
|
||||
|
||||
@staticmethod
|
||||
def get_username(obj):
|
||||
"""
|
||||
:param obj: junior object
|
||||
:return: email
|
||||
"""
|
||||
return obj.auth.username
|
||||
|
||||
|
||||
class UserManagementDetailSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
user management details serializer
|
||||
"""
|
||||
user_type = serializers.SerializerMethodField()
|
||||
guardian_profile = GuardianSerializer(many=True)
|
||||
junior_profile = JuniorSerializer(many=True)
|
||||
associated_users = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
"""
|
||||
meta class
|
||||
"""
|
||||
model = USER
|
||||
fields = ('id', 'user_type', 'email', 'guardian_profile', 'junior_profile', 'associated_users')
|
||||
|
||||
@staticmethod
|
||||
def get_user_type(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: user type
|
||||
"""
|
||||
if obj.guardian_profile.all().first():
|
||||
return dict(USER_TYPE).get('2')
|
||||
elif obj.junior_profile.all().first():
|
||||
return dict(USER_TYPE).get('1')
|
||||
else:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_associated_users(obj):
|
||||
"""
|
||||
:param obj: user object
|
||||
:return: associated user
|
||||
"""
|
||||
if profile := obj.guardian_profile.all().first():
|
||||
if profile.guardian_code:
|
||||
junior = Junior.objects.filter(guardian_code__contains=[profile.guardian_code], is_verified=True)
|
||||
serializer = JuniorSerializer(junior, many=True)
|
||||
return serializer.data
|
||||
elif profile := obj.junior_profile.all().first():
|
||||
if profile.guardian_code:
|
||||
guardian = Guardian.objects.filter(guardian_code__in=profile.guardian_code, is_verified=True)
|
||||
serializer = GuardianSerializer(guardian, many=True)
|
||||
return serializer.data
|
||||
else:
|
||||
return None
|
||||
@ -6,16 +6,17 @@ from django.urls import path, include
|
||||
from rest_framework import routers
|
||||
|
||||
# local imports
|
||||
from web_admin.views.article import ArticleViewSet, DefaultArticleCardImagesViewSet, UserManagementViewSet
|
||||
from web_admin.views.article import ArticleViewSet, DefaultArticleCardImagesViewSet, ArticleListViewSet
|
||||
from web_admin.views.auth import ForgotAndResetPasswordViewSet
|
||||
from web_admin.views.user_management import UserManagementViewSet
|
||||
|
||||
# initiate router
|
||||
router = routers.SimpleRouter()
|
||||
|
||||
router.register('article', ArticleViewSet, basename='article')
|
||||
router.register('default-card-images', DefaultArticleCardImagesViewSet, basename='default-card-images')
|
||||
router.register('user', UserManagementViewSet, basename='user')
|
||||
|
||||
router.register('user-management', UserManagementViewSet, basename='user')
|
||||
router.register('article-list', ArticleListViewSet, basename='article-list')
|
||||
# forgot and reset password api for admin
|
||||
router.register('admin', ForgotAndResetPasswordViewSet, basename='admin')
|
||||
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
"""
|
||||
web_utils file
|
||||
"""
|
||||
import base64
|
||||
|
||||
from base.constants import ARTICLE_CARD_IMAGE_FOLDER
|
||||
from guardian.utils import upload_image_to_alibaba
|
||||
|
||||
@ -16,8 +18,22 @@ def pop_id(data):
|
||||
|
||||
|
||||
def get_image_url(data):
|
||||
if 'image_url' in data:
|
||||
"""
|
||||
to get image url
|
||||
:param data:
|
||||
:return: image url
|
||||
"""
|
||||
if 'image_url' in data and 'http' in data['image_url']:
|
||||
if 'image_name' in data:
|
||||
data.pop('image_name')
|
||||
return data['image_url']
|
||||
elif 'image_url' in data and type(data['image_url']) == str and data['image_url'].startswith('data:image'):
|
||||
base64_image = base64.b64decode(data.get('image_url').split(',')[1])
|
||||
image_name = f"{data['title']} | {data.pop('image_name')}" if 'image_name' in data else data['title']
|
||||
filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image_name}"
|
||||
# upload image on ali baba
|
||||
image_url = upload_image_to_alibaba(base64_image, filename)
|
||||
return image_url
|
||||
elif 'image' in data and data['image'] is not None:
|
||||
image = data.pop('image')
|
||||
filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}"
|
||||
|
||||
@ -16,8 +16,7 @@ from base.messages import SUCCESS_CODE, ERROR_CODE
|
||||
from web_admin.models import Article, ArticleCard, ArticleSurvey, DefaultArticleCardImage
|
||||
from web_admin.permission import AdminPermission
|
||||
from web_admin.serializers.article_serializer import (ArticleSerializer, ArticleCardSerializer,
|
||||
DefaultArticleCardImageSerializer,
|
||||
UserManagementListSerializer)
|
||||
DefaultArticleCardImageSerializer, ArticleListSerializer)
|
||||
|
||||
USER = get_user_model()
|
||||
|
||||
@ -30,7 +29,7 @@ class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModel
|
||||
serializer_class = ArticleSerializer
|
||||
permission_classes = [IsAuthenticated, AdminPermission]
|
||||
queryset = Article
|
||||
filter_backends = (OrderingFilter, SearchFilter,)
|
||||
filter_backends = (SearchFilter,)
|
||||
search_fields = ['title']
|
||||
http_method_names = ['get', 'post', 'put', 'delete']
|
||||
|
||||
@ -77,10 +76,11 @@ class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModel
|
||||
:return: list of article
|
||||
"""
|
||||
queryset = self.get_queryset()
|
||||
count = queryset.count()
|
||||
paginator = self.pagination_class()
|
||||
paginated_queryset = paginator.paginate_queryset(queryset, request)
|
||||
serializer = self.serializer_class(paginated_queryset, many=True)
|
||||
return custom_response(None, data=serializer.data)
|
||||
return custom_response(None, data=serializer.data, count=count)
|
||||
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
"""
|
||||
@ -109,7 +109,7 @@ class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModel
|
||||
return custom_response(SUCCESS_CODE["3029"])
|
||||
return custom_error_response(ERROR_CODE["2041"], status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@action(methods=['get'], url_name='remove_card', url_path='remove_card',
|
||||
@action(methods=['get'], url_name='remove-card', url_path='remove-card',
|
||||
detail=True)
|
||||
def remove_article_card(self, request, *args, **kwargs):
|
||||
"""
|
||||
@ -125,7 +125,7 @@ class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModel
|
||||
except AttributeError:
|
||||
return custom_error_response(ERROR_CODE["2042"], response_status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@action(methods=['get'], url_name='remove_survey', url_path='remove_survey',
|
||||
@action(methods=['get'], url_name='remove-survey', url_path='remove-survey',
|
||||
detail=True)
|
||||
def remove_article_survey(self, request, *args, **kwargs):
|
||||
"""
|
||||
@ -195,30 +195,33 @@ class DefaultArticleCardImagesViewSet(GenericViewSet, mixins.CreateModelMixin, m
|
||||
return custom_response(None, data=serializer.data)
|
||||
|
||||
|
||||
class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin):
|
||||
class ArticleListViewSet(GenericViewSet, mixins.ListModelMixin):
|
||||
"""
|
||||
api to manage (list, view, edit) user
|
||||
article api
|
||||
"""
|
||||
serializer_class = UserManagementListSerializer
|
||||
permission_classes = []
|
||||
queryset = USER.objects.prefetch_related(
|
||||
'guardian_profile', 'junior_profile')
|
||||
serializer_class = ArticleListSerializer
|
||||
permission_classes = [IsAuthenticated,]
|
||||
queryset = Article
|
||||
http_method_names = ['get',]
|
||||
|
||||
def get_queryset(self):
|
||||
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
|
||||
return self.queryset.filter(junior_profile__isnull=True)
|
||||
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
|
||||
return self.queryset.filter(guardian_profile__isnull=True)
|
||||
else:
|
||||
return self.queryset
|
||||
article = self.queryset.objects.filter(is_deleted=False).prefetch_related(
|
||||
'article_cards', 'article_survey', 'article_survey__options'
|
||||
).order_by('-created_at')
|
||||
queryset = self.filter_queryset(article)
|
||||
return queryset
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
"""
|
||||
api method to list all the user
|
||||
article list api method
|
||||
:param request:
|
||||
:return:
|
||||
:param args:
|
||||
:param kwargs:
|
||||
:return: list of article
|
||||
"""
|
||||
queryset = self.get_queryset()
|
||||
serializer = self.serializer_class(queryset, many=True)
|
||||
return custom_response(None, data=serializer.data)
|
||||
|
||||
count = queryset.count()
|
||||
paginator = self.pagination_class()
|
||||
paginated_queryset = paginator.paginate_queryset(queryset, request)
|
||||
serializer = self.serializer_class(paginated_queryset, many=True)
|
||||
return custom_response(None, data=serializer.data, count=count)
|
||||
|
||||
@ -33,7 +33,7 @@ class ForgotAndResetPasswordViewSet(GenericViewSet):
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
return custom_response(SUCCESS_CODE['3015'])
|
||||
return custom_error_response(ERROR_CODE['2063'], status.HTTP_400_BAD_REQUEST)
|
||||
return custom_error_response(ERROR_CODE['2000'], status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@action(methods=['post'], url_name='verify-otp', url_path='verify-otp',
|
||||
detail=False, serializer_class=AdminVerifyOTPSerializer)
|
||||
@ -45,7 +45,7 @@ class ForgotAndResetPasswordViewSet(GenericViewSet):
|
||||
serializer = self.serializer_class(data=request.data)
|
||||
if serializer.is_valid():
|
||||
return custom_response(SUCCESS_CODE['3011'])
|
||||
return custom_error_response(ERROR_CODE['2063'], status.HTTP_400_BAD_REQUEST)
|
||||
return custom_error_response(ERROR_CODE['2008'], status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@action(methods=['post'], url_name='create-password', url_path='create-password',
|
||||
detail=False, serializer_class=AdminCreatePasswordSerializer)
|
||||
@ -59,5 +59,5 @@ class ForgotAndResetPasswordViewSet(GenericViewSet):
|
||||
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_response(SUCCESS_CODE['3006'])
|
||||
return custom_error_response(ERROR_CODE['2064'], status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
127
web_admin/views/user_management.py
Normal file
127
web_admin/views/user_management.py
Normal file
@ -0,0 +1,127 @@
|
||||
"""
|
||||
web_admin user_management views file
|
||||
"""
|
||||
# django imports
|
||||
from rest_framework.viewsets import GenericViewSet, mixins
|
||||
from rest_framework.filters import OrderingFilter, SearchFilter
|
||||
from rest_framework import status
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.permissions import IsAuthenticated, AllowAny
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.db.models import Q
|
||||
|
||||
# local imports
|
||||
from account.utils import custom_response, custom_error_response
|
||||
from base.constants import USER_TYPE
|
||||
from base.messages import SUCCESS_CODE, ERROR_CODE
|
||||
from web_admin.permission import AdminPermission
|
||||
from web_admin.serializers.user_management_serializer import (UserManagementListSerializer,
|
||||
UserManagementDetailSerializer, GuardianSerializer,
|
||||
JuniorSerializer)
|
||||
|
||||
USER = get_user_model()
|
||||
|
||||
|
||||
class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin,
|
||||
mixins.RetrieveModelMixin, mixins.UpdateModelMixin):
|
||||
"""
|
||||
api to manage (list, view, edit) user
|
||||
"""
|
||||
serializer_class = UserManagementListSerializer
|
||||
permission_classes = [IsAuthenticated, AdminPermission]
|
||||
queryset = USER.objects.filter(is_superuser=False
|
||||
).prefetch_related('guardian_profile',
|
||||
'junior_profile'
|
||||
).exclude(junior_profile__isnull=True,
|
||||
guardian_profile__isnull=True).order_by('date_joined')
|
||||
filter_backends = (SearchFilter,)
|
||||
search_fields = ['first_name', 'last_name']
|
||||
http_method_names = ['get', 'post', 'patch']
|
||||
|
||||
def get_queryset(self):
|
||||
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
|
||||
queryset = self.queryset.filter(junior_profile__isnull=True)
|
||||
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
|
||||
queryset = self.queryset.filter(guardian_profile__isnull=True)
|
||||
else:
|
||||
queryset = self.queryset
|
||||
queryset = self.filter_queryset(queryset)
|
||||
return queryset
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
"""
|
||||
api method to list all the user
|
||||
:param request: user_type {'guardian' for Guardian list, 'junior' for Junior list}
|
||||
:return:
|
||||
"""
|
||||
queryset = self.get_queryset()
|
||||
queryset = queryset.filter(
|
||||
(Q(junior_profile__is_verified=True) | Q(guardian_profile__is_verified=True)))
|
||||
paginator = self.pagination_class()
|
||||
paginated_queryset = paginator.paginate_queryset(queryset, request)
|
||||
serializer = self.serializer_class(paginated_queryset, many=True)
|
||||
return custom_response(None, data=serializer.data, count=queryset.count())
|
||||
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
"""
|
||||
to get details of single user
|
||||
:param request: user_id along with
|
||||
user_type {'guardian' for Guardian, 'junior' for Junior} mandatory
|
||||
:return: user details
|
||||
"""
|
||||
if self.request.query_params.get('user_type') not in [dict(USER_TYPE).get('1'), dict(USER_TYPE).get('2')]:
|
||||
return custom_error_response(ERROR_CODE['2067'], status.HTTP_400_BAD_REQUEST)
|
||||
queryset = self.queryset
|
||||
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
|
||||
queryset = queryset.filter(guardian_profile__user__id=kwargs['pk'])
|
||||
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
|
||||
queryset = queryset.filter(junior_profile__auth__id=kwargs['pk'])
|
||||
serializer = UserManagementDetailSerializer(queryset, many=True)
|
||||
return custom_response(None, data=serializer.data)
|
||||
|
||||
def partial_update(self, request, *args, **kwargs):
|
||||
"""
|
||||
api method to update user detail (email, phone number)
|
||||
:param request: user_id along with
|
||||
user_type {'guardian' for Guardian, 'junior' for Junior} mandatory
|
||||
:return: success message
|
||||
"""
|
||||
if self.request.query_params.get('user_type') not in [dict(USER_TYPE).get('1'), dict(USER_TYPE).get('2')]:
|
||||
return custom_error_response(ERROR_CODE['2067'], status.HTTP_400_BAD_REQUEST)
|
||||
queryset = self.queryset
|
||||
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
|
||||
user_obj = queryset.filter(guardian_profile__user__id=kwargs['pk']).first()
|
||||
serializer = GuardianSerializer(user_obj.guardian_profile.all().first(),
|
||||
request.data, context={'user_id': kwargs['pk']})
|
||||
|
||||
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
|
||||
user_obj = queryset.filter(junior_profile__auth__id=kwargs['pk']).first()
|
||||
serializer = JuniorSerializer(user_obj.junior_profile.all().first(),
|
||||
request.data, context={'user_id': kwargs['pk']})
|
||||
|
||||
serializer.is_valid(raise_exception=True)
|
||||
serializer.save()
|
||||
return custom_response(SUCCESS_CODE['3037'])
|
||||
|
||||
@action(methods=['get'], url_name='change-status', url_path='change-status', detail=True)
|
||||
def change_status(self, request, *args, **kwargs):
|
||||
"""
|
||||
api to change user status (mark as active or inactive)
|
||||
:param request: user_id along with
|
||||
user_type {'guardian' for Guardian, 'junior' for Junior} mandatory
|
||||
:return: success message
|
||||
"""
|
||||
if self.request.query_params.get('user_type') not in [dict(USER_TYPE).get('1'), dict(USER_TYPE).get('2')]:
|
||||
return custom_error_response(ERROR_CODE['2067'], status.HTTP_400_BAD_REQUEST)
|
||||
queryset = self.queryset
|
||||
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
|
||||
user_obj = queryset.filter(guardian_profile__user__id=kwargs['pk']).first()
|
||||
obj = user_obj.guardian_profile.all().first()
|
||||
obj.is_active = False if obj.is_active else True
|
||||
obj.save()
|
||||
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
|
||||
user_obj = queryset.filter(junior_profile__auth__id=kwargs['pk']).first()
|
||||
obj = user_obj.junior_profile.all().first()
|
||||
obj.is_active = False if obj.is_active else True
|
||||
obj.save()
|
||||
return custom_response(SUCCESS_CODE['3038'])
|
||||
Reference in New Issue
Block a user