def leaderboard(request, challenge_phase_split_id): """Returns leaderboard for a corresponding Challenge Phase Split""" # check if the challenge exists or not try: challenge_phase_split = ChallengePhaseSplit.objects.get( pk=challenge_phase_split_id) except ChallengePhaseSplit.DoesNotExist: response_data = {'error': 'Challenge Phase Split does not exist'} return Response(response_data, status=status.HTTP_400_BAD_REQUEST) # Check if the Challenge Phase Split is publicly visible or not if challenge_phase_split.visibility != ChallengePhaseSplit.PUBLIC: response_data = {'error': 'Sorry, leaderboard is not public yet for this Challenge Phase Split!'} return Response(response_data, status=status.HTTP_400_BAD_REQUEST) # Get the leaderboard associated with the Challenge Phase Split leaderboard = challenge_phase_split.leaderboard # Get the default order by key to rank the entries on the leaderboard try: default_order_by = leaderboard.schema['default_order_by'] except: response_data = {'error': 'Sorry, Default filtering key not found in leaderboard schema!'} return Response(response_data, status=status.HTTP_400_BAD_REQUEST) # Get all the successful submissions related to the challenge phase split leaderboard_data = LeaderboardData.objects.filter( challenge_phase_split=challenge_phase_split, submission__is_public=True, submission__is_flagged=False).order_by('created_at') leaderboard_data = leaderboard_data.annotate( filtering_score=RawSQL('result->>%s', (default_order_by, ), output_field=FloatField())).values( 'id', 'submission__participant_team__team_name', 'challenge_phase_split', 'result', 'filtering_score', 'leaderboard__schema') sorted_leaderboard_data = sorted(leaderboard_data, key=lambda k: float(k['filtering_score']), reverse=True) distinct_sorted_leaderboard_data = [] team_list = [] for data in sorted_leaderboard_data: if data['submission__participant_team__team_name'] in team_list: continue else: distinct_sorted_leaderboard_data.append(data) team_list.append(data['submission__participant_team__team_name']) leaderboard_labels = challenge_phase_split.leaderboard.schema['labels'] for item in distinct_sorted_leaderboard_data: item['result'] = [item['result'][index.lower()] for index in leaderboard_labels] paginator, result_page = paginated_queryset( distinct_sorted_leaderboard_data, request, pagination_class=StandardResultSetPagination()) response_data = result_page return paginator.get_paginated_response(response_data)
def leaderboard(request, challenge_phase_split_id): """Returns leaderboard for a corresponding Challenge Phase Split""" # check if the challenge exists or not try: challenge_phase_split = ChallengePhaseSplit.objects.get( pk=challenge_phase_split_id) except ChallengePhaseSplit.DoesNotExist: response_data = {'error': 'Challenge Phase Split does not exist'} return Response(response_data, status=status.HTTP_400_BAD_REQUEST) # Get the leaderboard associated with the Challenge Phase Split leaderboard = challenge_phase_split.leaderboard # Get the default order by key to rank the entries on the leaderboard try: default_order_by = leaderboard.schema['default_order_by'] except: response_data = {'error': 'Sorry, Default filtering key not found in leaderboard schema!'} return Response(response_data, status=status.HTTP_400_BAD_REQUEST) # Exclude the submissions done by members of the host team # while populating leaderboard challenge_obj = challenge_phase_split.challenge_phase.challenge challenge_hosts_emails = challenge_obj.creator.get_all_challenge_host_email() is_challenge_phase_public = challenge_phase_split.challenge_phase.is_public # Exclude the submissions from challenge host team to be displayed on the leaderboard of public phases challenge_hosts_emails = [] if not is_challenge_phase_public else challenge_hosts_emails leaderboard_data = LeaderboardData.objects.exclude( submission__created_by__email__in=challenge_hosts_emails) # Get all the successful submissions related to the challenge phase split leaderboard_data = leaderboard_data.filter( challenge_phase_split=challenge_phase_split, submission__is_public=True, submission__is_flagged=False, submission__status=Submission.FINISHED).order_by('created_at') leaderboard_data = leaderboard_data.annotate( filtering_score=RawSQL('result->>%s', (default_order_by, ), output_field=FloatField())).values( 'id', 'submission__participant_team__team_name', 'challenge_phase_split', 'result', 'filtering_score', 'leaderboard__schema', 'submission__submitted_at') sorted_leaderboard_data = sorted(leaderboard_data, key=lambda k: float(k['filtering_score']), reverse=True) distinct_sorted_leaderboard_data = [] team_list = [] for data in sorted_leaderboard_data: if data['submission__participant_team__team_name'] in team_list: continue else: distinct_sorted_leaderboard_data.append(data) team_list.append(data['submission__participant_team__team_name']) leaderboard_labels = challenge_phase_split.leaderboard.schema['labels'] for item in distinct_sorted_leaderboard_data: item['result'] = [item['result'][index] for index in leaderboard_labels] paginator, result_page = paginated_queryset( distinct_sorted_leaderboard_data, request, pagination_class=StandardResultSetPagination()) challenge_host_user = is_user_a_host_of_challenge(request.user, challenge_obj.pk) # Show the Private leaderboard only if the user is a challenge host if challenge_host_user: response_data = result_page return paginator.get_paginated_response(response_data) # Check if challenge phase leaderboard is public for participant user or not elif challenge_phase_split.visibility != ChallengePhaseSplit.PUBLIC: response_data = {'error': 'Sorry, the leaderboard is not public!'} return Response(response_data, status=status.HTTP_400_BAD_REQUEST) else: response_data = result_page return paginator.get_paginated_response(response_data)
def leaderboard(request, challenge_phase_split_id): """Returns leaderboard for a corresponding Challenge Phase Split""" # check if the challenge exists or not try: challenge_phase_split = ChallengePhaseSplit.objects.get( pk=challenge_phase_split_id) except ChallengePhaseSplit.DoesNotExist: response_data = {"error": "Challenge Phase Split does not exist"} return Response(response_data, status=status.HTTP_400_BAD_REQUEST) # Get the leaderboard associated with the Challenge Phase Split leaderboard = challenge_phase_split.leaderboard # Get the default order by key to rank the entries on the leaderboard try: default_order_by = leaderboard.schema["default_order_by"] except KeyError: response_data = { "error": "Sorry, Default filtering key not found in leaderboard schema!" } return Response(response_data, status=status.HTTP_400_BAD_REQUEST) # Exclude the submissions done by members of the host team # while populating leaderboard challenge_obj = challenge_phase_split.challenge_phase.challenge challenge_hosts_emails = ( challenge_obj.creator.get_all_challenge_host_email()) is_challenge_phase_public = challenge_phase_split.challenge_phase.is_public # Exclude the submissions from challenge host team to be displayed on the leaderboard of public phases challenge_hosts_emails = ([] if not is_challenge_phase_public else challenge_hosts_emails) challenge_host_user = is_user_a_host_of_challenge(request.user, challenge_obj.pk) # Check if challenge phase leaderboard is public for participant user or not if (challenge_phase_split.visibility != ChallengePhaseSplit.PUBLIC and not challenge_host_user): response_data = {"error": "Sorry, the leaderboard is not public!"} return Response(response_data, status=status.HTTP_400_BAD_REQUEST) leaderboard_data = LeaderboardData.objects.exclude( Q(submission__created_by__email__in=challenge_hosts_emails) & Q(submission__is_baseline=False)) # Get all the successful submissions related to the challenge phase split leaderboard_data = leaderboard_data.filter( challenge_phase_split=challenge_phase_split, submission__is_flagged=False, submission__status=Submission.FINISHED, ).order_by("created_at") leaderboard_data = leaderboard_data.annotate( filtering_score=RawSQL("result->>%s", (default_order_by, ), output_field=FloatField())).values( "id", "submission__participant_team__team_name", "submission__participant_team__team_url", "submission__is_baseline", "challenge_phase_split", "result", "filtering_score", "leaderboard__schema", "submission__submitted_at", "submission__method_name", ) if challenge_phase_split.visibility == ChallengePhaseSplit.PUBLIC: leaderboard_data = leaderboard_data.filter(submission__is_public=True) sorted_leaderboard_data = sorted( leaderboard_data, key=lambda k: float(k["filtering_score"]), reverse=True, ) distinct_sorted_leaderboard_data = [] team_list = [] for data in sorted_leaderboard_data: if data["submission__participant_team__team_name"] in team_list: continue elif data["submission__is_baseline"] is True: distinct_sorted_leaderboard_data.append(data) else: distinct_sorted_leaderboard_data.append(data) team_list.append(data["submission__participant_team__team_name"]) leaderboard_labels = challenge_phase_split.leaderboard.schema["labels"] for item in distinct_sorted_leaderboard_data: item["result"] = [ item["result"][index] for index in leaderboard_labels ] paginator, result_page = paginated_queryset( distinct_sorted_leaderboard_data, request, pagination_class=StandardResultSetPagination(), ) response_data = result_page return paginator.get_paginated_response(response_data)