diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-02-28 12:23:51 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-02-28 16:03:28 +0100 |
commit | 6cf86374a48ab080f5dfd91ea53cd090a783744e (patch) | |
tree | 1c77a128fdf6de255705ef2f5584c32103d2b29a /ishtar_common | |
parent | 4e61947798d61d14bd07b8c826e216994392e0e4 (diff) | |
download | Ishtar-6cf86374a48ab080f5dfd91ea53cd090a783744e.tar.bz2 Ishtar-6cf86374a48ab080f5dfd91ea53cd090a783744e.zip |
Search: Fix many excluded search (refs #4793, refs #5209)
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/views_item.py | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 839480ba7..eaf05f027 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -1241,11 +1241,22 @@ def _manage_relation_types(relation_types, dct, query, or_reqs): return query -def _construct_query(relation_types, dct, or_reqs, and_reqs): +def _construct_query(relation_types, dct, or_reqs, and_reqs, excluded_relation=False): + # excluded -> reverse logic + if excluded_relation: + and_reqs, or_reqs = or_reqs, and_reqs + for key in dct: + if isinstance(dct[key], str): + values = [v for v in dct[key].split(";") if v] + else: + values = [dct[key]] + for value in values: + or_reqs.append((key, {key: value})) + dct = {} # manage multi value not already managed for key in list(dct.keys()): - if type(dct[key]) == str and ";" in dct[key]: + if isinstance(dct[key], str) and ";" in dct[key]: values = [v for v in dct[key].split(";") if v] if not values: dct.pop(key) @@ -1267,11 +1278,16 @@ def _construct_query(relation_types, dct, or_reqs, and_reqs): or_reqs.append((first_key, {other_key: value})) query = Q(**dct) - for k, or_req in or_reqs: + for or_req in or_reqs: alt_dct = dct.copy() - alt_dct.pop(k) - alt_dct.update(or_req) - query |= Q(**alt_dct) + if isinstance(or_req, (tuple, list)): + k, or_req = or_req + if k in alt_dct: + alt_dct.pop(k) + alt_dct.update(or_req) + query |= Q(**alt_dct) + else: + query |= (Q(**alt_dct) & Q(or_req)) query = _manage_relation_types(relation_types, dct, query, or_reqs) done = [] @@ -2073,7 +2089,8 @@ def get_item( exc_query = None if excluded_dct or exc_and_reqs or exc_or_reqs or exc_relation_types: exc_query = _construct_query( - exc_relation_types, excluded_dct, exc_or_reqs, exc_and_reqs + exc_relation_types, excluded_dct, exc_or_reqs, exc_and_reqs, + excluded_relation=True ) if query_own: |