From b0a3c3b146ebf670838fc7f919ff73c2ef16c6f3 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 28 Feb 2023 12:23:51 +0100 Subject: Search: Fix many excluded search (refs #4793, refs #5209) --- ishtar_common/views_item.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'ishtar_common/views_item.py') 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: -- cgit v1.2.3