From bf2aeee8fb7d70aac6259305e9204f88ad2eb692 Mon Sep 17 00:00:00 2001 From: SharonAliyas5573 Date: Sat, 13 Jul 2024 00:35:54 +0530 Subject: [PATCH 1/3] Refactor LaunchpadLeaderBoardSerializer --- api/launchpad/serializers.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/api/launchpad/serializers.py b/api/launchpad/serializers.py index f9a5d899..fcf57abd 100644 --- a/api/launchpad/serializers.py +++ b/api/launchpad/serializers.py @@ -14,8 +14,9 @@ class LaunchPadIDSerializer(serializers.ModelSerializer): class Meta: model = LaunchPad - fields = ('launchpad_id') - + fields = ['launchpad_id'] + def to_representation(self, instance): + return instance.launchpad_id class LaunchpadLeaderBoardSerializer(serializers.ModelSerializer): rank = serializers.SerializerMethodField() @@ -24,11 +25,11 @@ class LaunchpadLeaderBoardSerializer(serializers.ModelSerializer): org = serializers.CharField(allow_null=True, allow_blank=True) district_name = serializers.CharField(allow_null=True, allow_blank=True) state = serializers.CharField(allow_null=True, allow_blank=True) - launchpad_id = LaunchPadIDSerializer(read_only=True) + launchpad_id = LaunchPadIDSerializer(source='launchpad_user.first', read_only=True) class Meta: model = User - fields = ("rank", "full_name", "actual_karma", "karma", "org", "district_name", "state","launchpad_id") + fields = ("id","rank", "full_name", "actual_karma", "karma", "org", "district_name", "state","launchpad_id") def get_rank(self, obj): total_karma_subquery = KarmaActivityLog.objects.filter( From 794c00cb6cee128681f3359c7f7a1c3c6b0b461e Mon Sep 17 00:00:00 2001 From: SharonAliyas5573 Date: Sat, 13 Jul 2024 02:29:12 +0530 Subject: [PATCH 2/3] Add launchpad_karma and launchpad_rank to UserProfileAPI response --- api/launchpad/launchpad_views.py | 15 ++++++-- api/launchpad/serializers.py | 60 +++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/api/launchpad/launchpad_views.py b/api/launchpad/launchpad_views.py index 519aed41..b571ed5e 100644 --- a/api/launchpad/launchpad_views.py +++ b/api/launchpad/launchpad_views.py @@ -5,7 +5,7 @@ from rest_framework.views import APIView from .serializers import LaunchpadLeaderBoardSerializer, LaunchpadParticipantsSerializer, LaunchpadUserListSerializer,\ - CollegeDataSerializer, LaunchpadUserSerializer, UserProfileUpdateSerializer, LaunchpadUpdateUserSerializer + CollegeDataSerializer, LaunchpadUserSerializer, UserProfileUpdateSerializer, LaunchpadUpdateUserSerializer,LaunchPadRankSerializer from api.dashboard.profile.profile_serializer import UserProfileSerializer , LinkSocials ,UserLevelSerializer ,UserLogSerializer from utils.response import CustomResponse @@ -558,7 +558,18 @@ def get(self, request, launchpad_id=None): if response: return response serializer = UserProfileSerializer(user, many=False) - return CustomResponse(response=serializer.data).get_success_response() + launchpad_karma = KarmaActivityLog.objects.filter( + user=user, + task__event='launchpad', + appraiser_approved=True, + ).aggregate(total_karma=Sum('karma'))['total_karma'] or 0 + rank_serializer = LaunchPadRankSerializer(user) + launchpad_rank = rank_serializer.data['launchpad_rank'] + + data = serializer.data + data['launchpad_karma'] = launchpad_karma + data['launchpad_rank'] = launchpad_rank + return CustomResponse(response=data).get_success_response() class GetSocialsAPI(BaseAPI): def get(self, request, launchpad_id=None): diff --git a/api/launchpad/serializers.py b/api/launchpad/serializers.py index fcf57abd..45ef931d 100644 --- a/api/launchpad/serializers.py +++ b/api/launchpad/serializers.py @@ -18,6 +18,64 @@ class Meta: def to_representation(self, instance): return instance.launchpad_id +class LaunchPadRankSerializer(serializers.ModelSerializer): + launchpad_rank = serializers.SerializerMethodField('get_rank') + class Meta: + model = User + fields = ['launchpad_rank'] + + def get_rank(self, obj): + total_karma_subquery = KarmaActivityLog.objects.filter( + user=OuterRef('id'), + task__event='launchpad', + appraiser_approved=True, + ).values('user').annotate( + total_karma=Sum('karma') + ).values('total_karma') + allowed_org_types = ["College", "School", "Company"] + + intro_task_completed_users = KarmaActivityLog.objects.filter( + task__event='launchpad', + appraiser_approved=True, + task__hashtag='#lp24-introduction', + ).values('user') + + latest_org_link = UserOrganizationLink.objects.filter( + user=OuterRef('id'), + org__org_type__in=allowed_org_types + ).order_by('-created_at').values('org__title')[:1] + + latest_district = UserOrganizationLink.objects.filter( + user=OuterRef('id'), + org__org_type__in=allowed_org_types + ).order_by('-created_at').values('org__district__name')[:1] + + latest_state = UserOrganizationLink.objects.filter( + user=OuterRef('id'), + org__org_type__in=allowed_org_types + ).order_by('-created_at').values('org__district__zone__state__name')[:1] + + users = User.objects.filter( + karma_activity_log_user__task__event="launchpad", + karma_activity_log_user__appraiser_approved=True, + id__in=intro_task_completed_users + ).annotate( + karma=Subquery(total_karma_subquery, output_field=IntegerField()), + org=Subquery(latest_org_link), + district_name=Subquery(latest_district), + state=Subquery(latest_state), + time_=Max("karma_activity_log_user__created_at"), + ).order_by("-karma", "time_") + + # high complexity + rank = 0 + for data in users: + rank += 1 + if data.id == obj.id: + break + + return rank + class LaunchpadLeaderBoardSerializer(serializers.ModelSerializer): rank = serializers.SerializerMethodField() karma = serializers.IntegerField() @@ -29,7 +87,7 @@ class LaunchpadLeaderBoardSerializer(serializers.ModelSerializer): class Meta: model = User - fields = ("id","rank", "full_name", "actual_karma", "karma", "org", "district_name", "state","launchpad_id") + fields = ("rank", "full_name", "actual_karma", "karma", "org", "district_name", "state","launchpad_id") def get_rank(self, obj): total_karma_subquery = KarmaActivityLog.objects.filter( From bc8533ab7fa39f034eb9968808cc355ac6a74273 Mon Sep 17 00:00:00 2001 From: jelanmathewjames Date: Sat, 13 Jul 2024 11:56:30 +0530 Subject: [PATCH 3/3] feat: Add TFPTasksHashtags enum for task hashtags --- api/dashboard/profile/profile_view.py | 8 ++++---- utils/types.py | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/api/dashboard/profile/profile_view.py b/api/dashboard/profile/profile_view.py index 55fea945..7f0b0b74 100644 --- a/api/dashboard/profile/profile_view.py +++ b/api/dashboard/profile/profile_view.py @@ -15,7 +15,7 @@ from db.user import Role, Socials, User, UserRoleLink, UserSettings from utils.permission import CustomizePermission, JWTUtils from utils.response import CustomResponse -from utils.types import WebHookActions, WebHookCategory +from utils.types import WebHookActions, WebHookCategory, TFPTasksHashtags from utils.utils import DiscordWebhooks from . import profile_serializer @@ -426,11 +426,11 @@ class BadgesAPI(APIView): def get(self, request, muid): try: user = User.objects.get(muid=muid) - hastags = ["#tfp2.0-scratch"] + hastags = TFPTasksHashtags.get_all_values() response_data = {"full_name": user.full_name, "completed_tasks":[]} for tag in hastags: - if KarmaActivityLog.objects.filter(user=user, task__hashtag=tag).exists(): - response_data["completed_tasks"] = tag + if log := KarmaActivityLog.objects.filter(user=user, task__hashtag=tag).first(): + response_data["completed_tasks"] = log.task__title return CustomResponse(response=response_data).get_success_response() except User.DoesNotExist: return CustomResponse( diff --git a/utils/types.py b/utils/types.py index 7d692e8e..eecad554 100644 --- a/utils/types.py +++ b/utils/types.py @@ -152,6 +152,13 @@ class LaunchPadRoles(Enum): @classmethod def get_all_values(cls): return [member.value for member in cls] + +class TFPTasksHashtags(Enum): + SCRATCH = '#tfp2.0-scratch' + + @classmethod + def get_all_values(cls): + return [member.value for member in cls] DEFAULT_HACKATHON_FORM_FIELDS = { 'name': 'system',