diff --git a/base/tasks.py b/base/tasks.py index 65dff3b..fbeca1d 100644 --- a/base/tasks.py +++ b/base/tasks.py @@ -68,10 +68,14 @@ def notify_top_junior(): task to send notification for top leaderboard junior to all junior's :return: """ - junior_points_qs = JuniorPoints.objects.select_related('junior', 'junior__auth').annotate(rank=Window( - expression=Rank(), - order_by=[F('total_points').desc(), 'junior__created_at'] - )).order_by('-total_points', 'junior__created_at') + junior_points_qs = JuniorPoints.objects.filter( + junior__is_verified=True + ).select_related( + 'junior', 'junior__auth' + ).annotate(rank=Window( + expression=Rank(), + order_by=[F('total_points').desc(), 'junior__created_at']) + ).order_by('-total_points', 'junior__created_at') prev_top_position = junior_points_qs.filter(position=1).first() new_top_position = junior_points_qs.filter(rank=1).first() diff --git a/guardian/views.py b/guardian/views.py index e5b984a..e120681 100644 --- a/guardian/views.py +++ b/guardian/views.py @@ -259,10 +259,14 @@ class TopJuniorListAPIView(viewsets.ModelViewSet): return context def get_queryset(self): - queryset = JuniorPoints.objects.select_related('junior', 'junior__auth').annotate(rank=Window( - expression=Rank(), - order_by=[F('total_points').desc(), 'junior__created_at'] - )).order_by('-total_points', 'junior__created_at') + queryset = JuniorPoints.objects.filter( + junior__is_verified=True + ).select_related( + 'junior', 'junior__auth' + ).annotate(rank=Window( + expression=Rank(), + order_by=[F('total_points').desc(), 'junior__created_at']) + ).order_by('-total_points', 'junior__created_at') return queryset def list(self, request, *args, **kwargs): diff --git a/junior/serializers.py b/junior/serializers.py index d3d0b2f..de5f671 100644 --- a/junior/serializers.py +++ b/junior/serializers.py @@ -22,7 +22,7 @@ from account.models import UserEmailOtp, UserNotification from junior.utils import junior_notification_email, junior_approval_mail, get_junior_leaderboard_rank from guardian.utils import real_time, update_referral_points, convert_timedelta_into_datetime from notifications.utils import send_notification -from notifications.constants import (ASSOCIATE_REQUEST, JUNIOR_ADDED, TASK_ACTION, +from notifications.constants import (ASSOCIATE_REQUEST, ASSOCIATE_JUNIOR, TASK_ACTION, ) from web_admin.models import ArticleCard @@ -323,7 +323,7 @@ class AddJuniorSerializer(serializers.ModelSerializer): """Notification email""" junior_notification_email.delay(email, full_name, email, password) # push notification - send_notification.delay(JUNIOR_ADDED, None, None, junior_data.auth.id, {}) + send_notification.delay(ASSOCIATE_JUNIOR, None, None, junior_data.auth.id, {}) return junior_data diff --git a/junior/utils.py b/junior/utils.py index 7533017..eac6ac9 100644 --- a/junior/utils.py +++ b/junior/utils.py @@ -70,10 +70,12 @@ def get_junior_leaderboard_rank(junior_obj): :param junior_obj: :return: junior's position/rank """ - queryset = JuniorPoints.objects.select_related('junior', 'junior__auth').annotate(rank=Window( - expression=Rank(), - order_by=[F('total_points').desc(), 'junior__created_at'] - )).order_by('-total_points', 'junior__created_at') + queryset = JuniorPoints.objects.filter( + junior__is_verified=True + ).select_related('junior', 'junior__auth').annotate(rank=Window( + expression=Rank(), + order_by=[F('total_points').desc(), 'junior__created_at'] + )).order_by('-total_points', 'junior__created_at') junior = next((query for query in queryset if query.junior == junior_obj), None) diff --git a/junior/views.py b/junior/views.py index d7a3d5f..cdb8874 100644 --- a/junior/views.py +++ b/junior/views.py @@ -42,12 +42,12 @@ from .serializers import (CreateJuniorSerializer, JuniorDetailListSerializer, Ad from guardian.models import Guardian, JuniorTask from guardian.serializers import TaskDetailsSerializer, TaskDetailsjuniorSerializer from base.messages import ERROR_CODE, SUCCESS_CODE -from base.constants import NUMBER, ARTICLE_STATUS, none +from base.constants import NUMBER, ARTICLE_STATUS, none, GUARDIAN from account.utils import custom_response, custom_error_response from guardian.utils import upload_image_to_alibaba from .utils import update_positions_based_on_points from notifications.utils import send_notification -from notifications.constants import REMOVE_JUNIOR, ARTICLE_REWARD_POINTS +from notifications.constants import REMOVE_JUNIOR, ARTICLE_REWARD_POINTS, ASSOCIATE_EXISTING_JUNIOR from web_admin.models import Article, ArticleSurvey, SurveyOption, ArticleCard from web_admin.serializers.article_serializer import (ArticleSerializer, ArticleListSerializer, StartAssessmentSerializer) @@ -229,6 +229,7 @@ class AddJuniorAPIView(viewsets.ModelViewSet): if jun_data: jun_data.relationship = str(self.request.data['relationship']) jun_data.save() + send_notification.delay(ASSOCIATE_EXISTING_JUNIOR, self.request.user.id, GUARDIAN, junior.auth.id, {}) return True diff --git a/notifications/constants.py b/notifications/constants.py index 503e0f2..85b0d2d 100644 --- a/notifications/constants.py +++ b/notifications/constants.py @@ -6,19 +6,20 @@ ASSOCIATE_REQUEST = 3 ASSOCIATE_REJECTED = 4 ASSOCIATE_APPROVED = 5 REFERRAL_POINTS = 6 -JUNIOR_ADDED = 7 +ASSOCIATE_JUNIOR = 7 +ASSOCIATE_EXISTING_JUNIOR = 8 -TASK_ASSIGNED = 8 -TASK_ACTION = 9 -TASK_REJECTED = 10 -TASK_APPROVED = 11 -PENDING_TASK_EXPIRING = 12 -IN_PROGRESS_TASK_EXPIRING = 13 -TOP_JUNIOR = 14 +TASK_ASSIGNED = 9 +TASK_ACTION = 10 +TASK_REJECTED = 11 +TASK_APPROVED = 12 +PENDING_TASK_EXPIRING = 13 +IN_PROGRESS_TASK_EXPIRING = 14 +TOP_JUNIOR = 15 -NEW_ARTICLE_PUBLISHED = 15 -ARTICLE_REWARD_POINTS = 16 -REMOVE_JUNIOR = 17 +NEW_ARTICLE_PUBLISHED = 16 +ARTICLE_REWARD_POINTS = 17 +REMOVE_JUNIOR = 18 TEST_NOTIFICATION = 99 @@ -53,10 +54,14 @@ NOTIFICATION_DICT = { }, # Juniors will receive notification # once any custodians add them in their account - JUNIOR_ADDED: { + ASSOCIATE_JUNIOR: { "title": "Profile already setup!", "body": "Your guardian has already setup your profile." }, + ASSOCIATE_EXISTING_JUNIOR: { + "title": "Associated to guardian", + "body": "Your are associated to your guardian {from_user}." + }, # Juniors will receive Notification # for every Task Assign by Custodians TASK_ASSIGNED: { diff --git a/web_admin/views/analytics.py b/web_admin/views/analytics.py index c04bb98..926cd47 100644 --- a/web_admin/views/analytics.py +++ b/web_admin/views/analytics.py @@ -128,10 +128,12 @@ class AnalyticsViewSet(GenericViewSet): :param request: :return: """ - queryset = JuniorPoints.objects.select_related('junior', 'junior__auth').annotate(rank=Window( - expression=Rank(), - order_by=[F('total_points').desc(), 'junior__created_at'] - )).order_by('-total_points', 'junior__created_at') + queryset = JuniorPoints.objects.filter( + junior__is_verified=True + ).select_related('junior', 'junior__auth').annotate(rank=Window( + expression=Rank(), + order_by=[F('total_points').desc(), 'junior__created_at'] + )).order_by('-total_points', 'junior__created_at') paginator = CustomPageNumberPagination() paginated_queryset = paginator.paginate_queryset(queryset, request) serializer = self.serializer_class(paginated_queryset, many=True) @@ -199,10 +201,12 @@ class AnalyticsViewSet(GenericViewSet): # sheet 3 for Juniors Leaderboard and rank elif sheet_name == 'Juniors Leaderboard': - queryset = JuniorPoints.objects.select_related('junior', 'junior__auth').annotate(rank=Window( - expression=Rank(), - order_by=[F('total_points').desc(), 'junior__created_at'] - )).order_by('-total_points', 'junior__created_at')[:15] + queryset = JuniorPoints.objects.filter( + junior__is_verified=True + ).select_related('junior', 'junior__auth').annotate(rank=Window( + expression=Rank(), + order_by=[F('total_points').desc(), 'junior__created_at'] + )).order_by('-total_points', 'junior__created_at')[:15] df_leaderboard = pd.DataFrame([ { 'Name': get_user_full_name(junior.junior.auth),