Oops, do not return new_context just yet, update and then return
[django-pagination.git] / linaro_django_pagination / templatetags / pagination_tags.py
index 815cb7f..a4e4fed 100644 (file)
@@ -40,8 +40,10 @@ from django.template import (
     TOKEN_BLOCK,
     TemplateSyntaxError,
     Variable,
+    loader,
 )
 from django.template.loader import select_template
+from django.utils.text import unescape_string_literal
 
 # TODO, import this normally later on
 from linaro_django_pagination.settings import *
@@ -92,8 +94,8 @@ def do_autopaginate(parser, token):
     if queryset_var is None:
         raise TemplateSyntaxError(
             "Invalid syntax. Proper usage of this tag is: "
-            "{%% autopaginate QUERYSET [PAGINATE_BY] [ORPHANS]"
-            " [as CONTEXT_VAR_NAME] %%}")
+            "{% autopaginate QUERYSET [PAGINATE_BY] [ORPHANS]"
+            " [as CONTEXT_VAR_NAME] %}")
     return AutoPaginateNode(queryset_var, multiple_paginations, paginate_by, orphans, context_var)
 
 
@@ -133,7 +135,7 @@ class AutoPaginateNode(Node):
         self.multiple_paginations = multiple_paginations
 
     def render(self, context):
-        if self.multiple_paginations or "paginator" in context:
+        if self.multiple_paginations or getattr(context, "paginator", None):
             page_suffix = '_%s' % self.queryset_var
         else:
             page_suffix = ''
@@ -181,32 +183,36 @@ class PaginateNode(Node):
 
     def render(self, context):
         template_list = ['pagination/pagination.html']
-        to_return = paginate(context)
+        new_context = paginate(context)
         if self.template:
             template_list.insert(0, self.template)
-        t = select_template(template_list)
-        if not t:
-            return None
-        context = Context(to_return)
-        return t.render(context)
+        return loader.render_to_string(template_list, new_context, 
+            context_instance = context)
+
 
 
 def do_paginate(parser, token):
     """
-    {% paginate [using] [template] %}
+    Emits the pagination control for the most recent autopaginate list
+
+    Syntax is:
+
+        paginate [using "TEMPLATE"]
 
-    {% paginate %}
-    {% paginate using paginations/custom_pagination.html %}
+    Where TEMPLATE is a quoted template name. If missing the default template
+    is used (paginate/pagination.html).
     """
-    argv = token.contents.split()
+    argv = token.split_contents()
     argc = len(argv)
-    if argc > 3:
-        raise TemplateSyntaxError("Tag %s takes at most 2 argument." % argv[0])
     if argc == 1:
-        return PaginateNode()
-    if argc == 3 and argv[1] == 'using':
-        return PaginateNode(template=argv[2])
-    raise TemplateSyntaxError("Tag %s is invalid. Please check the syntax" % argv[0])
+        template = None
+    elif argc == 3 and argv[1] == 'using':
+        template = unescape_string_literal(argv[2])
+    else:
+        raise TemplateSyntaxError(
+            "Invalid syntax. Proper usage of this tag is: "
+            "{% paginate [using \"TEMPLATE\"] %}")
+    return PaginateNode(template)
 
 
 def paginate(context, window=DEFAULT_WINDOW, margin=DEFAULT_MARGIN):
@@ -297,7 +303,7 @@ def paginate(context, window=DEFAULT_WINDOW, margin=DEFAULT_MARGIN):
             if pages[-1] != paginator.num_pages:
                 pages.append(None)
 
-        to_return = {
+        new_context = {
             'MEDIA_URL': settings.MEDIA_URL,
             'STATIC_URL': getattr(settings, "STATIC_URL", None),
             'display_disabled_next_link': DISPLAY_DISABLED_NEXT_LINK,
@@ -317,12 +323,15 @@ def paginate(context, window=DEFAULT_WINDOW, margin=DEFAULT_MARGIN):
             if 'page%s' % page_suffix in getvars:
                 del getvars['page%s' % page_suffix]
             if len(getvars.keys()) > 0:
-                to_return['getvars'] = "&%s" % getvars.urlencode()
+                new_context['getvars'] = "&%s" % getvars.urlencode()
             else:
-                to_return['getvars'] = ''
-        return to_return
+                new_context['getvars'] = ''
     except (KeyError, AttributeError):
-        return {}
+        new_context = {}
+
+    context.update(new_context)
+
+    return context
 
 
 register = Library()