def iftrue(parser, token): ''' call the given method with the specified arguments. {% iftrue object.method arg, ... %} .... {% else %} .... {% endiftrue %} {% iftrue object.method arg1=arg1,arg2=arg2 ... %} .... ''' bits = list(token.split_contents()) if len(bits) < 2: raise TemplateSyntaxError, "%r takes at least 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() object = bits[1] args = [] kwargs = {} bits = iter(bits[2:]) for bit in bits: for arg in bit.split(","): if '=' in arg: k, v = arg.split('=', 1) k = k.strip() kwargs[k] = parser.compile_filter(v) elif arg: args.append(parser.compile_filter(arg)) return IfTrueNode(object, args, kwargs, nodelist_true, nodelist_false) iftrue = register.tag(iftrue) class IfTrueNode(Node): def __init__(self, object, args, kwargs, nodelist_true, nodelist_false): self.object, self.args, self.kwargs = object, args, kwargs self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false def __repr__(self): return "" def render(self, context): args = [arg.resolve(context) for arg in self.args] kwargs = dict([(smart_str(k,'ascii'), v.resolve(context)) for k, v in self.kwargs.items()]) obj_p = self.object.split('.') object = '.'.join(obj_p[:-1]) method = ''.join(obj_p[-1:]) obj = resolve_variable(object,context) func = getattr(obj,method) if func(*args, **kwargs): return self.nodelist_true.render(context) else: return self.nodelist_false.render(context)