pagination of list view
[qcg-portal.git] / qcg / utils.py
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}