0318e5e695f78ca465a40f8321f01f55d2993052
[philo.git] / contrib / penfield / utils.py
1 from django.core.paginator import Paginator
2
3
4 def paginate(objects, per_page=None, page_number=1):
5         """
6         Given a list of objects, return a (page, obj_list) tuple.
7         """
8         try:
9                 per_page = int(per_page)
10         except (TypeError, ValueError):
11                 # Then either it wasn't set or it was set to an invalid value
12                 return None, objects
13         
14         # There also shouldn't be pagination if the list is too short. Try count()
15         # first - good chance it's a queryset, where count is more efficient.
16         try:
17                 if objects.count() <= per_page:
18                         return None, objects
19         except AttributeError:
20                 if len(objects) <= per_page:
21                         return None, objects
22         
23         paginator = Paginator(objects, per_page)
24         try:
25                 page_number = int(page_number)
26         except:
27                 page_number = 1
28         
29         # This will raise an EmptyPage error if the page number is out of range.
30         # This error is intentionally left for the calling function to handle.
31         page = paginator.page(page_number)
32         
33         return page, page.object_list