1818from rest_framework .response import Response
1919from rest_framework .renderers import JSONRenderer
2020from rest_framework_csv .renderers import CSVRenderer
21- from api .pagination import LargePagination
21+ from api .pagination import DynamicChoicePagination , LargePagination
2222from api .renderers import ZipRenderer
2323from rest_framework .viewsets import ModelViewSet
2424from 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
0 commit comments