Skip to content
This repository has been archived by the owner on Apr 17, 2021. It is now read-only.

Commit

Permalink
Work with fresh kwargs in tag render methods.
Browse files Browse the repository at this point in the history
Manipulating self.kwargs in render methods caused problems when using
more than one pager per template context. It probably wasn't thread-safe
either.
  • Loading branch information
John Hensley committed Apr 26, 2012
1 parent 14eeb56 commit b4a03c4
Showing 1 changed file with 14 additions and 17 deletions.
31 changes: 14 additions & 17 deletions bootstrap-pagination/templatetags/bootstrap_pagination.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,26 @@
import re

from django.core.urlresolvers import reverse, NoReverseMatch
from django.template import Context, Node, Library
from django.template import Context, Node, Library, TemplateSyntaxError, VariableDoesNotExist
from django.template.loader import get_template
from django.template import FilterExpression
from django.template.defaultfilters import stringfilter
from django.utils.encoding import force_unicode
from django.conf import settings
from django.http import QueryDict

register = Library()


def strToBool(val):
"""
Helper function to turn a string representation of "true" into
boolean True.
"""
return val.lower() == "true"


def get_page_url(page_num, current_app, url_view_name, url_extra_args, url_extra_kwargs, url_param_name, url_get_params):
"""
Helper function to return a valid URL string given the template tag parameters
"""
"""
if url_view_name is not None:
# Add page param to the kwargs list. Overrides any previously set parameter of the same name.
url_extra_kwargs[url_param_name] = page_num
Expand All @@ -44,25 +43,26 @@ def get_page_url(page_num, current_app, url_view_name, url_extra_args, url_extra

if (len(url_get_params) > 0):
url += '?' + url_get_params.urlencode()

return url


class BootstrapPagerNode(Node):
def __init__(self, page, kwargs):
self.page = page
self.kwargs = kwargs

def render(self, context):
page = self.page.resolve(context)
kwargs = self.kwargs
kwargs = {}

# Retrieve variable instances from context where necessary
for argname, argvalue in kwargs.items():
for argname, argvalue in self.kwargs.items():
try:
kwargs[argname] = argvalue.resolve(context)
except AttributeError:
kwargs[argname] = argvalue
except template.VariableDoesNotExist:
except VariableDoesNotExist:
kwargs[argname] = None

centered = strToBool(kwargs.get("centered", "false"))
Expand All @@ -88,7 +88,6 @@ def render(self, context):
if page.has_next():
next_page_url = get_page_url(page.next_page_number(), context.current_app, url_view_name, url_extra_args, url_extra_kwargs, url_param_name, url_get_params)


return get_template("bootstrap-pagination/pager.html").render(
Context({
'page': page,
Expand All @@ -101,6 +100,7 @@ def render(self, context):
'next_page_url': next_page_url
}, autoescape=False))


class BootstrapPaginationNode(Node):
"""
Render the Bootstrap pagination bar with the given parameters
Expand All @@ -111,15 +111,15 @@ def __init__(self, page, kwargs):

def render(self, context):
page = self.page.resolve(context)
kwargs = self.kwargs
kwargs = {}

# Retrieve variable instances from context where necessary
for argname, argvalue in kwargs.items():
for argname, argvalue in self.kwargs.items():
try:
kwargs[argname] = argvalue.resolve(context)
except AttributeError:
kwargs[argname] = argvalue
except template.VariableDoesNotExist:
except VariableDoesNotExist:
kwargs[argname] = None

# Unpack our keyword arguments, substituting defaults where necessary
Expand Down Expand Up @@ -195,7 +195,6 @@ def render(self, context):
if page.has_next():
next_page_url = get_page_url(page.next_page_number(), context.current_app, url_view_name, url_extra_args, url_extra_kwargs, url_param_name, url_get_params)


return get_template("bootstrap-pagination/pagination.html").render(
Context({
'page': page,
Expand All @@ -213,6 +212,7 @@ def render(self, context):
'next_page_url': next_page_url
}, autoescape=False))


@register.tag
def bootstrap_paginate(parser, token):
"""
Expand Down Expand Up @@ -297,11 +297,9 @@ def bootstrap_paginate(parser, token):
name, value = match.groups()
kwargs[name] = parser.compile_filter(value)


return BootstrapPaginationNode(page, kwargs)



@register.tag
def bootstrap_pager(parser, token):
"""
Expand Down Expand Up @@ -366,5 +364,4 @@ def bootstrap_pager(parser, token):
name, value = match.groups()
kwargs[name] = parser.compile_filter(value)


return BootstrapPagerNode(page, kwargs)

0 comments on commit b4a03c4

Please sign in to comment.