Skip to content

Commit 4f206f6

Browse files
IdirLISNObada Haddad
authored andcommitted
fix for pagination UI
1 parent c0b1ba9 commit 4f206f6

2 files changed

Lines changed: 62 additions & 28 deletions

File tree

src/apps/api/pagination.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def get_paginated_response(self, data):
2727
class DynamicChoicePagination(PageNumberPagination):
2828
"""
2929
Dynamic pagination :
30-
- défaut : 50 objects.
30+
- default : 50 objects.
3131
- predetermined values : 50, 100, 500, all
3232
- if page_size=all => fetch all objects, capped by lax_page_size
3333
"""
@@ -43,37 +43,33 @@ def get_page_size(self, request):
4343

4444
raw_lower = str(raw).lower()
4545
if raw_lower == 'all':
46-
return None
46+
return self.max_page_size
4747

4848
try:
4949
val = int(raw)
5050
except (TypeError, ValueError):
5151
return self.page_size
52-
52+
5353
if val in (50, 100, 500):
54-
return val
54+
return min(val, self.max_page_size)
5555
return self.page_size
5656

5757
def paginate_queryset(self, queryset, request, view=None):
5858
raw = request.query_params.get(self.page_size_query_param)
59-
self.requested_page_size = raw if raw is not None else str(self.page_size)
59+
self.requested_page_size = str(raw).lower() if raw is not None else str(self.page_size)
6060

61-
if raw is not None and str(raw).lower() == 'all':
62-
try:
63-
total = queryset.count()
64-
except Exception:
65-
total = self.max_page_size
66-
self.page_size = total if (isinstance(total, int) and total > 0) else 1
61+
page_size = self.get_page_size(request)
62+
if isinstance(page_size, int) and page_size > 0:
63+
self.page_size = min(page_size, self.max_page_size)
6764
else:
68-
page_size = self.get_page_size(request)
69-
if page_size is None:
70-
page_size = self.page_size
71-
self.page_size = page_size
65+
self.page_size = self.page_size
7266

7367
return super().paginate_queryset(queryset, request, view)
7468

7569
def get_paginated_response(self, data):
76-
page_size_value = self.requested_page_size if getattr(self, 'requested_page_size', None) is not None else self.page_size
70+
page_size_value = getattr(self, 'requested_page_size', None)
71+
if page_size_value is None:
72+
page_size_value = self.page_size
7773

7874
return Response({
7975
'next': self.get_next_link(),

src/static/riot/competitions/detail/submission_manager.tag

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,11 @@
323323
}
324324

325325
filters.page = self.page
326-
filters.page_size = self.page_size
326+
if (String(self.page_size).toLowerCase() === 'all') {
327+
filters.page_size = 'all'
328+
} else {
329+
filters.page_size = self.page_size
330+
}
327331

328332
CODALAB.api.get_submissions(filters)
329333
.done(function (response) {
@@ -334,21 +338,60 @@
334338
self.next = response.next || null
335339
self.previous = response.previous || null
336340
self.total_count = response.count || 0
341+
342+
var effectivePageSize = 1
343+
var serverPageSize = undefined
344+
var totalCount = (typeof response.count === 'number') ? response.count : self.total_count
345+
var isLastPage = (response.next === null)
346+
337347
if (response && typeof response.page_size !== 'undefined') {
338-
const rsp = String(response.page_size).toLowerCase()
339-
if (rsp === 'all') {
348+
serverPageSize = response.page_size
349+
}
350+
351+
if (typeof serverPageSize !== 'undefined') {
352+
if (String(serverPageSize).toLowerCase() === 'all') {
340353
self.page_size = 'all'
341354
} else {
342-
const n = Number(response.page_size)
343-
self.page_size = isNaN(n) ? self.page_size : n
355+
var parsedServerPS = Number(serverPageSize)
356+
if (!isNaN(parsedServerPS) && parsedServerPS > 0) {
357+
self.page_size = parsedServerPS
358+
}
344359
}
345360
}
346361

347362
if (String(self.page_size).toLowerCase() === 'all') {
363+
if (typeof response.page_size_numeric === 'number' && response.page_size_numeric > 0) {
364+
effectivePageSize = response.page_size_numeric
365+
} else if (typeof response.effective_page_size === 'number' && response.effective_page_size > 0) {
366+
effectivePageSize = response.effective_page_size
367+
} else {
368+
if (!isLastPage && Array.isArray(results) && results.length > 0) {
369+
effectivePageSize = results.length
370+
} else if (isLastPage && self.page > 1 && typeof totalCount === 'number' && totalCount > 0) {
371+
var itemsOnLastPage = Array.isArray(results) ? results.length : 0
372+
var pagesBefore = self.page - 1
373+
var calc = Math.floor((totalCount - itemsOnLastPage) / pagesBefore)
374+
if (calc > 0) {
375+
effectivePageSize = calc
376+
} else {
377+
effectivePageSize = 50
378+
}
379+
} else if (Array.isArray(results) && results.length > 0) {
380+
effectivePageSize = results.length
381+
} else {
382+
effectivePageSize = 50
383+
}
384+
}
385+
} else if (typeof self.page_size === 'number' && self.page_size > 0) {
386+
effectivePageSize = self.page_size
387+
} else {
388+
effectivePageSize = 50
389+
}
390+
391+
if (typeof totalCount !== 'number' || totalCount < 0) {
348392
self.total_pages = 1
349393
} else {
350-
const ps = Number(self.page_size) || 1
351-
self.total_pages = Math.max(1, Math.ceil(self.total_count / ps))
394+
self.total_pages = Math.max(1, Math.ceil(totalCount / effectivePageSize))
352395
}
353396
} else {
354397
results = response || []
@@ -640,16 +683,11 @@
640683
// Set checkboxes to be equal to Select_All checkbox
641684
check_boxes.prop('checked', check_boxes.first().is(':checked'))
642685

643-
644686
let inputs = $(self.refs.submission_table).find('input')
645687
let checked_boxes = inputs.not(':first').filter('input:checked')
646688
self.checked_submissions = checked_boxes.serializeArray().map((x) => { return x.name })
647689
}
648690

649-
650-
651-
652-
653691
self.submission_clicked = function (submission) {
654692
// stupid workaround to not modify the original submission object
655693
submission = _.defaultsDeep({}, submission)

0 commit comments

Comments
 (0)