class IfThisNode(template.Node): ''' Like {% if %} but checks if the first value is equal to any of the rest. Example: {% ifthis username isoneof 'steve' 'nick' var_with_other_username %} ... {% else %} ... {% endifthis %} ''' def __init__(self, var, items, nodelist_true, nodelist_false, case_sensitive): self.var, self.items = var, items self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false self.case_sensitive = case_sensitive def __str__(self): return "" def render(self, context): def _parse_var(var): if var.startswith('\'"'): return var[1:-1] else: return template.resolve_variable(var, context) var = _parse_var(self.var) items = map(_parse_var, self.items) if not self.case_sensitive: try: var = var.lower() except AttributeError: pass for n, item in enumerate(items): try: items[n] = item.lower() except AttributeError: pass if var in items: return self.nodelist_true.render(context) else: return self.nodelist_false.render(context) def ifthis(parser, token, case_sensitive=True): bits = token.split_contents() if len(bits) < 4: raise template.TemplateSyntaxError, ( "%r takes at least two arguments" % bits[0] ) if bits[2] != 'isoneof': raise template.TemplateSyntaxError, ( "%r must be of the format {% %r FOO isoneof BAR BAZ ... %}" % (bits[0], 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 = template.NodeList() return IfThisNode( bits[1], bits[3:], nodelist_true, nodelist_false, case_sensitive ) register.tag('ifthis', ifthis) register.tag('insensitiveifthis', lambda p, t: ifthis(p, t, False))