* [layerindex-web][PATCH] Handle __isnull in API query filtering
@ 2018-02-04 21:52 Paul Eggleton
0 siblings, 0 replies; only message in thread
From: Paul Eggleton @ 2018-02-04 21:52 UTC (permalink / raw)
To: yocto
If you query on a boolean field you can use the string "False" to match
False in the database; however if you try the same with __isnull then
the query will match every record which is obviously undesirable. If
__isnull is being used, then convert the value to a boolean so that the
query works properly.
An example of this type of query:
http://127.0.0.1:8000/layerindex/api/layerBranches/?filter=yp_compatible_version__isnull:false
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
layerindex/querysethelper.py | 24 ++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/layerindex/querysethelper.py b/layerindex/querysethelper.py
index b4d30c2..4e7cac5 100644
--- a/layerindex/querysethelper.py
+++ b/layerindex/querysethelper.py
@@ -28,16 +28,16 @@ VALUE_SEPARATOR = "!"
DESCENDING = "-"
def __get_q_for_val(name, value):
- if "OR" in value:
- return functools.reduce(operator.or_, map(lambda x: __get_q_for_val(name, x), [ x for x in value.split("OR") ]))
- if "AND" in value:
- return functools.reduce(operator.and_, map(lambda x: __get_q_for_val(name, x), [ x for x in value.split("AND") ]))
- if value.startswith("NOT"):
- kwargs = { name : value.strip("NOT") }
- return ~Q(**kwargs)
- else:
- kwargs = { name : value }
- return Q(**kwargs)
+ if isinstance(value, str):
+ if "OR" in value:
+ return functools.reduce(operator.or_, map(lambda x: __get_q_for_val(name, x), [ x for x in value.split("OR") ]))
+ if "AND" in value:
+ return functools.reduce(operator.and_, map(lambda x: __get_q_for_val(name, x), [ x for x in value.split("AND") ]))
+ if value.startswith("NOT"):
+ kwargs = { name : value.strip("NOT") }
+ return ~Q(**kwargs)
+ kwargs = { name : value }
+ return Q(**kwargs)
def _get_filtering_query(filter_string):
@@ -46,6 +46,10 @@ def _get_filtering_query(filter_string):
values = search_terms[1].split(VALUE_SEPARATOR)
querydict = dict(zip(keys, values))
+ for key in keys:
+ if key.endswith('__isnull'):
+ querydict[key] = (querydict[key].lower() == 'true')
+
return functools.reduce(operator.and_, map(lambda x: __get_q_for_val(x, querydict[x]), [k for k in querydict]))
# we check that the input comes in a valid form that we can recognize
--
2.9.5
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2018-02-04 21:52 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-04 21:52 [layerindex-web][PATCH] Handle __isnull in API query filtering Paul Eggleton
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.