rendered paste bodyfrom django.template import Node, TemplateSyntaxError, VariableDoesNotExist, Library
register = Library()
class CompareNode(Node):
def __init__(self, var1, var2, nodelist_true, nodelist_false, lessthan, orequal):
self.var1, self.var2 = var1, var2
self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
self.lessthan = lessthan
self.orequal = orequal
def render(self, context):
try:
val1 = resolve_variable(self.var1, context)
except VariableDoesNotExist:
val1 = None
try:
val2 = resolve_variable(self.var2, context)
except VariableDoesNotExist:
val2 = None
try:
if self.lessthan:
if self.orequal:
if val1 <= val2:
return self.nodelist_true.render(context)
else:
if val1 < val2:
return self.nodelist_true.render(context)
else:
if self.orequal:
if val1 >= val2:
return self.nodelist_true.render(context)
else:
if val1 > val2:
return self.nodelist_true.render(context)
except:
pass
return self.nodelist_false.render(context)
def do_compare(parser, token, lessthan, orequal):
"""
Output the contents of the block if depending on how two objects compare to each other.
Examples::
{% iflessthan alpha bravo %}
...
{% endiflessthan %}
{% ifgreaterthan alpha bravo %}
...
{% else %}
...
{% endifnotequal %}
{% iflessthanorequal alpha bravo %}
...
{% endiflessthanorequal %}
{% ifgreaterthanorequal alpha bravo %}
...
{% endifgreaterthanorequal %}
"""
bits = list(token.split_contents())
if len(bits) != 3:
raise TemplateSyntaxError, "%r takes two arguments" % bits[0]
end_tag = 'end' + bits[0]
nodelist_true = parser.parse(('else', end_tag))
token = parser.next_token()
if token.contents == 'else':
nodelist_false = parser.parse((end_tag,))
parser.delete_first_token()
else:
nodelist_false = NodeList()
return CompareNode(bits[1], bits[2], nodelist_true, nodelist_false, lessthan, orequal)
#@register.tag
def iflessthan(parser, token):
return do_compare(parser, token, True, False)
iflessthan = register.tag(iflessthan)
#@register.tag
def ifgreaterthan(parser, token):
return do_compare(parser, token, False, False)
ifgreaterthan = register.tag(ifgreaterthan)
#@register.tag
def iflessthanorequal(parser, token):
return do_compare(parser, token, True, True)
iflessthanorequal = register.tag(iflessthanorequal)
#@register.tag
def ifgreaterthanorequal(parser, token):
return do_compare(parser, token, False, True)
ifgreaterthanorequal = register.tag(ifgreaterthanorequal)