mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2025-08-26 06:09:41 +00:00
added notification when admin adds a new article
This commit is contained in:
@ -68,7 +68,7 @@ def notify_top_junior():
|
|||||||
task to send notification for top leaderboard junior to all junior's
|
task to send notification for top leaderboard junior to all junior's
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
junior_points_qs = JuniorPoints.objects.prefetch_related('junior', 'junior__auth').annotate(rank=Window(
|
junior_points_qs = JuniorPoints.objects.select_related('junior', 'junior__auth').annotate(rank=Window(
|
||||||
expression=Rank(),
|
expression=Rank(),
|
||||||
order_by=[F('total_points').desc(), 'junior__created_at']
|
order_by=[F('total_points').desc(), 'junior__created_at']
|
||||||
)).order_by('-total_points', 'junior__created_at')
|
)).order_by('-total_points', 'junior__created_at')
|
||||||
@ -76,9 +76,8 @@ def notify_top_junior():
|
|||||||
prev_top_position = junior_points_qs.filter(position=1).first()
|
prev_top_position = junior_points_qs.filter(position=1).first()
|
||||||
new_top_position = junior_points_qs.filter(rank=1).first()
|
new_top_position = junior_points_qs.filter(rank=1).first()
|
||||||
if prev_top_position != new_top_position:
|
if prev_top_position != new_top_position:
|
||||||
to_user_list = [junior_point.junior.auth for junior_point in junior_points_qs]
|
|
||||||
send_notification_multiple_user(TOP_JUNIOR, new_top_position.junior.auth.id, JUNIOR,
|
send_notification_multiple_user(TOP_JUNIOR, new_top_position.junior.auth.id, JUNIOR,
|
||||||
to_user_list, {'points': new_top_position.total_points})
|
{'points': new_top_position.total_points})
|
||||||
for junior_point in junior_points_qs:
|
for junior_point in junior_points_qs:
|
||||||
junior_point.position = junior_point.rank
|
junior_point.position = junior_point.rank
|
||||||
junior_point.save()
|
junior_point.save()
|
||||||
|
Binary file not shown.
@ -255,7 +255,7 @@ class TopJuniorListAPIView(viewsets.ModelViewSet):
|
|||||||
return context
|
return context
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
queryset = JuniorPoints.objects.prefetch_related('junior', 'junior__auth').annotate(rank=Window(
|
queryset = JuniorPoints.objects.select_related('junior', 'junior__auth').annotate(rank=Window(
|
||||||
expression=Rank(),
|
expression=Rank(),
|
||||||
order_by=[F('total_points').desc(), 'junior__created_at']
|
order_by=[F('total_points').desc(), 'junior__created_at']
|
||||||
)).order_by('-total_points', 'junior__created_at')
|
)).order_by('-total_points', 'junior__created_at')
|
||||||
|
@ -70,7 +70,7 @@ def get_junior_leaderboard_rank(junior_obj):
|
|||||||
:param junior_obj:
|
:param junior_obj:
|
||||||
:return: junior's position/rank
|
:return: junior's position/rank
|
||||||
"""
|
"""
|
||||||
queryset = JuniorPoints.objects.prefetch_related('junior', 'junior__auth').annotate(rank=Window(
|
queryset = JuniorPoints.objects.select_related('junior', 'junior__auth').annotate(rank=Window(
|
||||||
expression=Rank(),
|
expression=Rank(),
|
||||||
order_by=[F('total_points').desc(), 'junior__created_at']
|
order_by=[F('total_points').desc(), 'junior__created_at']
|
||||||
)).order_by('-total_points', 'junior__created_at')
|
)).order_by('-total_points', 'junior__created_at')
|
||||||
|
@ -14,10 +14,10 @@ TASK_REJECTED = 10
|
|||||||
TASK_APPROVED = 11
|
TASK_APPROVED = 11
|
||||||
PENDING_TASK_EXPIRING = 12
|
PENDING_TASK_EXPIRING = 12
|
||||||
IN_PROGRESS_TASK_EXPIRING = 13
|
IN_PROGRESS_TASK_EXPIRING = 13
|
||||||
|
|
||||||
TOP_JUNIOR = 14
|
TOP_JUNIOR = 14
|
||||||
|
|
||||||
REMOVE_JUNIOR = 15
|
NEW_ARTICLE_PUBLISHED = 15
|
||||||
|
REMOVE_JUNIOR = 16
|
||||||
|
|
||||||
TEST_NOTIFICATION = 99
|
TEST_NOTIFICATION = 99
|
||||||
|
|
||||||
@ -68,7 +68,8 @@ NOTIFICATION_DICT = {
|
|||||||
"title": "Task completion approval!",
|
"title": "Task completion approval!",
|
||||||
"body": "{from_user} completed her task {task_name}."
|
"body": "{from_user} completed her task {task_name}."
|
||||||
},
|
},
|
||||||
# Juniors will receive notification as soon as their task is rejected by custodians
|
# Juniors will receive notification as soon
|
||||||
|
# as their task is rejected by custodians
|
||||||
TASK_REJECTED: {
|
TASK_REJECTED: {
|
||||||
"title": "Task completion rejected!",
|
"title": "Task completion rejected!",
|
||||||
"body": "Your task completion request has been rejected by {from_user}."
|
"body": "Your task completion request has been rejected by {from_user}."
|
||||||
@ -92,11 +93,18 @@ NOTIFICATION_DICT = {
|
|||||||
"body": "{from_user} didn't take any action on assigned task {task_name} and it's 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."
|
"Please assist to complete it."
|
||||||
},
|
},
|
||||||
# Juniors will receive Notification related to Leaderboard progress
|
# Juniors will receive Notification
|
||||||
|
# related to Leaderboard progress
|
||||||
TOP_JUNIOR: {
|
TOP_JUNIOR: {
|
||||||
"title": "Leaderboard topper!",
|
"title": "Leaderboard topper!",
|
||||||
"body": "{from_user} is on top in leaderboard with {points} points."
|
"body": "{from_user} is on top in leaderboard with {points} points."
|
||||||
},
|
},
|
||||||
|
# Juniors will receive notification
|
||||||
|
# when admin add any new financial learnings
|
||||||
|
NEW_ARTICLE_PUBLISHED: {
|
||||||
|
"title": "Time to read!",
|
||||||
|
"body": "A new article has been published."
|
||||||
|
},
|
||||||
# Juniors will receive notification as soon as their custodians remove them from account
|
# Juniors will receive notification as soon as their custodians remove them from account
|
||||||
REMOVE_JUNIOR: {
|
REMOVE_JUNIOR: {
|
||||||
"title": "Disassociate by guardian!",
|
"title": "Disassociate by guardian!",
|
||||||
|
@ -8,6 +8,7 @@ from firebase_admin.messaging import Message, Notification as FirebaseNotificati
|
|||||||
|
|
||||||
# django imports
|
# django imports
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.db.models import Q
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from account.models import UserNotification
|
from account.models import UserNotification
|
||||||
@ -79,6 +80,7 @@ def get_notification_data(notification_type, from_user_id, from_user_type, to_us
|
|||||||
if 'task_id' in extra_data:
|
if 'task_id' in extra_data:
|
||||||
task = JuniorTask.objects.filter(id=extra_data.get('task_id')).first()
|
task = JuniorTask.objects.filter(id=extra_data.get('task_id')).first()
|
||||||
task_name = task.task_name
|
task_name = task.task_name
|
||||||
|
extra_data['task_name'] = task_name
|
||||||
extra_data['task_image'] = task.image if task.image else task.default_image
|
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)
|
from_user_name, from_user_image, from_user = get_from_user_details(from_user_id, from_user_type)
|
||||||
@ -124,10 +126,13 @@ def send_multiple_push(queryset, data):
|
|||||||
|
|
||||||
@shared_task()
|
@shared_task()
|
||||||
def send_notification_multiple_user(notification_type, from_user_id, from_user_type,
|
def send_notification_multiple_user(notification_type, from_user_id, from_user_type,
|
||||||
to_user_list: list = [], extra_data: dict = {}):
|
extra_data: dict = {}):
|
||||||
"""
|
"""
|
||||||
used to send notification to multiple user for the given notification type
|
used to send notification to multiple user for the given notification type
|
||||||
"""
|
"""
|
||||||
|
to_user_list = User.objects.filter(junior_profile__is_verified=True, is_superuser=False
|
||||||
|
).exclude(junior_profile__isnull=True, guardian_profile__isnull=True)
|
||||||
|
|
||||||
push_data = NOTIFICATION_DICT[notification_type].copy()
|
push_data = NOTIFICATION_DICT[notification_type].copy()
|
||||||
notification_data = push_data.copy()
|
notification_data = push_data.copy()
|
||||||
points = extra_data.get('points', None)
|
points = extra_data.get('points', None)
|
||||||
@ -144,7 +149,7 @@ def send_notification_multiple_user(notification_type, from_user_id, from_user_t
|
|||||||
notification_from=from_user,
|
notification_from=from_user,
|
||||||
data=notification_data))
|
data=notification_data))
|
||||||
Notification.objects.bulk_create(notification_list)
|
Notification.objects.bulk_create(notification_list)
|
||||||
|
to_user_list = to_user_list.filter(user_notification__push_notification=True)
|
||||||
send_multiple_push(to_user_list, push_data)
|
send_multiple_push(to_user_list, push_data)
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,6 +10,8 @@ from base.constants import (ARTICLE_SURVEY_POINTS, MAX_ARTICLE_CARD, MIN_ARTICLE
|
|||||||
# local imports
|
# local imports
|
||||||
from base.messages import ERROR_CODE
|
from base.messages import ERROR_CODE
|
||||||
from guardian.utils import upload_image_to_alibaba
|
from guardian.utils import upload_image_to_alibaba
|
||||||
|
from notifications.constants import NEW_ARTICLE_PUBLISHED
|
||||||
|
from notifications.utils import send_notification_multiple_user
|
||||||
from web_admin.models import Article, ArticleCard, SurveyOption, ArticleSurvey, DefaultArticleCardImage
|
from web_admin.models import Article, ArticleCard, SurveyOption, ArticleSurvey, DefaultArticleCardImage
|
||||||
from web_admin.utils import pop_id, get_image_url
|
from web_admin.utils import pop_id, get_image_url
|
||||||
from junior.models import JuniorArticlePoints, JuniorArticle
|
from junior.models import JuniorArticlePoints, JuniorArticle
|
||||||
@ -119,11 +121,15 @@ class ArticleSerializer(serializers.ModelSerializer):
|
|||||||
option = pop_id(option)
|
option = pop_id(option)
|
||||||
SurveyOption.objects.create(survey=survey_obj, **option)
|
SurveyOption.objects.create(survey=survey_obj, **option)
|
||||||
|
|
||||||
|
# All juniors will receive notification when admin add any new financial learnings/article
|
||||||
|
send_notification_multiple_user.delay(NEW_ARTICLE_PUBLISHED, None, None, {})
|
||||||
|
|
||||||
return article
|
return article
|
||||||
|
|
||||||
def update(self, instance, validated_data):
|
def update(self, instance, validated_data):
|
||||||
"""
|
"""
|
||||||
to update article and related table
|
to update article and related table
|
||||||
|
:param validated_data:
|
||||||
:param instance: article object,
|
:param instance: article object,
|
||||||
:return: article object
|
:return: article object
|
||||||
"""
|
"""
|
||||||
|
@ -27,6 +27,7 @@ app.config_from_object('django.conf:settings')
|
|||||||
# Load task modules from all registered Django apps.
|
# Load task modules from all registered Django apps.
|
||||||
app.autodiscover_tasks()
|
app.autodiscover_tasks()
|
||||||
|
|
||||||
|
# scheduled task
|
||||||
app.conf.beat_schedule = {
|
app.conf.beat_schedule = {
|
||||||
"expired_task": {
|
"expired_task": {
|
||||||
"task": "guardian.utils.update_expired_task_status",
|
"task": "guardian.utils.update_expired_task_status",
|
||||||
@ -34,11 +35,11 @@ app.conf.beat_schedule = {
|
|||||||
},
|
},
|
||||||
'notify_task_expiry': {
|
'notify_task_expiry': {
|
||||||
'task': 'base.tasks.notify_task_expiry',
|
'task': 'base.tasks.notify_task_expiry',
|
||||||
'schedule': crontab(minute='0', hour='13'),
|
'schedule': crontab(minute='5', hour='12'),
|
||||||
},
|
},
|
||||||
'notify_top_junior': {
|
'notify_top_junior': {
|
||||||
'task': 'base.tasks.notify_top_junior',
|
'task': 'base.tasks.notify_top_junior',
|
||||||
'schedule': crontab(minute='0', hour='*/1'),
|
'schedule': crontab(minute='*/5',),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user