4 from sets import Set as set
5 from django import template
6 from pagination.registration import get_registry, default_pagination
7 registry = get_registry()
8 from django.db.models.query import QuerySet
9 from django.core.paginator import QuerySetPaginator, InvalidPage
10 #from django.template.loader import render_to_string
12 register = template.Library()
14 def do_autopaginate(parser, token):
15 split = token.split_contents()
17 return AutoPaginateNode()
19 return AutoPaginateNode(queryset_var=split[1])
21 raise template.TemplateSyntaxError('%r tag takes only one optional argument.' % split[0])
23 class AutoPaginateNode(template.Node):
24 def __init__(self, queryset_var=None):
26 self.queryset_var = template.Variable(queryset_var)
28 self.queryset_var = None
30 def render(self, context):
31 if self.queryset_var is not None:
33 key = self.queryset_var.var
34 value = self.queryset_var.resolve(context)
36 pagination = registry.get_for_model(model)
37 if pagination is None:
38 pagination = default_pagination
39 paginator = QuerySetPaginator(value, pagination)
41 page_obj = paginator.page(context['request'].page)
44 context[key] = page_obj.object_list
45 context['paginator'] = paginator
46 context['page_obj'] = page_obj
48 except template.VariableDoesNotExist:
51 for key, value in d.iteritems():
52 if issubclass(value.__class__, QuerySet):
54 pagination = registry.get_for_model(model)
55 if pagination is not None:
56 paginator = QuerySetPaginator(value, pagination)
58 page_obj = paginator.page(context['request'].page)
61 context[key] = page_obj.object_list
62 context['paginator'] = paginator
63 context['page_obj'] = page_obj
67 def paginate(context, window=4):
68 paginator = context['paginator']
69 page_obj = context['page_obj']
70 page_range = paginator.page_range
71 first = set(page_range[:window])
72 last = set(page_range[-window:])
73 current_start = page_obj.number-1-window
76 current_end = page_obj.number-1+window
79 current = set(page_range[current_start:current_end])
81 if len(first.intersection(current)) == 0:
82 pages.extend(sorted(list(first)))
84 pages.extend(sorted(list(current)))
86 pages.extend(sorted(list(first.union(current))))
87 if len(current.intersection(last)) == 0:
89 pages.extend(sorted(list(last)))
91 pages.extend(sorted(list(last.difference(current))))
95 'paginator': paginator,
96 'is_paginated': paginator.count > paginator.per_page,
99 register.inclusion_tag('pagination/pagination.html', takes_context=True)(paginate)
100 register.tag('autopaginate', do_autopaginate)