From 4ca93dd817e157906d682f0c70ea1b24fcbd51de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Wed, 14 Jun 2017 16:59:09 +0200 Subject: [PATCH] prepare to manipulate filter arguments --- src/c3nav/editor/wrappers.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/c3nav/editor/wrappers.py b/src/c3nav/editor/wrappers.py index a0a483a9..cc67578c 100644 --- a/src/c3nav/editor/wrappers.py +++ b/src/c3nav/editor/wrappers.py @@ -255,13 +255,26 @@ class BaseQueryWrapper(BaseWrapper): def order_by(self, *args): return self._wrap_queryset(self.get_queryset().order_by(*args)) + def _filter_kwarg(self, name, value): + if name.endswith('__in'): + value = tuple((item._obj if isinstance(item, ModelInstanceWrapper) else item) for item in value) + + if isinstance(value, ModelInstanceWrapper): + value = value._obj + + return Q(**{name: value}) + + def _filter_q(self, q): + result = Q(*((self._filter_q(c) if isinstance(c, Q) else self._filter_kwarg(*c)) for c in q.children)) + result.connector = q.connector + result.negated = q.negated + return result + def filter(self, *args, **kwargs): - kwargs = {name: (value._obj if isinstance(value, ModelInstanceWrapper) else value) - for name, value in kwargs.items()} - kwargs = {name: (((item._obj if isinstance(item, ModelInstanceWrapper) else item) for item in value) - if name.endswith('__in') else value) - for name, value in kwargs.items()} - return self._wrap_queryset(self.get_queryset().filter(*args, **kwargs)) + return self._wrap_queryset(self.get_queryset().filter( + *tuple(self._filter_q(q) for q in args), + *tuple(self._filter_kwarg(name, value) for name, value in kwargs.items()), + )) def count(self): return self.get_queryset().count()