mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2026-10-23 09:37:56 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c46b2ef52c | ||
|
|
c47f6222d9 | ||
|
|
e9315beab9 | ||
|
|
a65eb2f77d | ||
|
|
f5a03e2fdf | ||
|
|
1028822908 | ||
|
|
e9aa2dfda9 | ||
|
|
ab1a2be679 | ||
|
|
11605540d7 | ||
|
|
8cd4864748 | ||
|
|
b1b7c42438 | ||
|
|
8f9450b743 | ||
|
|
bb3441e4ed |
@@ -17,6 +17,8 @@ from guardian.models import Guardian
|
|||||||
# multiple devices only
|
# multiple devices only
|
||||||
# user can login in single
|
# user can login in single
|
||||||
# device at a time"""
|
# device at a time"""
|
||||||
|
# force update
|
||||||
|
# use 308 status code for force update
|
||||||
|
|
||||||
def custom_response(custom_error, response_status = status.HTTP_404_NOT_FOUND):
|
def custom_response(custom_error, response_status = status.HTTP_404_NOT_FOUND):
|
||||||
"""custom response"""
|
"""custom response"""
|
||||||
@@ -45,7 +47,11 @@ class CustomMiddleware(object):
|
|||||||
api_endpoint = request.path
|
api_endpoint = request.path
|
||||||
if request.user.is_authenticated:
|
if request.user.is_authenticated:
|
||||||
# device details
|
# device details
|
||||||
device_details = UserDeviceDetails.objects.filter(user=request.user, device_id=device_id).last()
|
if device_id:
|
||||||
|
device_details = UserDeviceDetails.objects.filter(user=request.user, device_id=device_id).last()
|
||||||
|
if not device_details and api_endpoint != '/api/v1/user/login/':
|
||||||
|
custom_error = custom_error_response(ERROR_CODE['2037'], response_status=status.HTTP_404_NOT_FOUND)
|
||||||
|
response = custom_response(custom_error)
|
||||||
if user_type and str(user_type) == str(NUMBER['one']):
|
if user_type and str(user_type) == str(NUMBER['one']):
|
||||||
junior = Junior.objects.filter(auth=request.user, is_active=False).last()
|
junior = Junior.objects.filter(auth=request.user, is_active=False).last()
|
||||||
if junior:
|
if junior:
|
||||||
@@ -56,13 +62,11 @@ class CustomMiddleware(object):
|
|||||||
if guardian:
|
if guardian:
|
||||||
custom_error = custom_error_response(ERROR_CODE['2075'], response_status=status.HTTP_404_NOT_FOUND)
|
custom_error = custom_error_response(ERROR_CODE['2075'], response_status=status.HTTP_404_NOT_FOUND)
|
||||||
response = custom_response(custom_error)
|
response = custom_response(custom_error)
|
||||||
if device_id and not device_details and api_endpoint != '/api/v1/user/login/':
|
|
||||||
custom_error = custom_error_response(ERROR_CODE['2037'], response_status=status.HTTP_404_NOT_FOUND)
|
if version and device_type:
|
||||||
response = custom_response(custom_error)
|
force_update = ForceUpdate.objects.filter(version=version, device_type=device_type).last()
|
||||||
force_update = ForceUpdate.objects.filter(version=version, device_type=device_type).last()
|
if not force_update:
|
||||||
api_endpoint_checks = not any(endpoint in api_endpoint for endpoint in ['/admin/', '/api/v1/admin/'])
|
custom_error = custom_error_response(ERROR_CODE['2079'],
|
||||||
if not force_update and version and device_type:
|
response_status=status.HTTP_308_PERMANENT_REDIRECT)
|
||||||
custom_error = custom_error_response(ERROR_CODE['2079'],
|
response = custom_response(custom_error, status.HTTP_308_PERMANENT_REDIRECT)
|
||||||
response_status=status.HTTP_308_PERMANENT_REDIRECT)
|
|
||||||
response = custom_response(custom_error, status.HTTP_308_PERMANENT_REDIRECT)
|
|
||||||
return response
|
return response
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ class ChangePasswordSerializer(serializers.Serializer):
|
|||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
"""
|
"""
|
||||||
|
change password
|
||||||
"""
|
"""
|
||||||
new_password = validated_data.pop('new_password')
|
new_password = validated_data.pop('new_password')
|
||||||
current_password = validated_data.pop('current_password')
|
current_password = validated_data.pop('current_password')
|
||||||
@@ -392,7 +392,8 @@ class UserPhoneOtpSerializer(serializers.ModelSerializer):
|
|||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
class ForceUpdateSerializer(serializers.ModelSerializer):
|
class ForceUpdateSerializer(serializers.ModelSerializer):
|
||||||
# ForceUpdate Serializer
|
""" ForceUpdate Serializer
|
||||||
|
"""
|
||||||
|
|
||||||
class Meta(object):
|
class Meta(object):
|
||||||
""" meta info """
|
""" meta info """
|
||||||
|
|||||||
+1
-1
@@ -93,7 +93,7 @@ def junior_account_update(user_tb):
|
|||||||
# Update junior account
|
# Update junior account
|
||||||
junior_data.is_active = False
|
junior_data.is_active = False
|
||||||
junior_data.is_verified = False
|
junior_data.is_verified = False
|
||||||
junior_data.guardian_code = '{}'
|
junior_data.guardian_code = None
|
||||||
junior_data.guardian_code_status = str(NUMBER['one'])
|
junior_data.guardian_code_status = str(NUMBER['one'])
|
||||||
junior_data.is_deleted = True
|
junior_data.is_deleted = True
|
||||||
junior_data.save()
|
junior_data.save()
|
||||||
|
|||||||
+2
-1
@@ -43,7 +43,8 @@ FILE_SIZE = 5 * 1024 * 1024
|
|||||||
|
|
||||||
# String constant for configurable date for allocation lock period
|
# String constant for configurable date for allocation lock period
|
||||||
ALLOCATION_LOCK_DATE = 1
|
ALLOCATION_LOCK_DATE = 1
|
||||||
|
# guardian code status tuple
|
||||||
|
guardian_code_tuple = ('1','3')
|
||||||
"""user type"""
|
"""user type"""
|
||||||
USER_TYPE = (
|
USER_TYPE = (
|
||||||
('1', 'junior'),
|
('1', 'junior'),
|
||||||
|
|||||||
+6
-1
@@ -101,12 +101,17 @@ ERROR_CODE = {
|
|||||||
"2072": "You can not approve or reject this task because junior does not exist in the system",
|
"2072": "You can not approve or reject this task because junior does not exist in the system",
|
||||||
"2073": "You can not approve or reject this junior because junior does not exist in the system",
|
"2073": "You can not approve or reject this junior because junior does not exist in the system",
|
||||||
"2074": "You can not complete this task because you does not exist in the system",
|
"2074": "You can not complete this task because you does not exist in the system",
|
||||||
|
# deactivate account
|
||||||
"2075": "Your account is deactivated. Please contact with admin",
|
"2075": "Your account is deactivated. Please contact with admin",
|
||||||
"2076": "This junior already associate with you",
|
"2076": "This junior already associate with you",
|
||||||
"2077": "You can not add guardian",
|
"2077": "You can not add guardian",
|
||||||
"2078": "This junior is not associate with you",
|
"2078": "This junior is not associate with you",
|
||||||
|
# force update
|
||||||
"2079": "Please update your app version for enjoying uninterrupted services",
|
"2079": "Please update your app version for enjoying uninterrupted services",
|
||||||
"2080": "Can not add App version"
|
"2080": "Can not add App version",
|
||||||
|
"2081": "You can not add more than 3 guardian",
|
||||||
|
# guardian code not exist
|
||||||
|
"2082": "Guardian code does not exist"
|
||||||
|
|
||||||
}
|
}
|
||||||
"""Success message code"""
|
"""Success message code"""
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ from django.utils.translation import gettext as _
|
|||||||
|
|
||||||
# In this serializer file
|
# In this serializer file
|
||||||
# define user serializer,
|
# define user serializer,
|
||||||
|
# define password validation
|
||||||
# create guardian serializer,
|
# create guardian serializer,
|
||||||
# task serializer,
|
# task serializer,
|
||||||
# guardian serializer,
|
# guardian serializer,
|
||||||
@@ -47,6 +48,7 @@ from django.utils.translation import gettext as _
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
class PasswordValidator:
|
class PasswordValidator:
|
||||||
|
"""Password validation"""
|
||||||
def __init__(self, min_length=8, max_length=None, require_uppercase=True, require_numbers=True):
|
def __init__(self, min_length=8, max_length=None, require_uppercase=True, require_numbers=True):
|
||||||
self.min_length = min_length
|
self.min_length = min_length
|
||||||
self.max_length = max_length
|
self.max_length = max_length
|
||||||
@@ -57,6 +59,7 @@ class PasswordValidator:
|
|||||||
self.enforce_password_policy(value)
|
self.enforce_password_policy(value)
|
||||||
|
|
||||||
def enforce_password_policy(self, password):
|
def enforce_password_policy(self, password):
|
||||||
|
# add validation for password
|
||||||
special_characters = "!@#$%^&*()_-+=<>?/[]{}|"
|
special_characters = "!@#$%^&*()_-+=<>?/[]{}|"
|
||||||
if len(password) < self.min_length:
|
if len(password) < self.min_length:
|
||||||
raise serializers.ValidationError(
|
raise serializers.ValidationError(
|
||||||
@@ -64,16 +67,20 @@ class PasswordValidator:
|
|||||||
)
|
)
|
||||||
|
|
||||||
if self.max_length is not None and len(password) > self.max_length:
|
if self.max_length is not None and len(password) > self.max_length:
|
||||||
|
# must be 8 character
|
||||||
raise serializers.ValidationError(
|
raise serializers.ValidationError(
|
||||||
_("Password must be at most %(max_length)d characters long.") % {'max_length': self.max_length}
|
_("Password must be at most %(max_length)d characters long.") % {'max_length': self.max_length}
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.require_uppercase and not any(char.isupper() for char in password):
|
if self.require_uppercase and not any(char.isupper() for char in password):
|
||||||
|
# must contain upper case letter
|
||||||
raise serializers.ValidationError(_("Password must contain at least one uppercase letter."))
|
raise serializers.ValidationError(_("Password must contain at least one uppercase letter."))
|
||||||
|
|
||||||
if self.require_numbers and not any(char.isdigit() for char in password):
|
if self.require_numbers and not any(char.isdigit() for char in password):
|
||||||
|
# must contain digit
|
||||||
raise serializers.ValidationError(_("Password must contain at least one digit."))
|
raise serializers.ValidationError(_("Password must contain at least one digit."))
|
||||||
if self.require_numbers and not any(char in special_characters for char in password):
|
if self.require_numbers and not any(char in special_characters for char in password):
|
||||||
|
# must contain special character
|
||||||
raise serializers.ValidationError(_("Password must contain at least one special character."))
|
raise serializers.ValidationError(_("Password must contain at least one special character."))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -127,7 +127,7 @@ def update_expired_task_status(data=None):
|
|||||||
Update task of the status if due date is in past
|
Update task of the status if due date is in past
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
task_status = [str(NUMBER['one']), str(NUMBER['two']), str(NUMBER['four'])]
|
task_status = [str(NUMBER['one']), str(NUMBER['two'])]
|
||||||
JuniorTask.objects.filter(due_date__lt=datetime.today().date(),
|
JuniorTask.objects.filter(due_date__lt=datetime.today().date(),
|
||||||
task_status__in=task_status).update(task_status=str(NUMBER['six']))
|
task_status__in=task_status).update(task_status=str(NUMBER['six']))
|
||||||
except ObjectDoesNotExist as e:
|
except ObjectDoesNotExist as e:
|
||||||
|
|||||||
+5
-3
@@ -10,7 +10,7 @@ from rest_framework.permissions import IsAuthenticated
|
|||||||
from rest_framework import viewsets, status
|
from rest_framework import viewsets, status
|
||||||
from rest_framework.pagination import PageNumberPagination
|
from rest_framework.pagination import PageNumberPagination
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
from base.constants import guardian_code_tuple
|
||||||
from rest_framework.filters import SearchFilter
|
from rest_framework.filters import SearchFilter
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
@@ -178,7 +178,8 @@ class CreateTaskAPIView(viewsets.ModelViewSet):
|
|||||||
junior = request.data['junior']
|
junior = request.data['junior']
|
||||||
junior_id = Junior.objects.filter(id=junior).last()
|
junior_id = Junior.objects.filter(id=junior).last()
|
||||||
guardian_data = Guardian.objects.filter(user=request.user).last()
|
guardian_data = Guardian.objects.filter(user=request.user).last()
|
||||||
if guardian_data.guardian_code not in junior_id.guardian_code:
|
if (guardian_data.guardian_code not in junior_id.guardian_code or
|
||||||
|
junior_id.guardian_code_status in guardian_code_tuple):
|
||||||
return custom_error_response(ERROR_CODE['2078'], response_status=status.HTTP_400_BAD_REQUEST)
|
return custom_error_response(ERROR_CODE['2078'], response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
allowed_extensions = ['.jpg', '.jpeg', '.png']
|
allowed_extensions = ['.jpg', '.jpeg', '.png']
|
||||||
if not any(extension in str(image) for extension in allowed_extensions):
|
if not any(extension in str(image) for extension in allowed_extensions):
|
||||||
@@ -287,7 +288,8 @@ class ApproveJuniorAPIView(viewsets.ModelViewSet):
|
|||||||
if request.data['action'] == '1':
|
if request.data['action'] == '1':
|
||||||
# use ApproveJuniorSerializer serializer
|
# use ApproveJuniorSerializer serializer
|
||||||
serializer = ApproveJuniorSerializer(context={"guardian_code": guardian.guardian_code,
|
serializer = ApproveJuniorSerializer(context={"guardian_code": guardian.guardian_code,
|
||||||
"junior": junior_queryset, "action": request.data['action']},
|
"junior": junior_queryset,
|
||||||
|
"action": request.data['action']},
|
||||||
data=request.data)
|
data=request.data)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
# save serializer
|
# save serializer
|
||||||
|
|||||||
+28
-14
@@ -88,11 +88,16 @@ class CreateJuniorSerializer(serializers.ModelSerializer):
|
|||||||
if junior:
|
if junior:
|
||||||
"""update details according to the data get from request"""
|
"""update details according to the data get from request"""
|
||||||
junior.gender = validated_data.get('gender',junior.gender)
|
junior.gender = validated_data.get('gender',junior.gender)
|
||||||
"""Update guardian code"""
|
# Update guardian code"""
|
||||||
junior.guardian_code = validated_data.get('guardian_code', junior.guardian_code)
|
# condition for guardian code
|
||||||
"""condition for guardian code"""
|
|
||||||
if guardian_code:
|
if guardian_code:
|
||||||
junior.guardian_code = guardian_code
|
if not junior.guardian_code:
|
||||||
|
junior.guardian_code = []
|
||||||
|
junior.guardian_code.extend(guardian_code)
|
||||||
|
elif len(junior.guardian_code) < 3 and len(guardian_code) < 3:
|
||||||
|
junior.guardian_code.extend(guardian_code)
|
||||||
|
else:
|
||||||
|
raise serializers.ValidationError({"error":ERROR_CODE['2081'],"code":"400", "status":"failed"})
|
||||||
guardian_data = Guardian.objects.filter(guardian_code=guardian_code[0]).last()
|
guardian_data = Guardian.objects.filter(guardian_code=guardian_code[0]).last()
|
||||||
if guardian_data:
|
if guardian_data:
|
||||||
JuniorGuardianRelationship.objects.get_or_create(guardian=guardian_data, junior=junior)
|
JuniorGuardianRelationship.objects.get_or_create(guardian=guardian_data, junior=junior)
|
||||||
@@ -320,9 +325,11 @@ class RemoveJuniorSerializer(serializers.ModelSerializer):
|
|||||||
fields = ('id', 'is_invited')
|
fields = ('id', 'is_invited')
|
||||||
def update(self, instance, validated_data):
|
def update(self, instance, validated_data):
|
||||||
if instance:
|
if instance:
|
||||||
|
guardian_code = self.context['guardian_code']
|
||||||
instance.is_invited = False
|
instance.is_invited = False
|
||||||
instance.guardian_code = '{}'
|
instance.guardian_code.remove(guardian_code)
|
||||||
instance.guardian_code_status = str(NUMBER['one'])
|
if not instance.guardian_code:
|
||||||
|
instance.guardian_code_status = str(NUMBER['one'])
|
||||||
instance.save()
|
instance.save()
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
@@ -494,8 +501,6 @@ class ReAssignTaskSerializer(serializers.ModelSerializer):
|
|||||||
instance.save()
|
instance.save()
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class RemoveGuardianCodeSerializer(serializers.ModelSerializer):
|
class RemoveGuardianCodeSerializer(serializers.ModelSerializer):
|
||||||
"""User task Serializer"""
|
"""User task Serializer"""
|
||||||
class Meta(object):
|
class Meta(object):
|
||||||
@@ -503,24 +508,33 @@ class RemoveGuardianCodeSerializer(serializers.ModelSerializer):
|
|||||||
model = Junior
|
model = Junior
|
||||||
fields = ('id', )
|
fields = ('id', )
|
||||||
def update(self, instance, validated_data):
|
def update(self, instance, validated_data):
|
||||||
instance.guardian_code = None
|
guardian_code = self.context['guardian_code']
|
||||||
instance.guardian_code_status = str(NUMBER['one'])
|
if guardian_code in instance.guardian_code:
|
||||||
|
instance.guardian_code.remove(guardian_code)
|
||||||
|
else:
|
||||||
|
raise serializers.ValidationError({"error":ERROR_CODE['2082'],"code":"400", "status":"failed"})
|
||||||
|
if not instance.guardian_code:
|
||||||
|
instance.guardian_code_status = str(NUMBER['one'])
|
||||||
|
elif instance.guardian_code and (len(instance.guardian_code) == 1 and '-' in instance.guardian_code):
|
||||||
|
instance.guardian_code_status = str(NUMBER['one'])
|
||||||
|
else:
|
||||||
|
instance.guardian_code_status = str(NUMBER['two'])
|
||||||
instance.save()
|
instance.save()
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
class FAQSerializer(serializers.ModelSerializer):
|
class FAQSerializer(serializers.ModelSerializer):
|
||||||
# FAQ Serializer
|
"""FAQ Serializer"""
|
||||||
|
|
||||||
class Meta(object):
|
class Meta(object):
|
||||||
# meta info
|
"""meta info"""
|
||||||
model = FAQ
|
model = FAQ
|
||||||
fields = ('id', 'question', 'description')
|
fields = ('id', 'question', 'description')
|
||||||
|
|
||||||
class CreateArticleCardSerializer(serializers.ModelSerializer):
|
class CreateArticleCardSerializer(serializers.ModelSerializer):
|
||||||
# Article card Serializer
|
"""Article card Serializer"""
|
||||||
|
|
||||||
class Meta(object):
|
class Meta(object):
|
||||||
# meta info
|
"""meta info"""
|
||||||
model = ArticleCard
|
model = ArticleCard
|
||||||
fields = ('id', 'article')
|
fields = ('id', 'article')
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -62,5 +62,5 @@ urlpatterns = [
|
|||||||
path('api/v1/reassign-task/', ReAssignJuniorTaskAPIView.as_view()),
|
path('api/v1/reassign-task/', ReAssignJuniorTaskAPIView.as_view()),
|
||||||
path('api/v1/complete-article/', CompleteArticleAPIView.as_view()),
|
path('api/v1/complete-article/', CompleteArticleAPIView.as_view()),
|
||||||
path('api/v1/read-article-card/', ReadArticleCardAPIView.as_view()),
|
path('api/v1/read-article-card/', ReadArticleCardAPIView.as_view()),
|
||||||
path('api/v1/remove-guardian-code-request/', RemoveGuardianCodeAPIView.as_view()),
|
path('api/v1/remove-guardian-code-request/', RemoveGuardianCodeAPIView.as_view())
|
||||||
]
|
]
|
||||||
|
|||||||
+25
-11
@@ -99,7 +99,8 @@ class UpdateJuniorProfile(viewsets.ModelViewSet):
|
|||||||
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
|
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
|
||||||
return custom_error_response(serializer.errors, response_status=status.HTTP_400_BAD_REQUEST)
|
return custom_error_response(serializer.errors, response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
error_detail = e.detail.get('error', None)
|
||||||
|
return custom_error_response(error_detail, response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
class ValidateGuardianCode(viewsets.ModelViewSet):
|
class ValidateGuardianCode(viewsets.ModelViewSet):
|
||||||
"""Check guardian code exist or not"""
|
"""Check guardian code exist or not"""
|
||||||
@@ -190,6 +191,8 @@ class AddJuniorAPIView(viewsets.ModelViewSet):
|
|||||||
return custom_error_response(ERROR_CODE['2077'], response_status=status.HTTP_400_BAD_REQUEST)
|
return custom_error_response(ERROR_CODE['2077'], response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
elif not data:
|
elif not data:
|
||||||
return custom_error_response(ERROR_CODE['2076'], response_status=status.HTTP_400_BAD_REQUEST)
|
return custom_error_response(ERROR_CODE['2076'], response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
if data == "Max":
|
||||||
|
return custom_error_response(ERROR_CODE['2081'], response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
return custom_response(SUCCESS_CODE['3021'], response_status=status.HTTP_200_OK)
|
return custom_response(SUCCESS_CODE['3021'], response_status=status.HTTP_200_OK)
|
||||||
# use AddJuniorSerializer serializer
|
# use AddJuniorSerializer serializer
|
||||||
serializer = AddJuniorSerializer(data=request.data, context=info_data)
|
serializer = AddJuniorSerializer(data=request.data, context=info_data)
|
||||||
@@ -204,14 +207,18 @@ class AddJuniorAPIView(viewsets.ModelViewSet):
|
|||||||
def associate_guardian(self, user):
|
def associate_guardian(self, user):
|
||||||
junior = Junior.objects.filter(auth__email=self.request.data['email']).first()
|
junior = Junior.objects.filter(auth__email=self.request.data['email']).first()
|
||||||
guardian = Guardian.objects.filter(user=self.request.user).first()
|
guardian = Guardian.objects.filter(user=self.request.user).first()
|
||||||
|
if junior.guardian_code and ('-' in junior.guardian_code):
|
||||||
|
junior.guardian_code.remove('-')
|
||||||
if not junior:
|
if not junior:
|
||||||
return none
|
return none
|
||||||
if junior.guardian_code and (guardian.guardian_code in junior.guardian_code):
|
if junior.guardian_code and (guardian.guardian_code in junior.guardian_code):
|
||||||
return False
|
return False
|
||||||
if type(junior.guardian_code) is list:
|
if not junior.guardian_code:
|
||||||
|
junior.guardian_code = [guardian.guardian_code]
|
||||||
|
if type(junior.guardian_code) is list and len(junior.guardian_code) < 3:
|
||||||
junior.guardian_code.append(guardian.guardian_code)
|
junior.guardian_code.append(guardian.guardian_code)
|
||||||
else:
|
else:
|
||||||
junior.guardian_code = [guardian.guardian_code]
|
return "Max"
|
||||||
junior.guardian_code_status = str(NUMBER['two'])
|
junior.guardian_code_status = str(NUMBER['two'])
|
||||||
junior.save()
|
junior.save()
|
||||||
JuniorGuardianRelationship.objects.get_or_create(guardian=guardian, junior=junior,
|
JuniorGuardianRelationship.objects.get_or_create(guardian=guardian, junior=junior,
|
||||||
@@ -259,10 +266,10 @@ class FilterJuniorAPIView(viewsets.ModelViewSet):
|
|||||||
manual_parameters=[
|
manual_parameters=[
|
||||||
# Example of a query parameter
|
# Example of a query parameter
|
||||||
openapi.Parameter(
|
openapi.Parameter(
|
||||||
'title', # Query parameter name
|
'title',
|
||||||
openapi.IN_QUERY, # Parameter location
|
openapi.IN_QUERY,
|
||||||
description='title of the name',
|
description='title of the name',
|
||||||
type=openapi.TYPE_STRING, # Parameter type
|
type=openapi.TYPE_STRING,
|
||||||
),
|
),
|
||||||
# Add more parameters as needed
|
# Add more parameters as needed
|
||||||
]
|
]
|
||||||
@@ -308,7 +315,8 @@ class RemoveJuniorAPIView(views.APIView):
|
|||||||
guardian_code__icontains=str(guardian.guardian_code)).last()
|
guardian_code__icontains=str(guardian.guardian_code)).last()
|
||||||
if junior_queryset:
|
if junior_queryset:
|
||||||
# use RemoveJuniorSerializer serializer
|
# use RemoveJuniorSerializer serializer
|
||||||
serializer = RemoveJuniorSerializer(junior_queryset, data=request.data, partial=True)
|
serializer = RemoveJuniorSerializer(junior_queryset, context={"guardian_code":guardian.guardian_code},
|
||||||
|
data=request.data, partial=True)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
# save serializer
|
# save serializer
|
||||||
serializer.save()
|
serializer.save()
|
||||||
@@ -615,7 +623,7 @@ class CheckAnswerAPIView(viewsets.ModelViewSet):
|
|||||||
answer_id = self.request.GET.get('answer_id')
|
answer_id = self.request.GET.get('answer_id')
|
||||||
current_page = self.request.GET.get('current_page')
|
current_page = self.request.GET.get('current_page')
|
||||||
queryset = self.get_queryset()
|
queryset = self.get_queryset()
|
||||||
submit_ans = SurveyOption.objects.filter(id=answer_id, is_answer=True).last()
|
submit_ans = SurveyOption.objects.filter(id=answer_id).last()
|
||||||
junior_article_points = JuniorArticlePoints.objects.filter(junior__auth=self.request.user,
|
junior_article_points = JuniorArticlePoints.objects.filter(junior__auth=self.request.user,
|
||||||
question=queryset)
|
question=queryset)
|
||||||
if submit_ans:
|
if submit_ans:
|
||||||
@@ -718,16 +726,21 @@ class CreateArticleCardAPIView(viewsets.ModelViewSet):
|
|||||||
|
|
||||||
class RemoveGuardianCodeAPIView(views.APIView):
|
class RemoveGuardianCodeAPIView(views.APIView):
|
||||||
"""Remove guardian code request API
|
"""Remove guardian code request API
|
||||||
No Payload"""
|
Payload
|
||||||
|
{"guardian_code"
|
||||||
|
:"GRD037"
|
||||||
|
}"""
|
||||||
serializer_class = RemoveGuardianCodeSerializer
|
serializer_class = RemoveGuardianCodeSerializer
|
||||||
permission_classes = [IsAuthenticated]
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
def put(self, request, format=None):
|
def put(self, request, format=None):
|
||||||
try:
|
try:
|
||||||
|
guardian_code = self.request.data.get("guardian_code")
|
||||||
junior_queryset = Junior.objects.filter(auth=self.request.user).last()
|
junior_queryset = Junior.objects.filter(auth=self.request.user).last()
|
||||||
if junior_queryset:
|
if junior_queryset:
|
||||||
# use RemoveGuardianCodeSerializer serializer
|
# use RemoveGuardianCodeSerializer serializer
|
||||||
serializer = RemoveGuardianCodeSerializer(junior_queryset, data=request.data, partial=True)
|
serializer = RemoveGuardianCodeSerializer(junior_queryset, context = {"guardian_code":guardian_code},
|
||||||
|
data=request.data, partial=True)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
# save serializer
|
# save serializer
|
||||||
serializer.save()
|
serializer.save()
|
||||||
@@ -737,7 +750,8 @@ class RemoveGuardianCodeAPIView(views.APIView):
|
|||||||
# task in another state
|
# task in another state
|
||||||
return custom_error_response(ERROR_CODE['2047'], response_status=status.HTTP_400_BAD_REQUEST)
|
return custom_error_response(ERROR_CODE['2047'], response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
|
error_detail = e.detail.get('error', None)
|
||||||
|
return custom_error_response(error_detail, response_status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class FAQViewSet(GenericViewSet, mixins.CreateModelMixin,
|
class FAQViewSet(GenericViewSet, mixins.CreateModelMixin,
|
||||||
|
|||||||
@@ -219,8 +219,7 @@ class ArticleListSerializer(serializers.ModelSerializer):
|
|||||||
"""
|
"""
|
||||||
serializer for article API
|
serializer for article API
|
||||||
"""
|
"""
|
||||||
article_cards = ArticleCardSerializer(many=True)
|
image = serializers.SerializerMethodField('get_image')
|
||||||
article_survey = ArticleSurveySerializer(many=True)
|
|
||||||
total_points = serializers.SerializerMethodField('get_total_points')
|
total_points = serializers.SerializerMethodField('get_total_points')
|
||||||
is_completed = serializers.SerializerMethodField('get_is_completed')
|
is_completed = serializers.SerializerMethodField('get_is_completed')
|
||||||
|
|
||||||
@@ -229,12 +228,16 @@ class ArticleListSerializer(serializers.ModelSerializer):
|
|||||||
meta class
|
meta class
|
||||||
"""
|
"""
|
||||||
model = Article
|
model = Article
|
||||||
fields = ('id', 'title', 'description', 'article_cards', 'article_survey', 'total_points', 'is_completed')
|
fields = ('id', 'title', 'description','image', 'total_points', 'is_completed')
|
||||||
|
|
||||||
|
def get_image(self, obj):
|
||||||
|
"""article image"""
|
||||||
|
if obj.article_cards.first():
|
||||||
|
return obj.article_cards.first().image_url
|
||||||
|
return None
|
||||||
def get_total_points(self, obj):
|
def get_total_points(self, obj):
|
||||||
"""total points of article"""
|
"""total points of article"""
|
||||||
total_question = ArticleSurvey.objects.filter(article=obj).count()
|
return obj.article_survey.all().count() * NUMBER['five']
|
||||||
return total_question * NUMBER['five']
|
|
||||||
|
|
||||||
def get_is_completed(self, obj):
|
def get_is_completed(self, obj):
|
||||||
"""complete all question"""
|
"""complete all question"""
|
||||||
@@ -268,14 +271,14 @@ class ArticleQuestionSerializer(serializers.ModelSerializer):
|
|||||||
ans_obj = SurveyOption.objects.filter(survey=obj, is_answer=True).last()
|
ans_obj = SurveyOption.objects.filter(survey=obj, is_answer=True).last()
|
||||||
if ans_obj:
|
if ans_obj:
|
||||||
return ans_obj.id
|
return ans_obj.id
|
||||||
return str("None")
|
return None
|
||||||
|
|
||||||
def get_attempted_answer(self, obj):
|
def get_attempted_answer(self, obj):
|
||||||
"""attempt question or not"""
|
"""attempt question or not"""
|
||||||
context_data = self.context.get('user')
|
context_data = self.context.get('user')
|
||||||
junior_article_obj = JuniorArticlePoints.objects.filter(junior__auth=context_data,
|
junior_article_obj = JuniorArticlePoints.objects.filter(junior__auth=context_data,
|
||||||
question=obj, is_answer_correct=True).last()
|
question=obj).last()
|
||||||
if junior_article_obj:
|
if junior_article_obj and junior_article_obj.submitted_answer:
|
||||||
return junior_article_obj.submitted_answer.id
|
return junior_article_obj.submitted_answer.id
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -229,10 +229,7 @@ class ArticleListViewSet(GenericViewSet, mixins.ListModelMixin):
|
|||||||
http_method_names = ['get',]
|
http_method_names = ['get',]
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
article = self.queryset.objects.filter(is_deleted=False, is_published=True).prefetch_related(
|
queryset = self.queryset.objects.filter(is_deleted=False, is_published=True).order_by('-created_at')
|
||||||
'article_cards', 'article_survey', 'article_survey__options'
|
|
||||||
).order_by('-created_at')
|
|
||||||
queryset = self.filter_queryset(article)
|
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
|
|||||||
Reference in New Issue
Block a user