blob: eb0e1c832b6c7edec313f4adb3c9c57e930bec36 (
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
37
38
39
|
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
|