mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2025-11-27 17:14:55 +00:00
changed notification method, added celery task to notify expiring task
This commit is contained in:
@ -12,8 +12,9 @@ TASK_ASSIGNED = 8
|
||||
TASK_ACTION = 9
|
||||
TASK_REJECTED = 10
|
||||
TASK_APPROVED = 11
|
||||
|
||||
REMOVE_JUNIOR = 13
|
||||
PENDING_TASK_EXPIRING = 12
|
||||
IN_PROGRESS_TASK_EXPIRING = 13
|
||||
REMOVE_JUNIOR = 15
|
||||
|
||||
TEST_NOTIFICATION = 99
|
||||
|
||||
@ -22,16 +23,18 @@ NOTIFICATION_DICT = {
|
||||
"title": "Successfully registered!",
|
||||
"body": "You have registered successfully. Now login and complete your profile."
|
||||
},
|
||||
# user will receive notification as soon junior sign up application using their guardian code
|
||||
# for association
|
||||
ASSOCIATE_REQUEST: {
|
||||
"title": "Associate request!",
|
||||
"body": "You have request from {from_user} to associate with you."
|
||||
},
|
||||
|
||||
# Juniors will receive notification when custodians reject their request for associate
|
||||
ASSOCIATE_REJECTED: {
|
||||
"title": "Associate request rejected!",
|
||||
"body": "Your request to associate has been rejected by {from_user}."
|
||||
},
|
||||
|
||||
# Juniors will receive notification when custodians approve their request for associate
|
||||
ASSOCIATE_APPROVED: {
|
||||
"title": "Associate request approved!",
|
||||
"body": "Your request to associate has been approved by {from_user}."
|
||||
@ -54,7 +57,7 @@ NOTIFICATION_DICT = {
|
||||
# Guardian will receive notification as soon as junior send task for approval
|
||||
TASK_ACTION: {
|
||||
"title": "Task completion approval!",
|
||||
"body": "You have request from {from_user} for task completion."
|
||||
"body": "{from_user} completed her task {task_name}."
|
||||
},
|
||||
# Juniors will receive notification as soon as their task is rejected by custodians
|
||||
TASK_REJECTED: {
|
||||
@ -68,11 +71,24 @@ NOTIFICATION_DICT = {
|
||||
"body": "Your task completion request has been approved by {from_user}. "
|
||||
"Also you earned 5 points for successful completion."
|
||||
},
|
||||
# Juniors will receive notification when their task end date about to end
|
||||
PENDING_TASK_EXPIRING: {
|
||||
"title": "Task expiring soon!",
|
||||
"body": "Your task {task_name} is expiring soon. Please complete it."
|
||||
},
|
||||
# User will receive notification when their assigned task is about to end
|
||||
# and juniors have not performed any action
|
||||
IN_PROGRESS_TASK_EXPIRING: {
|
||||
"title": "Task expiring soon!",
|
||||
"body": "{from_user} didn't take any action on assigned task {task_name} and it's expiring soon. "
|
||||
"Please assist to complete it."
|
||||
},
|
||||
# Juniors will receive notification as soon as their custodians remove them from account
|
||||
REMOVE_JUNIOR: {
|
||||
"title": "Disassociate by guardian!",
|
||||
"body": "Your guardian has disassociated you."
|
||||
},
|
||||
# Test notification
|
||||
TEST_NOTIFICATION: {
|
||||
"title": "Test Notification",
|
||||
"body": "This notification is for testing purpose from {from_user}."
|
||||
|
||||
@ -11,7 +11,8 @@ from django.contrib.auth import get_user_model
|
||||
|
||||
from account.models import UserNotification
|
||||
from account.utils import get_user_full_name
|
||||
from guardian.models import Guardian
|
||||
from base.constants import GUARDIAN, JUNIOR
|
||||
from guardian.models import Guardian, JuniorTask
|
||||
from junior.models import Junior
|
||||
from notifications.constants import NOTIFICATION_DICT
|
||||
from notifications.models import Notification
|
||||
@ -42,44 +43,64 @@ def remove_fcm_token(user_id: int, access_token: str, registration_id) -> None:
|
||||
print(e)
|
||||
|
||||
|
||||
def get_basic_detail(from_user_id, to_user_id):
|
||||
def get_from_user_details(from_user_id, from_user_type):
|
||||
"""
|
||||
used to get the basic details
|
||||
used to get from user details
|
||||
"""
|
||||
from_user = User.objects.get(id=from_user_id) if from_user_id else None
|
||||
to_user = User.objects.get(id=to_user_id)
|
||||
return from_user, to_user
|
||||
from_user = None
|
||||
from_user_name = None
|
||||
from_user_image = None
|
||||
if from_user_id:
|
||||
if from_user_type == GUARDIAN:
|
||||
guardian = Guardian.objects.filter(user_id=from_user_id).select_related('user').first()
|
||||
from_user = guardian.user
|
||||
from_user_name = get_user_full_name(from_user)
|
||||
from_user_image = guardian.image
|
||||
elif from_user_type == JUNIOR:
|
||||
junior = Junior.objects.filter(auth_id=from_user_id).select_related('auth').first()
|
||||
from_user = junior.auth
|
||||
from_user_name = get_user_full_name(from_user)
|
||||
from_user_image = junior.image
|
||||
return from_user_name, from_user_image, from_user
|
||||
|
||||
|
||||
def get_notification_data(notification_type, from_user, to_user, extra_data):
|
||||
def get_notification_data(notification_type, from_user_id, from_user_type, to_user_id, extra_data):
|
||||
"""
|
||||
get notification and push data
|
||||
:param from_user_type: GUARDIAN or JUNIOR
|
||||
:param notification_type: notification_type
|
||||
:param from_user: from_user obj
|
||||
:param to_user: to_user obj
|
||||
:param from_user_id: from_user obj
|
||||
:param to_user_id: to_user obj
|
||||
:param extra_data: any extra data provided
|
||||
:return: notification and push data
|
||||
"""
|
||||
push_data = NOTIFICATION_DICT[notification_type].copy()
|
||||
notification_data = push_data.copy()
|
||||
notification_data['to_user'] = get_user_full_name(to_user)
|
||||
if from_user:
|
||||
from_user_name = get_user_full_name(from_user)
|
||||
push_data['body'] = push_data['body'].format(from_user=from_user_name)
|
||||
notification_data['body'] = notification_data['body'].format(from_user=from_user_name)
|
||||
notification_data['from_user'] = from_user_name
|
||||
task_name = None
|
||||
if 'task_id' in extra_data:
|
||||
task = JuniorTask.objects.filter(id=extra_data.get('task_id')).first()
|
||||
task_name = task.task_name
|
||||
extra_data['task_image'] = task.image if task.image else task.default_image
|
||||
|
||||
from_user_name, from_user_image, from_user = get_from_user_details(from_user_id, from_user_type)
|
||||
|
||||
push_data['body'] = push_data['body'].format(from_user=from_user_name, task_name=task_name)
|
||||
notification_data['body'] = notification_data['body'].format(from_user=from_user_name, task_name=task_name)
|
||||
notification_data['from_user'] = from_user_name
|
||||
notification_data['from_user_image'] = from_user_image
|
||||
|
||||
notification_data.update(extra_data)
|
||||
|
||||
return notification_data, push_data
|
||||
to_user = User.objects.get(id=to_user_id)
|
||||
return notification_data, push_data, from_user, to_user
|
||||
|
||||
|
||||
def send_notification(notification_type, from_user, to_user, extra_data):
|
||||
@shared_task()
|
||||
def send_notification(notification_type, from_user_id, from_user_type, to_user_id, extra_data):
|
||||
"""
|
||||
used to send the push for the given notification type
|
||||
"""
|
||||
# (from_user, to_user) = get_basic_detail(from_user_id, to_user_id)
|
||||
notification_data, push_data = get_notification_data(notification_type, from_user, to_user, extra_data)
|
||||
notification_data, push_data, from_user, to_user = get_notification_data(notification_type, from_user_id,
|
||||
from_user_type, to_user_id, extra_data)
|
||||
user_notification_type = UserNotification.objects.filter(user=to_user).first()
|
||||
notification_data.update({'badge': Notification.objects.filter(notification_to=to_user, is_read=False).count()})
|
||||
Notification.objects.create(notification_type=notification_type, notification_from=from_user,
|
||||
@ -104,14 +125,10 @@ def send_notification_to_guardian(notification_type, from_user_id, to_user_id, e
|
||||
:param extra_data:
|
||||
:return:
|
||||
"""
|
||||
from_user = None
|
||||
if from_user_id:
|
||||
from_user = Junior.objects.filter(auth_id=from_user_id).select_related('auth').first()
|
||||
from_user = Junior.objects.filter(auth_id=from_user_id).first()
|
||||
extra_data['from_user_image'] = from_user.image
|
||||
from_user = from_user.auth
|
||||
to_user = Guardian.objects.filter(user_id=to_user_id).select_related('user').first()
|
||||
extra_data['to_user_image'] = to_user.image
|
||||
send_notification(notification_type, from_user, to_user.user, extra_data)
|
||||
send_notification(notification_type, from_user_id, to_user_id, extra_data)
|
||||
|
||||
|
||||
@shared_task()
|
||||
@ -123,13 +140,9 @@ def send_notification_to_junior(notification_type, from_user_id, to_user_id, ext
|
||||
:param extra_data:
|
||||
:return:
|
||||
"""
|
||||
from_user = None
|
||||
if from_user_id:
|
||||
from_user = Guardian.objects.filter(user_id=from_user_id).select_related('user').first()
|
||||
from_user = Guardian.objects.filter(user_id=from_user_id).first()
|
||||
extra_data['from_user_image'] = from_user.image
|
||||
from_user = from_user.user
|
||||
to_user = Junior.objects.filter(auth_id=to_user_id).select_related('auth').first()
|
||||
extra_data['to_user_image'] = to_user.image
|
||||
send_notification(notification_type, from_user, to_user.auth, extra_data)
|
||||
send_notification(notification_type, from_user_id, to_user_id, extra_data)
|
||||
|
||||
|
||||
|
||||
@ -4,27 +4,35 @@ notifications views file
|
||||
# django imports
|
||||
from django.db.models import Q
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.permissions import IsAuthenticated, AllowAny
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import viewsets, status, views
|
||||
|
||||
# local imports
|
||||
from account.utils import custom_response, custom_error_response
|
||||
from base.constants import JUNIOR, GUARDIAN
|
||||
from base.messages import SUCCESS_CODE, ERROR_CODE
|
||||
from base.tasks import notify_task_expiry
|
||||
from guardian.models import Guardian
|
||||
from notifications.constants import TEST_NOTIFICATION
|
||||
# Import serializer
|
||||
from notifications.serializers import RegisterDevice, NotificationListSerializer, ReadNotificationSerializer
|
||||
from notifications.utils import send_notification, send_notification_to_guardian, send_notification_to_junior
|
||||
# Import model
|
||||
from notifications.utils import send_notification
|
||||
from notifications.models import Notification
|
||||
|
||||
|
||||
class NotificationViewSet(viewsets.GenericViewSet):
|
||||
""" used to do the notification actions """
|
||||
"""
|
||||
used to do the notification actions
|
||||
"""
|
||||
serializer_class = NotificationListSerializer
|
||||
permission_classes = [IsAuthenticated, ]
|
||||
|
||||
def list(self, request, *args, **kwargs) -> Response:
|
||||
""" list the notifications """
|
||||
"""
|
||||
to list user's notifications
|
||||
:param request:
|
||||
:return:
|
||||
"""
|
||||
queryset = Notification.objects.filter(notification_to_id=request.auth.payload['user_id']
|
||||
).select_related('notification_to').order_by('-id')
|
||||
paginator = self.pagination_class()
|
||||
@ -49,10 +57,8 @@ class NotificationViewSet(viewsets.GenericViewSet):
|
||||
to send test notification
|
||||
:return:
|
||||
"""
|
||||
send_notification_to_guardian.delay(TEST_NOTIFICATION, None, request.auth.payload['user_id'],
|
||||
{'task_id': None})
|
||||
send_notification_to_junior.delay(TEST_NOTIFICATION, None, request.auth.payload['user_id'],
|
||||
{'task_id': None})
|
||||
send_notification(TEST_NOTIFICATION, None, None, request.auth.payload['user_id'],
|
||||
{})
|
||||
return custom_response(SUCCESS_CODE["3000"])
|
||||
|
||||
@action(methods=['patch'], url_path='mark-as-read', url_name='mark-as-read', detail=False,
|
||||
@ -63,3 +69,12 @@ class NotificationViewSet(viewsets.GenericViewSet):
|
||||
"""
|
||||
Notification.objects.filter(id__in=request.data.get('id')).update(is_read=True)
|
||||
return custom_response(SUCCESS_CODE['3039'], response_status=status.HTTP_200_OK)
|
||||
|
||||
@action(methods=['get'], url_path='task', url_name='task', detail=False,
|
||||
permission_classes=[AllowAny])
|
||||
def task(self, request, *args, **kwargs):
|
||||
"""
|
||||
notification list
|
||||
"""
|
||||
notify_task_expiry()
|
||||
return custom_response(SUCCESS_CODE['3039'], response_status=status.HTTP_200_OK)
|
||||
|
||||
Reference in New Issue
Block a user