pagination of list view
authorMaciej Tronowski <mtro@man.poznan.pl>
Fri, 20 Feb 2015 12:48:19 +0000 (13:48 +0100)
committerMaciej Tronowski <mtro@man.poznan.pl>
Fri, 20 Feb 2015 12:48:19 +0000 (13:48 +0100)
qcg/constants.py [new file with mode: 0644]
qcg/templates/qcg/jobs.html
qcg/utils.py
qcg/views.py

diff --git a/qcg/constants.py b/qcg/constants.py
new file mode 100644 (file)
index 0000000..b9d55bb
--- /dev/null
@@ -0,0 +1 @@
+PER_PAGE = 10
index 78e3dd2..3bb81a0 100644 (file)
 
     <hr />
 
+
+    <nav class="text-center" style="margin-bottom: 15px">
+        <form action="{{ request.path }}" method="get" class="form-inline" role="form" style="display: inline-block">
+            <div class="input-group input-group-sm">
+                <span class="input-group-btn">
+                    {% if page.has_previous %}
+                        <a href="{{ request.path }}?page={{ page.previous_page_number }}" class="btn btn-default">
+                    {% else %}
+                        <a href="#" class="btn btn-default disabled">
+                    {% endif %}
+                        <span class="glyphicon glyphicon-chevron-left"></span>
+                    </a>
+                </span>
+                <label class="sr-only" for="page">Strona</label>
+                <input type="text" class="form-control text-center" id="page" name="page" value="{{ page.number }}" style="width: 50px">
+                <span class="input-group-btn">
+                    {% if page.has_next %}
+                        <a href="{{ request.path }}?page={{ page.next_page_number }}" class="btn btn-default">
+                    {% else %}
+                        <a href="#" class="btn btn-default disabled">
+                    {% endif %}
+                        <span class="glyphicon glyphicon-chevron-right"></span>
+                    </a>
+                </span>
+            </div>
+        </form>
+        &nbsp;z&nbsp;
+        <a href="{{ request.path }}?page={{ num_pages }}">{{ num_pages }}</a>
+    </nav>
+
     <table class="table table-hover tree">
         <thead>
             <tr>
             </tr>
         </thead>
         <tbody>
-            {% regroup tasks by job as jobs %}
+            {% regroup page by job as jobs %}
 
             {% for job in jobs %}
                 {% ifequal job.list|length 1 %}
 
     <nav class="text-center">
         <ul class="pagination">
-            <li>
-                <a href="#" aria-label="Previous">
-                    <span aria-hidden="true">&laquo;</span>
+            {% if page.has_previous %}
+                <li>
+                    <a href="{{ request.path }}?page={{ page.previous_page_number }}" aria-label="Previous">
+                    <span aria-hidden="true"><span class="glyphicon glyphicon-chevron-left"></span>&nbsp;poprzednia</span>
                 </a>
+            {% endif %}
+            </li>
+
+            <li{% ifequal page.number 1 %} class="active"{% endifequal %}>
+                <a href="{{ request.path }}?page=1">1</a>
             </li>
-            <li><a href="#">1</a></li>
-            <li><a href="#">2</a></li>
-            <li><a href="#">3</a></li>
-            <li><a href="#">4</a></li>
-            <li><a href="#">5</a></li>
-            <li>
-                <a href="#" aria-label="Next">
-                    <span aria-hidden="true">&raquo;</span>
+
+            {% if pages_range.0 > 2 %}
+                <li class="disabled"><span aria-hidden="true"><strong>&hellip;</strong></span></li>
+            {% endif %}
+
+            {% for num in pages_range %}
+                <li{% ifequal page.number num %} class="active"{% endifequal %}>
+                    <a href="{{ request.path }}?page={{ num }}">{{ num }}</a>
+                </li>
+            {% endfor %}
+
+            <li class="disabled"><span aria-hidden="true"><strong>z</strong></span></li>
+            <li><a href="{{ request.path }}?page={{ num_pages }}">{{ num_pages }}</a></li>
+
+            {% if page.has_next %}
+                <li>
+                    <a href="{{ request.path }}?page={{ page.next_page_number }}" aria-label="Next">
+                    <span aria-hidden="true">nastÄ™pna&nbsp;<span class="glyphicon glyphicon-chevron-right"></span></span>
                 </a>
+            {% endif %}
             </li>
         </ul>
     </nav>
index 353dc0c..76dc318 100644 (file)
@@ -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}
index dd6ecf7..0590810 100644 (file)
@@ -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):