diff options
-rw-r--r-- | filters.py | 36 | ||||
-rw-r--r-- | views.py | 1 |
2 files changed, 37 insertions, 0 deletions
diff --git a/filters.py b/filters.py new file mode 100644 index 0000000..b8b0d47 --- /dev/null +++ b/filters.py @@ -0,0 +1,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 @@ -5,6 +5,7 @@ from flask_peewee.utils import get_object_or_404 from models import Group, Member from forms import CreateGroup, DeleteGroup from utils import templated +from filters import * def get_group_or_404(*query): group = get_object_or_404(Group.select().join(Member), |