Skip to content

Commit f3501a3

Browse files
IdirLISNDidayolo
andauthored
Leaderboard Pagination. (#2319)
* pagination feature ready, needs to be tested * set up 50 as default value for leaderboard pagination * fix pagination in endpoint * Fix indent in competitions.py --------- Co-authored-by: Adrien Pavão <adrien.pavao@gmail.com>
1 parent dbba19c commit f3501a3

File tree

4 files changed

+883
-140
lines changed

4 files changed

+883
-140
lines changed

src/apps/api/views/competitions.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from rest_framework.response import Response
1919
from rest_framework.renderers import JSONRenderer
2020
from rest_framework_csv.renderers import CSVRenderer
21-
from api.pagination import LargePagination
21+
from api.pagination import DynamicChoicePagination, LargePagination
2222
from api.renderers import ZipRenderer
2323
from rest_framework.viewsets import ModelViewSet
2424
from api.serializers.competitions import CompetitionSerializerSimple, PhaseSerializer, \
@@ -774,10 +774,17 @@ def rerun_submissions(self, request, pk):
774774
def get_leaderboard(self, request, pk):
775775
phase = self.get_object()
776776
if phase.competition.fact_sheet:
777-
fact_sheet_keys = [(phase.competition.fact_sheet[question]['key'], phase.competition.fact_sheet[question]['title'])
778-
for question in phase.competition.fact_sheet if phase.competition.fact_sheet[question]['is_on_leaderboard'] == 'true']
777+
fact_sheet_keys = [
778+
(
779+
phase.competition.fact_sheet[question]['key'],
780+
phase.competition.fact_sheet[question]['title']
781+
)
782+
for question in phase.competition.fact_sheet
783+
if phase.competition.fact_sheet[question]['is_on_leaderboard'] == 'true'
784+
]
779785
else:
780786
fact_sheet_keys = None
787+
781788
query = LeaderboardPhaseSerializer(phase).data
782789
response = {
783790
'title': query['leaderboard']['title'],
@@ -787,9 +794,11 @@ def get_leaderboard(self, request, pk):
787794
'fact_sheet_keys': fact_sheet_keys or None,
788795
'primary_index': query['leaderboard']['primary_index']
789796
}
797+
790798
columns = [col for col in query['columns']]
791799
submissions_keys = {}
792800
submission_detailed_results = {}
801+
793802
for submission in query['submissions']:
794803
submission_key = f"{submission['owner']}{submission['parent'] or submission['id']}"
795804
# gather detailed result from submissions for each task
@@ -814,6 +823,7 @@ def get_leaderboard(self, request, pk):
814823
'organization': submission['organization'],
815824
'created_when': submission['created_when']
816825
})
826+
817827
for score in submission['scores']:
818828

819829
# to check if a column is found
@@ -851,6 +861,21 @@ def get_leaderboard(self, request, pk):
851861
for k, v in submissions_keys.items():
852862
response['submissions'][v]['detailed_results'] = submission_detailed_results[k]
853863

864+
# --- pagination addition ---
865+
total_count = len(response['submissions'])
866+
paginator = DynamicChoicePagination()
867+
paginated_submissions = paginator.paginate_queryset(response['submissions'], request, view=self)
868+
if paginated_submissions is None:
869+
paginated_submissions = response['submissions']
870+
871+
response['submissions'] = paginated_submissions
872+
response['count'] = total_count
873+
response['page_size'] = getattr(paginator, 'requested_page_size', request.query_params.get('page_size', 50))
874+
response['next'] = paginator.get_next_link()
875+
response['previous'] = paginator.get_previous_link()
876+
response['allowed_page_sizes'] = [50, 100, 500, 'all']
877+
# --- end pagination addition ---
878+
854879
for task in query['tasks']:
855880
# This can be used to rendered variable columns on each task
856881
tempTask = {
@@ -862,6 +887,7 @@ def get_leaderboard(self, request, pk):
862887
for col in columns:
863888
tempTask['columns'].append(col)
864889
response['tasks'].append(tempTask)
890+
865891
return Response(response)
866892

867893

src/static/js/ours/client.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ CODALAB.api = {
147147
get_leaderboard_for_render: function (phase_pk) {
148148
return CODALAB.api.request('GET', `${URLS.API}phases/${phase_pk}/get_leaderboard/`)
149149
},
150+
get_leaderboard_for_render: function (phase_pk, params = {}) {
151+
return CODALAB.api.request('GET', `${URLS.API}phases/${phase_pk}/get_leaderboard/`, params)
152+
},
153+
150154
update_submission_score: function (pk, data) {
151155
return CODALAB.api.request('PATCH', `${URLS.API}submission_scores/${pk}/`, data)
152156
},

0 commit comments

Comments
 (0)