Merge branch 'new_paginator'
[philo.git] / contrib / penfield / utils.py
1 from django.core.paginator import Paginator, EmptyPage
2
3
4 class PaginationProxy(object):
5         def __init__(self, paginator=None, page=None, objects=None):
6                 self.paginator = paginator
7                 self.page = page
8                 self.objects = objects
9         
10         @property
11         def page_range(self):
12                 if not self.paginator:
13                         return None
14                 
15                 return self.paginator.page_range
16         
17         @property
18         def num_pages(self):
19                 if not self.paginator:
20                         return None
21                 
22                 return self.paginator.num_pages
23         
24         @property
25         def page_number(self):
26                 if not self.page:
27                         return None
28                 
29                 return self.page.number
30         
31         # Why doesn't this work?
32         #def __bool__(self):
33         #       return bool(self.paginator)
34
35
36 def paginate(objects, per_page=None, page_number=1):
37         """
38         Given a list of objects, return a (page, obj_list) tuple.
39         """
40         try:
41                 per_page = int(per_page)
42         except (TypeError, ValueError):
43                 # Then either it wasn't set or it was set to an invalid value
44                 return PaginationProxy(objects=objects)
45         
46         # There also shouldn't be pagination if the list is too short. Try count()
47         # first - good chance it's a queryset, where count is more efficient.
48         try:
49                 if objects.count() <= per_page:
50                         return PaginationProxy(objects=objects)
51         except AttributeError:
52                 if len(objects) <= per_page:
53                         return PaginationProxy(objects=objects)
54         
55         paginator = Paginator(objects, per_page)
56         try:
57                 page_number = int(page_number)
58         except:
59                 page_number = 1
60         
61         try:
62                 page = paginator.page(page_number)
63         except EmptyPage:
64                 page = None
65         
66         return PaginationProxy(paginator, page, objects)