From 90a8462a48bce1cda4102e37f76b0bf3bb827301 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Tue, 18 Nov 2014 05:29:59 +0100 Subject: filters: backport selectattr, rejectattr We want to use jinja2 from wheezy and need to backport two template functions. --- filters.py | 36 ++++++++++++++++++++++++++++++++++++ views.py | 1 + 2 files changed, 37 insertions(+) create mode 100644 filters.py 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 diff --git a/views.py b/views.py index 5df76f8..01dd5c7 100644 --- a/views.py +++ b/views.py @@ -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), -- cgit v1.2.3-1-g7c22