aboutsummaryrefslogtreecommitdiffstats
path: root/layerindex
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2018-02-05 10:32:43 +1300
committerPaul Eggleton <paul.eggleton@linux.intel.com>2018-02-05 10:58:37 +1300
commita0396ebec70f3f10ab17a10805d55d41f74ad4da (patch)
tree1f9ef1bf98148593f88284962b4241ba1c3bb5e2 /layerindex
parentd27abc10baa91f274c47458ccb3dfcd8ff068a41 (diff)
downloadopenembedded-core-contrib-a0396ebec70f3f10ab17a10805d55d41f74ad4da.tar.gz
Handle __isnull in API query filtering
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>
Diffstat (limited to 'layerindex')
-rw-r--r--layerindex/querysethelper.py24
1 files changed, 14 insertions, 10 deletions
diff --git a/layerindex/querysethelper.py b/layerindex/querysethelper.py
index b4d30c20e9..4e7cac5def 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