diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index 33bbefc39..b8f4c3285 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -449,6 +449,7 @@ class Meta: 'reward', 'contact_email', 'report', + 'is_featured', ) def get_created_by(self, obj): @@ -494,7 +495,7 @@ class Meta: class FrontPageCompetitionsSerializer(serializers.Serializer): popular_comps = CompetitionSerializerSimple(many=True) - featured_comps = CompetitionSerializerSimple(many=True) + recent_comps = CompetitionSerializerSimple(many=True) class PhaseResultsSubmissionSerializer(serializers.Serializer): diff --git a/src/apps/api/views/competitions.py b/src/apps/api/views/competitions.py index 793e4efda..386773570 100644 --- a/src/apps/api/views/competitions.py +++ b/src/apps/api/views/competitions.py @@ -30,7 +30,7 @@ from competitions.models import Competition, Phase, CompetitionCreationTaskStatus, CompetitionParticipant, Submission from datasets.models import Data from competitions.tasks import batch_send_email, manual_migration, create_competition_dump -from competitions.utils import get_popular_competitions, get_featured_competitions +from competitions.utils import get_popular_competitions, get_recent_competitions from leaderboards.models import Leaderboard from utils.data import make_url_sassy from api.permissions import IsOrganizerOrCollaborator @@ -507,12 +507,12 @@ def creation_status(self, request, pk): @action(detail=False, methods=('GET',), permission_classes=(AllowAny,)) def front_page(self, request): popular_comps = get_popular_competitions() - featured_comps = get_featured_competitions() + recent_comps = get_recent_competitions(exclude_comps=popular_comps) popular_comps_serializer = CompetitionSerializerSimple(popular_comps, many=True) - featured_comps_serializer = CompetitionSerializerSimple(featured_comps, many=True) + recent_comps_serializer = CompetitionSerializerSimple(recent_comps, many=True) return Response(data={ "popular_comps": popular_comps_serializer.data, - "featured_comps": featured_comps_serializer.data + "recent_comps": recent_comps_serializer.data }) @swagger_auto_schema(request_body=no_body, responses={201: CompetitionCreationTaskStatusSerializer()}) diff --git a/src/apps/competitions/utils.py b/src/apps/competitions/utils.py index be8f3c699..a10174fca 100644 --- a/src/apps/competitions/utils.py +++ b/src/apps/competitions/utils.py @@ -2,22 +2,21 @@ This file contains utilities for competitions ''' import random -# from django.db.models import Count from competitions.models import Competition def get_popular_competitions(limit=4): - ''' + """ Function to return most popular competitions based on the amount of participants. :param limit: Amount of competitions to return. Default is 3. :rtype: list :return: Most popular competitions. - ''' + """ competitions = Competition.objects.filter(published=True) \ - .order_by('-participants_count') + .order_by('-is_featured', '-participants_count') if len(competitions) <= limit: return competitions @@ -25,18 +24,22 @@ def get_popular_competitions(limit=4): return competitions[:limit] -def get_featured_competitions(limit=4): - ''' - Function to return featured competitions +def get_recent_competitions(exclude_comps=None, limit=4, random_limit=8): + """ + Function to return recent competitions, excluding given and featured competitions. - :param limit: Amount of competitions to return. Default is 4 + :param limit: Amount of competitions to return. Default is 4. + :param random_limit: Limit of recent competitions to take for randomization. Must be greater than `limit`. + :param exclude_comps: A queryset or list of competitions to exclude. :rtype: list - :return: list of featured competitions - ''' - - competitions = Competition.objects.filter(is_featured=True) + :return: List of featured competitions. + """ + exclude_ids = [comp.id for comp in exclude_comps] if exclude_comps else [] + competitions = Competition.objects.filter(published=True, is_featured=False) \ + .exclude(id__in=exclude_ids) \ + .order_by('-created_when') if len(competitions) <= limit: return competitions else: - return random.sample(list(competitions), limit) + return random.sample(list(competitions)[:random_limit], limit) diff --git a/src/static/riot/competitions/tile/competition_tile.tag b/src/static/riot/competitions/tile/competition_tile.tag index 3ec1e7925..e5447e1be 100644 --- a/src/static/riot/competitions/tile/competition_tile.tag +++ b/src/static/riot/competitions/tile/competition_tile.tag @@ -1,6 +1,6 @@ -
+