+from django import template
+from pagination.registration import get_registry, default_pagination
+registry = get_registry()
+from django.db.models.query import QuerySet
+from django.core.paginator import QuerySetPaginator, InvalidPage
+#from django.template.loader import render_to_string
+
+register = template.Library()
+
+def do_autopaginate(parser, token):
+ split = token.split_contents()
+ if len(split) == 1:
+ return AutoPaginateNode()
+ elif len(split) == 2:
+ return AutoPaginateNode(queryset_var=split[1])
+ else:
+ raise template.TemplateSyntaxError('%r tag takes only one optional argument.' % split[0])
+
+class AutoPaginateNode(template.Node):
+ def __init__(self, queryset_var=None):
+ if queryset_var:
+ self.queryset_var = template.Variable(queryset_var)
+ else:
+ self.queryset_var = None
+
+ def render(self, context):
+ if self.queryset_var is not None:
+ try:
+ key = self.queryset_var.var
+ value = self.queryset_var.resolve(context)
+ model = value.model
+ pagination = registry.get_for_model(model)
+ if pagination is None:
+ pagination = default_pagination
+ paginator = QuerySetPaginator(value, pagination)
+ try:
+ page_obj = paginator.page(context['request'].page)
+ except:
+ return u''
+ context[key] = page_obj.object_list
+ context['paginator'] = paginator
+ context['page_obj'] = page_obj
+ return u''
+ except template.VariableDoesNotExist:
+ pass
+ for d in context:
+ for key, value in d.iteritems():
+ if issubclass(value.__class__, QuerySet):
+ model = value.model
+ pagination = registry.get_for_model(model)
+ if pagination is not None:
+ paginator = QuerySetPaginator(value, pagination)
+ try:
+ page_obj = paginator.page(context['request'].page)
+ except:
+ return u''
+ context[key] = page_obj.object_list
+ context['paginator'] = paginator
+ context['page_obj'] = page_obj
+ return u''
+ return u''