From be46fb1b43775f35da8b49ad28110d16c8692777 Mon Sep 17 00:00:00 2001 From: Maciej Tronowski Date: Fri, 20 Feb 2015 13:48:19 +0100 Subject: [PATCH] pagination of list view --- qcg/constants.py | 1 + qcg/templates/qcg/jobs.html | 71 +++++++++++++++++++++++++++++++++++-------- qcg/utils.py | 24 ++++++++++++++- qcg/views.py | 12 +++++--- 4 files changed, 90 insertions(+), 18 deletions(-) create mode 100644 qcg/constants.py diff --git a/qcg/constants.py b/qcg/constants.py new file mode 100644 index 0000000..b9d55bb --- /dev/null +++ b/qcg/constants.py @@ -0,0 +1 @@ +PER_PAGE = 10 diff --git a/qcg/templates/qcg/jobs.html b/qcg/templates/qcg/jobs.html index 78e3dd2..3bb81a0 100644 --- a/qcg/templates/qcg/jobs.html +++ b/qcg/templates/qcg/jobs.html @@ -75,6 +75,36 @@
+ + + @@ -89,7 +119,7 @@ - {% regroup tasks by job as jobs %} + {% regroup page by job as jobs %} {% for job in jobs %} {% ifequal job.list|length 1 %} @@ -148,20 +178,37 @@ diff --git a/qcg/utils.py b/qcg/utils.py index 353dc0c..76dc318 100644 --- a/qcg/utils.py +++ b/qcg/utils.py @@ -1,9 +1,11 @@ -from datetime import timedelta +from django.core.paginator import Paginator from django.db import transaction from django.utils.timezone import now from pyqcg.service import Registry from pyqcg.utils import Credential, TimePeriod +from qcg import constants + def get_attributes(obj, attrs): return {name: getattr(obj, name) for name in attrs if getattr(obj, name) is not None} @@ -58,3 +60,23 @@ def update_user_data(user, proxy): # release user lock user.last_update = now() user.save() + + +def try_parse_int(s, default=None, base=10): + try: + return int(s, base) + except (TypeError, ValueError): + return default + + +def paginator_context(request, objects, per_page=constants.PER_PAGE): + paginator = Paginator(objects, per_page) + + page_num = try_parse_int(request.GET.get('page'), 1) + if not (1 <= page_num <= paginator.num_pages): + page_num = 1 + + pages_range = range(max(2, min(page_num - 2, paginator.num_pages - 4)), + min(max(page_num + 2, 5), paginator.num_pages) + 1) + + return {'page': paginator.page(page_num), 'num_pages': paginator.num_pages, 'pages_range': pages_range} diff --git a/qcg/views.py b/qcg/views.py index dd6ecf7..0590810 100644 --- a/qcg/views.py +++ b/qcg/views.py @@ -7,10 +7,10 @@ from django.shortcuts import render from django.utils.http import urlencode from django_openid_auth.views import make_consumer from openid.extensions import ax -from pyqcg.qcg import QCG -from qcg.models import Task +from pyqcg import QCG -from qcg.utils import update_user_data +from qcg.models import Task +from qcg.utils import update_user_data, paginator_context def index(request): @@ -47,9 +47,11 @@ def jobs_list(request): tasks = Task.objects.filter(job__owner=request.user) \ .select_related('job').prefetch_related('allocations__nodes') \ - .order_by('-job__submission_time', '-submission_time')[:25] + .order_by('-job__submission_time', '-submission_time') + + context = paginator_context(request, tasks) - return render(request, 'qcg/jobs.html', {'tasks': tasks}) + return render(request, 'qcg/jobs.html', context) def job_details(request): -- 1.7.9.5