summaryrefslogtreecommitdiffstats
path: root/filters.py
blob: b8b0d475600c50adde626981bca6e4c9a1e1bd53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from app import app
from jinja2 import contextfilter
from jinja2.filters import make_attrgetter

@app.template_filter('selectattr')
@contextfilter
def do_selectattr(*args, **kwargs):
    return _select_or_reject(args, kwargs, lambda x: x)

@app.template_filter('rejectattr')
@contextfilter
def do_rejectattr(*args, **kwargs):
    return _select_or_reject(args, kwargs, lambda x: not x)

def _select_or_reject(args, kwargs, modfunc):
    context = args[0]
    seq = args[1]

    try:
        attr = args[2]
    except LookupError:
        raise FilterArgumentError('Missing parameter for attribute name')
    transfunc = make_attrgetter(context.environment, attr)

    try:
        name = args[3]
        args = args[4:]
        func = lambda item: context.environment.call_test(
            name, item, args, kwargs)
    except LookupError:
        func = bool

    if seq:
        for item in seq:
            if modfunc(func(transfunc(item))):
                yield item