diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2018-02-05 10:32:43 +1300 |
---|---|---|
committer | Paul Eggleton <paul.eggleton@linux.intel.com> | 2018-02-05 10:58:37 +1300 |
commit | a0396ebec70f3f10ab17a10805d55d41f74ad4da (patch) | |
tree | 1f9ef1bf98148593f88284962b4241ba1c3bb5e2 /layerindex | |
parent | d27abc10baa91f274c47458ccb3dfcd8ff068a41 (diff) | |
download | openembedded-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.py | 24 |
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 |