Compare commits

..
14 Commits
Author SHA1 Message Date
abutalib-kiwi 8f214d11a7 modified create task api, added badge count in notification list 2023-09-05 19:29:57 +05:30
dilipshrivastwa-kiwi b5a89df59a Merge pull request #304 from KiwiTechLLC/ZBKBCK-50
modified pagination in task list and junior task list api
2023-09-05 14:02:16 +05:30
abutalib-kiwi 5524eeed64 modified pagination in task list and junior task list api 2023-09-05 13:57:28 +05:30
dilipshrivastwa-kiwi aeaa7d7ab8 Merge pull request #303 from KiwiTechLLC/sprint6-bugs
handle scenerio for task after disassociate
2023-09-05 13:14:01 +05:30
dilipshrivastwa-kiwi 69be3bb2ac Merge pull request #302 from KiwiTechLLC/ZBKBCK-50
modified cors allowed origin values, added yml file for qa stage and …
2023-09-04 18:55:12 +05:30
abutalib-kiwi be9f600bcc modified cord allowed origin values, added yml file for qa stage and prod 2023-09-04 18:52:23 +05:30
jain 65d0932893 sonar issues 2023-09-04 16:52:50 +05:30
jain 9b14eedb18 handle scenerio for task after disassociate 2023-09-04 16:49:18 +05:30
dilipshrivastwa-kiwi 6c96ea0820 Merge pull request #301 from KiwiTechLLC/ZBKBCK-49
added cors Allow specific origins setting, unpublish article api, pag…
2023-09-04 16:08:22 +05:30
dilipshrivastwa-kiwi a93dc83bd1 Merge pull request #300 from KiwiTechLLC/sprint6-bugs
Sprint6 bugs
2023-09-04 15:27:42 +05:30
jain 116fb00358 optimized task status code 2023-09-04 15:22:15 +05:30
jain 20fa6e43da changes in task list API and add special character in password for added junior 2023-09-04 15:02:47 +05:30
dilipshrivastwa-kiwi 2cffc4e128 Merge pull request #299 from KiwiTechLLC/ZBKBCK-49
added and modifid pagination
2023-09-04 13:16:15 +05:30
jain 7b75a3233c add current page and total page in task list API 2023-09-04 12:52:04 +05:30
16 changed files with 269 additions and 82 deletions
@@ -1,7 +1,7 @@
{% extends "templated_email/email_base.email" %} {% extends "templated_email/email_base.email" %}
{% block subject %} {% block subject %}
{{subject}} Support Mail
{% endblock %} {% endblock %}
{% block plain %} {% block plain %}
+37 -4
View File
@@ -1,6 +1,6 @@
"""Account utils""" """Account utils"""
from celery import shared_task from celery import shared_task
import random
"""Import django""" """Import django"""
from django.conf import settings from django.conf import settings
from rest_framework import viewsets, status from rest_framework import viewsets, status
@@ -167,7 +167,7 @@ def user_device_details(user, device_id):
return False return False
def send_support_email(name, sender, subject, message): def send_support_email(name, sender, message):
"""Send otp on email with template""" """Send otp on email with template"""
to_email = [settings.EMAIL_FROM_ADDRESS] to_email = [settings.EMAIL_FROM_ADDRESS]
from_email = settings.DEFAULT_ADDRESS from_email = settings.DEFAULT_ADDRESS
@@ -179,7 +179,6 @@ def send_support_email(name, sender, subject, message):
context={ context={
'name': name.title(), 'name': name.title(),
'sender': sender, 'sender': sender,
'subject': subject,
'message': message 'message': message
} }
) )
@@ -191,7 +190,8 @@ def custom_response(detail, data=None, response_status=status.HTTP_200_OK, count
if not data: if not data:
"""when data is none""" """when data is none"""
data = None data = None
return Response({"data": data, "message": detail, "status": "success", "code": response_status, "count": count}) return Response({"data": data, "message": detail, "status": "success",
"code": response_status, "count": count})
def custom_error_response(detail, response_status): def custom_error_response(detail, response_status):
@@ -288,3 +288,36 @@ def get_user_full_name(user_obj):
to get user's full name to get user's full name
""" """
return f"{user_obj.first_name} {user_obj.last_name}" if user_obj.first_name or user_obj.last_name else "User" return f"{user_obj.first_name} {user_obj.last_name}" if user_obj.first_name or user_obj.last_name else "User"
def make_special_password(length=10):
# Define character sets
lowercase_letters = string.ascii_lowercase
uppercase_letters = string.ascii_uppercase
digits = string.digits
special_characters = '!@#$%^&*()_-+=<>?/[]{}|'
# Combine character sets
all_characters = lowercase_letters + uppercase_letters + digits + special_characters
# Create a password with random characters
password = (
random.choice(lowercase_letters) +
random.choice(uppercase_letters) +
random.choice(digits) +
random.choice(special_characters) +
''.join(random.choice(all_characters) for _ in range(length - 4))
)
# Shuffle the characters to make it more random
password_list = list(password)
random.shuffle(password_list)
return ''.join(password_list)
def task_status_fun(status_value):
"""task status"""
task_status_value = ['1']
if str(status_value) == '2':
task_status_value = ['2', '4']
elif str(status_value) == '3':
task_status_value = ['3', '5', '6']
return task_status_value
+2 -3
View File
@@ -689,11 +689,10 @@ class SendSupportEmail(views.APIView):
def post(self, request): def post(self, request):
name = request.data.get('name') name = request.data.get('name')
sender = request.data.get('email') sender = request.data.get('email')
subject = request.data.get('subject')
message = request.data.get('message') message = request.data.get('message')
if name and sender and subject and message: if name and sender and message:
try: try:
send_support_email(name, sender, subject, message) send_support_email(name, sender, message)
return custom_response(SUCCESS_CODE['3019'], response_status=status.HTTP_200_OK) return custom_response(SUCCESS_CODE['3019'], response_status=status.HTTP_200_OK)
except Exception as e: except Exception as e:
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
+4 -1
View File
@@ -111,7 +111,10 @@ ERROR_CODE = {
"2080": "Can not add App version", "2080": "Can not add App version",
"2081": "A junior can only be associated with a maximum of 3 guardian", "2081": "A junior can only be associated with a maximum of 3 guardian",
# guardian code not exist # guardian code not exist
"2082": "Guardian code does not exist" "2082": "Guardian code does not exist",
"2083": "You can not start this task because guardian is not associate with you",
"2084": "You can not complete this task because guardian is not associate with you",
"2085": "You can not take action on this task because junior is not associate with you"
} }
"""Success message code""" """Success message code"""
Binary file not shown.
+39
View File
@@ -0,0 +1,39 @@
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports:
- "8000:8000"
volumes:
- ./nginx:/etc/nginx/conf.d
- .:/usr/src/app
depends_on:
- web
web:
build: .
container_name: prod_django
restart: always
command: bash -c "pip install -r requirements.txt && python manage.py collectstatic --noinput && python manage.py migrate && gunicorn zod_bank.wsgi -b 0.0.0.0:8000 -t 300 --log-level=info"
volumes:
- .:/usr/src/app
broker:
image: rabbitmq:3.7
container_name: prod_rabbitmq
volumes:
- .:/usr/src/app
ports:
- 5673:5673
worker:
build: .
image: celery
container_name: prod_celery
restart: "always"
command: bash -c " celery -A zod_bank.celery worker --concurrency=1 -B -l DEBUG -E"
volumes:
- .:/usr/src/app
depends_on:
- broker
+39
View File
@@ -0,0 +1,39 @@
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports:
- "8000:8000"
volumes:
- ./nginx:/etc/nginx/conf.d
- .:/usr/src/app
depends_on:
- web
web:
build: .
container_name: qa_django
restart: always
command: bash -c "pip install -r requirements.txt && python manage.py collectstatic --noinput && python manage.py migrate && gunicorn zod_bank.wsgi -b 0.0.0.0:8000 -t 300 --log-level=info"
volumes:
- .:/usr/src/app
broker:
image: rabbitmq:3.7
container_name: qa_rabbitmq
volumes:
- .:/usr/src/app
ports:
- 5673:5673
worker:
build: .
image: celery
container_name: qa_celery
restart: "always"
command: bash -c " celery -A zod_bank.celery worker --concurrency=1 -B -l DEBUG -E"
volumes:
- .:/usr/src/app
depends_on:
- broker
+39
View File
@@ -0,0 +1,39 @@
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports:
- "8000:8000"
volumes:
- ./nginx:/etc/nginx/conf.d
- .:/usr/src/app
depends_on:
- web
web:
build: .
container_name: stage_django
restart: always
command: bash -c "pip install -r requirements.txt && python manage.py collectstatic --noinput && python manage.py migrate && gunicorn zod_bank.wsgi -b 0.0.0.0:8000 -t 300 --log-level=info"
volumes:
- .:/usr/src/app
broker:
image: rabbitmq:3.7
container_name: stage_rabbitmq
volumes:
- .:/usr/src/app
ports:
- 5673:5673
worker:
build: .
image: celery
container_name: stage_celery
restart: "always"
command: bash -c " celery -A zod_bank.celery worker --concurrency=1 -B -l DEBUG -E"
volumes:
- .:/usr/src/app
depends_on:
- broker
+8 -6
View File
@@ -28,7 +28,7 @@ from base.constants import NUMBER, JUN, ZOD, GRD, Already_register_user, GUARDIA
from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship
from .utils import real_time, convert_timedelta_into_datetime, update_referral_points from .utils import real_time, convert_timedelta_into_datetime, update_referral_points
# notification's constant # notification's constant
from notifications.constants import TASK_APPROVED, TASK_REJECTED from notifications.constants import TASK_APPROVED, TASK_REJECTED, TASK_ASSIGNED
# send notification function # send notification function
from notifications.utils import send_notification from notifications.utils import send_notification
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@@ -229,20 +229,22 @@ class TaskSerializer(serializers.ModelSerializer):
return value return value
def create(self, validated_data): def create(self, validated_data):
"""create default task image data""" """create default task image data"""
guardian = Guardian.objects.filter(user=self.context['user']).last() guardian = self.context['guardian']
# update image of the task # update image of the task
images = self.context['image'] images = self.context['image']
junior_ids = self.context['junior_data'] junior_data = self.context['junior_data']
junior_data = junior_ids[0].split(',')
tasks_created = [] tasks_created = []
for junior_id in junior_data: for junior in junior_data:
# create task
task_data = validated_data.copy() task_data = validated_data.copy()
task_data['guardian'] = guardian task_data['guardian'] = guardian
task_data['default_image'] = images task_data['default_image'] = images
task_data['junior'] = Junior.objects.filter(id=junior_id).last() task_data['junior'] = junior
instance = JuniorTask.objects.create(**task_data) instance = JuniorTask.objects.create(**task_data)
tasks_created.append(instance) tasks_created.append(instance)
send_notification.delay(TASK_ASSIGNED, guardian.user.id, GUARDIAN,
junior.auth.id, {'task_id': instance.id})
return instance return instance
class GuardianDetailSerializer(serializers.ModelSerializer): class GuardianDetailSerializer(serializers.ModelSerializer):
+52 -43
View File
@@ -1,4 +1,5 @@
"""Views of Guardian""" """Views of Guardian"""
import math
# django imports # django imports
# Import IsAuthenticated # Import IsAuthenticated
@@ -16,6 +17,7 @@ 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
from base.pagination import CustomPageNumberPagination
# Import guardian's model, # Import guardian's model,
# Import junior's model, # Import junior's model,
# Import account's model, # Import account's model,
@@ -36,7 +38,7 @@ from .models import Guardian, JuniorTask
from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship
from account.models import UserEmailOtp, UserNotification, UserDeviceDetails from account.models import UserEmailOtp, UserNotification, UserDeviceDetails
from .tasks import generate_otp from .tasks import generate_otp
from account.utils import custom_response, custom_error_response, OTP_EXPIRY, send_otp_email from account.utils import custom_response, custom_error_response, send_otp_email, task_status_fun
from base.messages import ERROR_CODE, SUCCESS_CODE from base.messages import ERROR_CODE, SUCCESS_CODE
from base.constants import NUMBER, GUARDIAN_CODE_STATUS, GUARDIAN from base.constants import NUMBER, GUARDIAN_CODE_STATUS, GUARDIAN
from .utils import upload_image_to_alibaba from .utils import upload_image_to_alibaba
@@ -135,7 +137,8 @@ class TaskListAPIView(viewsets.ModelViewSet):
Params Params
status status
search search
page""" page
junior"""
serializer_class = TaskDetailsSerializer serializer_class = TaskDetailsSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
filter_backends = (SearchFilter,) filter_backends = (SearchFilter,)
@@ -145,8 +148,8 @@ class TaskListAPIView(viewsets.ModelViewSet):
def get_queryset(self): def get_queryset(self):
queryset = JuniorTask.objects.filter(guardian__user=self.request.user queryset = JuniorTask.objects.filter(guardian__user=self.request.user
).prefetch_related('junior', 'junior__auth' ).select_related('junior', 'junior__auth'
).order_by('due_date', 'created_at') ).order_by('due_date', 'created_at')
queryset = self.filter_queryset(queryset) queryset = self.filter_queryset(queryset)
return queryset return queryset
@@ -154,15 +157,19 @@ class TaskListAPIView(viewsets.ModelViewSet):
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
"""Create guardian profile""" """Create guardian profile"""
status_value = self.request.GET.get('status') status_value = self.request.GET.get('status')
junior = self.request.GET.get('junior')
queryset = self.get_queryset() queryset = self.get_queryset()
if status_value and status_value != '0': task_status = task_status_fun(status_value)
queryset = queryset.filter(task_status=status_value) if status_value:
paginator = self.pagination_class() queryset = queryset.filter(task_status__in=task_status)
if junior:
queryset = queryset.filter(junior=int(junior))
paginator = CustomPageNumberPagination()
# use Pagination # use Pagination
paginated_queryset = paginator.paginate_queryset(queryset, request) paginated_queryset = paginator.paginate_queryset(queryset, request)
# use TaskDetailsSerializer serializer # use TaskDetailsSerializer serializer
serializer = self.serializer_class(paginated_queryset, many=True) serializer = self.serializer_class(paginated_queryset, many=True)
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) return paginator.get_paginated_response(serializer.data)
class CreateTaskAPIView(viewsets.ModelViewSet): class CreateTaskAPIView(viewsets.ModelViewSet):
@@ -177,48 +184,48 @@ class CreateTaskAPIView(viewsets.ModelViewSet):
""" """
try: try:
image = request.data['default_image'] image = request.data['default_image']
juniors = request.data['junior'].split(',') junior_ids = request.data['junior'].split(',')
for junior in juniors: # if not junior.isnumeric():
junior_id = Junior.objects.filter(id=junior).last() # """junior value must be integer"""
if junior_id: # return custom_error_response(ERROR_CODE['2047'], response_status=status.HTTP_400_BAD_REQUEST)
guardian_data = Guardian.objects.filter(user=request.user).last() allowed_extensions = ['.jpg', '.jpeg', '.png']
index = junior_id.guardian_code.index(guardian_data.guardian_code) if not any(extension in str(image) for extension in allowed_extensions):
status_index = junior_id.guardian_code_status[index] return custom_error_response(ERROR_CODE['2048'], response_status=status.HTTP_400_BAD_REQUEST)
if 'https' in str(image):
image_data = image
else:
filename = f"images/{image}"
if image and image.size == NUMBER['zero']:
return custom_error_response(ERROR_CODE['2035'],
response_status=status.HTTP_400_BAD_REQUEST)
image_data = upload_image_to_alibaba(image, filename)
request.data.pop('default_image')
guardian = Guardian.objects.filter(user=request.user).select_related('user').last()
junior_data = Junior.objects.filter(id__in=junior_ids).select_related('auth')
for junior in junior_data:
if junior:
index = junior.guardian_code.index(guardian.guardian_code)
status_index = junior.guardian_code_status[index]
if status_index == str(NUMBER['three']): if status_index == str(NUMBER['three']):
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']
if not any(extension in str(image) for extension in allowed_extensions):
return custom_error_response(ERROR_CODE['2048'], response_status=status.HTTP_400_BAD_REQUEST)
if not junior.isnumeric():
"""junior value must be integer"""
return custom_error_response(ERROR_CODE['2047'], response_status=status.HTTP_400_BAD_REQUEST)
data = request.data
if 'https' in str(image):
image_data = image
else:
filename = f"images/{image}"
if image and image.size == NUMBER['zero']:
return custom_error_response(ERROR_CODE['2035'], response_status=status.HTTP_400_BAD_REQUEST)
image_url = upload_image_to_alibaba(image, filename)
image_data = image_url
data.pop('default_image')
junior_data = data.pop('junior')
# use TaskSerializer serializer
serializer = TaskSerializer(context={"user":request.user, "image":image_data,
"junior_data":junior_data}, data=data)
if serializer.is_valid():
# save serializer
task = serializer.save()
send_notification.delay(TASK_ASSIGNED, request.auth.payload['user_id'], GUARDIAN,
junior_id.auth.id, {'task_id': task.id})
return custom_response(SUCCESS_CODE['3018'], response_status=status.HTTP_200_OK)
return custom_error_response(serializer.errors, response_status=status.HTTP_400_BAD_REQUEST)
else: else:
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)
# use TaskSerializer serializer
serializer = TaskSerializer(context={"guardian": guardian, "image": image_data,
"junior_data": junior_data}, data=request.data)
if serializer.is_valid():
# save serializer
serializer.save()
# removed send notification method and used in serializer
return custom_response(SUCCESS_CODE['3018'], response_status=status.HTTP_200_OK)
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) return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
class SearchTaskListAPIView(viewsets.ModelViewSet): class SearchTaskListAPIView(viewsets.ModelViewSet):
"""Filter task""" """Filter task"""
serializer_class = TaskDetailsSerializer serializer_class = TaskDetailsSerializer
@@ -347,6 +354,8 @@ class ApproveTaskAPIView(viewsets.ModelViewSet):
task_queryset = JuniorTask.objects.filter(id=self.request.data.get('task_id'), task_queryset = JuniorTask.objects.filter(id=self.request.data.get('task_id'),
guardian=guardian, guardian=guardian,
junior=self.request.data.get('junior_id')).last() junior=self.request.data.get('junior_id')).last()
if task_queryset and guardian.guardian_code not in task_queryset.junior.guardian_code:
return custom_error_response(ERROR_CODE['2084'], response_status=status.HTTP_400_BAD_REQUEST)
if task_queryset and (task_queryset.junior.is_deleted or not task_queryset.junior.is_active): if task_queryset and (task_queryset.junior.is_deleted or not task_queryset.junior.is_active):
return custom_error_response(ERROR_CODE['2072'], response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(ERROR_CODE['2072'], response_status=status.HTTP_400_BAD_REQUEST)
# use ApproveJuniorSerializer serializer # use ApproveJuniorSerializer serializer
+4 -4
View File
@@ -11,7 +11,7 @@ from django.utils import timezone
from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.tokens import RefreshToken
# local imports # local imports
from account.utils import send_otp_email, generate_code from account.utils import send_otp_email, generate_code, make_special_password
from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship, JuniorArticlePoints, FAQ from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship, JuniorArticlePoints, FAQ
from guardian.tasks import generate_otp from guardian.tasks import generate_otp
from base.messages import ERROR_CODE, SUCCESS_CODE from base.messages import ERROR_CODE, SUCCESS_CODE
@@ -297,8 +297,8 @@ class AddJuniorSerializer(serializers.ModelSerializer):
user_data = User.objects.create(username=email, email=email, user_data = User.objects.create(username=email, email=email,
first_name=self.context['first_name'], first_name=self.context['first_name'],
last_name=self.context['last_name']) last_name=self.context['last_name'])
password = User.objects.make_random_password() special_password = make_special_password()
user_data.set_password(password) user_data.set_password(special_password)
user_data.save() user_data.save()
junior_data = Junior.objects.create(auth=user_data, gender=validated_data.get('gender'), junior_data = Junior.objects.create(auth=user_data, gender=validated_data.get('gender'),
image=profile_image, image=profile_image,
@@ -321,7 +321,7 @@ class AddJuniorSerializer(serializers.ModelSerializer):
# add push notification # add push notification
UserNotification.objects.get_or_create(user=user_data) UserNotification.objects.get_or_create(user=user_data)
"""Notification email""" """Notification email"""
junior_notification_email.delay(email, full_name, email, password) junior_notification_email.delay(email, full_name, email, special_password)
# push notification # push notification
send_notification.delay(ASSOCIATE_JUNIOR, None, None, junior_data.auth.id, {}) send_notification.delay(ASSOCIATE_JUNIOR, None, None, junior_data.auth.id, {})
return junior_data return junior_data
+19 -9
View File
@@ -12,6 +12,10 @@ import datetime
import requests import requests
from rest_framework.viewsets import GenericViewSet, mixins from rest_framework.viewsets import GenericViewSet, mixins
import math
from base.pagination import CustomPageNumberPagination
"""Django app import""" """Django app import"""
from drf_yasg.utils import swagger_auto_schema from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi from drf_yasg import openapi
@@ -43,7 +47,7 @@ from guardian.models import Guardian, JuniorTask
from guardian.serializers import TaskDetailsSerializer, TaskDetailsjuniorSerializer from guardian.serializers import TaskDetailsSerializer, TaskDetailsjuniorSerializer
from base.messages import ERROR_CODE, SUCCESS_CODE from base.messages import ERROR_CODE, SUCCESS_CODE
from base.constants import NUMBER, ARTICLE_STATUS, none, GUARDIAN from base.constants import NUMBER, ARTICLE_STATUS, none, GUARDIAN
from account.utils import custom_response, custom_error_response from account.utils import custom_response, custom_error_response, task_status_fun
from guardian.utils import upload_image_to_alibaba from guardian.utils import upload_image_to_alibaba
from .utils import update_positions_based_on_points from .utils import update_positions_based_on_points
from notifications.utils import send_notification from notifications.utils import send_notification
@@ -353,8 +357,8 @@ class JuniorTaskListAPIView(viewsets.ModelViewSet):
def get_queryset(self): def get_queryset(self):
queryset = JuniorTask.objects.filter(junior__auth=self.request.user queryset = JuniorTask.objects.filter(junior__auth=self.request.user
).prefetch_related('junior', 'junior__auth' ).select_related('junior', 'junior__auth'
).order_by('due_date', 'created_at') ).order_by('due_date', 'created_at')
queryset = self.filter_queryset(queryset) queryset = self.filter_queryset(queryset)
return queryset return queryset
@@ -367,14 +371,15 @@ class JuniorTaskListAPIView(viewsets.ModelViewSet):
try: try:
status_value = self.request.GET.get('status') status_value = self.request.GET.get('status')
queryset = self.get_queryset() queryset = self.get_queryset()
if status_value and status_value != '0': task_status = task_status_fun(status_value)
queryset = queryset.filter(task_status=status_value) if status_value:
paginator = self.pagination_class() queryset = queryset.filter(task_status__in=task_status)
paginator = CustomPageNumberPagination()
# use Pagination # use Pagination
paginated_queryset = paginator.paginate_queryset(queryset, request) paginated_queryset = paginator.paginate_queryset(queryset, request)
# use TaskDetails juniorSerializer serializer # use TaskDetails juniorSerializer serializer
serializer = self.serializer_class(paginated_queryset, many=True) serializer = self.serializer_class(paginated_queryset, many=True)
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) return paginator.get_paginated_response(serializer.data)
except Exception as e: except Exception as e:
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)
@@ -403,10 +408,12 @@ class CompleteJuniorTaskAPIView(views.APIView):
task_queryset = JuniorTask.objects.filter(id=task_id, junior__auth__email=self.request.user task_queryset = JuniorTask.objects.filter(id=task_id, junior__auth__email=self.request.user
).select_related('guardian', 'junior').last() ).select_related('guardian', 'junior').last()
if task_queryset: if task_queryset:
if task_queryset.junior.is_deleted or not task_queryset.junior.is_active: if task_queryset.guardian.guardian_code not in task_queryset.junior.guardian_code:
return custom_error_response(ERROR_CODE['2085'], response_status=status.HTTP_400_BAD_REQUEST)
elif task_queryset.junior.is_deleted or not task_queryset.junior.is_active:
return custom_error_response(ERROR_CODE['2074'], response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(ERROR_CODE['2074'], response_status=status.HTTP_400_BAD_REQUEST)
# use CompleteTaskSerializer serializer # use CompleteTaskSerializer serializer
if task_queryset.task_status in [str(NUMBER['four']), str(NUMBER['five'])]: elif task_queryset.task_status in [str(NUMBER['four']), str(NUMBER['five'])]:
"""Already request send """ """Already request send """
return custom_error_response(ERROR_CODE['2049'], response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(ERROR_CODE['2049'], response_status=status.HTTP_400_BAD_REQUEST)
serializer = CompleteTaskSerializer(task_queryset, data={'image': image_url}, partial=True) serializer = CompleteTaskSerializer(task_queryset, data={'image': image_url}, partial=True)
@@ -511,7 +518,10 @@ class StartTaskAPIView(views.APIView):
try: try:
task_id = self.request.data.get('task_id') task_id = self.request.data.get('task_id')
task_queryset = JuniorTask.objects.filter(id=task_id, junior__auth__email=self.request.user).last() task_queryset = JuniorTask.objects.filter(id=task_id, junior__auth__email=self.request.user).last()
print("task_queryset==>",task_queryset)
if task_queryset and task_queryset.task_status == str(NUMBER['one']): if task_queryset and task_queryset.task_status == str(NUMBER['one']):
if task_queryset.guardian.guardian_code not in task_queryset.junior.guardian_code:
return custom_error_response(ERROR_CODE['2083'], response_status=status.HTTP_400_BAD_REQUEST)
# use StartTaskSerializer serializer # use StartTaskSerializer serializer
serializer = StartTaskSerializer(task_queryset, data=request.data, partial=True) serializer = StartTaskSerializer(task_queryset, data=request.data, partial=True)
if serializer.is_valid(): if serializer.is_valid():
+1 -1
View File
@@ -22,7 +22,7 @@ ARTICLE_REWARD_POINTS = 17
REMOVE_JUNIOR = 18 REMOVE_JUNIOR = 18
TEST_NOTIFICATION = 99 TEST_NOTIFICATION = 99
# notification dictionary
NOTIFICATION_DICT = { NOTIFICATION_DICT = {
REGISTRATION: { REGISTRATION: {
"title": "Successfully registered!", "title": "Successfully registered!",
+6 -1
View File
@@ -31,11 +31,16 @@ class RegisterDevice(serializers.Serializer):
class NotificationListSerializer(serializers.ModelSerializer): class NotificationListSerializer(serializers.ModelSerializer):
"""List of notification""" """List of notification"""
badge = serializers.SerializerMethodField()
class Meta(object): class Meta(object):
"""meta info""" """meta info"""
model = Notification model = Notification
fields = ['id', 'data', 'is_read', 'created_at'] fields = ['id', 'data', 'badge', 'is_read', 'created_at']
@staticmethod
def get_badge(obj):
return Notification.objects.filter(notification_to=obj.notification_to, is_read=False).count()
class ReadNotificationSerializer(serializers.ModelSerializer): class ReadNotificationSerializer(serializers.ModelSerializer):
+1 -1
View File
@@ -230,7 +230,7 @@ class DefaultArticleCardImagesViewSet(GenericViewSet, mixins.CreateModelMixin, m
:param request: :param request:
:return: default article card images :return: default article card images
""" """
queryset = self.queryset queryset = self.get_queryset()
serializer = self.serializer_class(queryset, many=True) serializer = self.serializer_class(queryset, many=True)
return custom_response(None, data=serializer.data) return custom_response(None, data=serializer.data)
+17 -8
View File
@@ -35,19 +35,28 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = os.getenv('SECRET_KEY') SECRET_KEY = os.getenv('SECRET_KEY')
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.getenv('DEBUG') DEBUG = os.getenv('DEBUG')
ENV = os.getenv('ENV')
# cors allow setting # cors allow setting
CORS_ORIGIN_ALLOW_ALL = False CORS_ORIGIN_ALLOW_ALL = False
# Allow specific origins # Allow specific origins
CORS_ALLOWED_ORIGINS = [ if ENV in ['dev', 'qa', 'stage']:
"https://dev-api.zodqaapp.com", CORS_ALLOWED_ORIGINS = [
"https://qa-api.zodqaapp.com", # backend base url
"https://stage-api.zodqaapp.com", "https://dev-api.zodqaapp.com",
# Add more trusted origins as needed "https://qa-api.zodqaapp.com",
] "https://stage-api.zodqaapp.com",
# if DEBUG:
# CORS_ALLOWED_ORIGINS += ["http://localhost:3000"] # frontend url
"http://localhost:3000",
"https://zod-dev.zodqaapp.com",
"https://zod-qa.zodqaapp.com",
"https://zod-stage.zodqaapp.com",
# Add more trusted origins as needed
]
if ENV == "prod":
CORS_ALLOWED_ORIGINS = []
# allow all host # allow all host
ALLOWED_HOSTS = ['*'] ALLOWED_HOSTS = ['*']