From 1137114c68f54fe34772b55a22eb49a125ff747f Mon Sep 17 00:00:00 2001 From: didayolo Date: Sat, 12 Apr 2025 13:31:40 +0200 Subject: [PATCH] Add filter and sorting to public listing --- src/apps/api/views/competitions.py | 20 +++++- src/static/riot/competitions/public-list.tag | 76 ++++++++++++++++++-- 2 files changed, 89 insertions(+), 7 deletions(-) diff --git a/src/apps/api/views/competitions.py b/src/apps/api/views/competitions.py index 4f53f7f31..c546cb77b 100644 --- a/src/apps/api/views/competitions.py +++ b/src/apps/api/views/competitions.py @@ -46,7 +46,7 @@ def get_queryset(self): qs = super().get_queryset() - # filter by competition_type first, 'competition' by default + # Filter by competition_type first, 'competition' by default competition_type = self.request.query_params.get('type', Competition.COMPETITION) if competition_type != 'any' and self.detail is False: qs = qs.filter(competition_type=competition_type) @@ -179,7 +179,8 @@ def get_queryset(self): if search_query: qs = qs.filter(Q(title__icontains=search_query) | Q(description__icontains=search_query)) - qs = qs.order_by('created_when') + # Default sort + qs = qs.order_by('-created_when') return qs def get_permissions(self): @@ -537,7 +538,20 @@ def create_dump(self, request, pk=None): @action(detail=False, methods=('GET',), pagination_class=LargePagination) def public(self, request): qs = Competition.objects.filter(published=True) - qs = qs.order_by('-id') + # Grab `sort_by` and `has_reward` from query params + sort_by = self.request.query_params.get('sort_by', None) + has_reward = self.request.query_params.get('has_reward', 'false').lower() + # Filter for non-empty reward if "has_reward=true" + if has_reward in ['true', '1']: + qs = qs.exclude(reward__isnull=True).exclude(reward='') + # Sort based on `sort_by` + if sort_by == 'participants_count': + qs = qs.order_by('-participants_count') # e.g. descending + elif sort_by == 'submissions_count': + qs = qs.order_by('-submissions_count') + else: + # Default sort + qs = qs.order_by('-created_when') queryset = self.filter_queryset(qs) page = self.paginate_queryset(queryset) if page is not None: diff --git a/src/static/riot/competitions/public-list.tag b/src/static/riot/competitions/public-list.tag index 259e556a5..ec0d5be73 100644 --- a/src/static/riot/competitions/public-list.tag +++ b/src/static/riot/competitions/public-list.tag @@ -1,5 +1,22 @@

Public Benchmarks and Competitions

+ + +
+ + +
+
@@ -49,8 +66,30 @@