From 3538a1a3e6b649fd8dfc5da80cf69770b0e077d9 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 9 Jun 2026 17:47:17 +0200 Subject: ✨ search: manage empty and non empty search for numeric searches (refs #6752) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ishtar_common/views_item.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index ccc514070..a925e71ce 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -1092,7 +1092,7 @@ def __manage_relative_search(value): """ Parse search to manage "=", "=>" and "=<" searches :param value: value - :return: value, search type ("eq", "lte" or "gte") + :return: value, search type ("eq", "lte", "gte", "exist") """ value = value.replace('"', "").strip() search_type = "eq" @@ -1102,10 +1102,12 @@ def __manage_relative_search(value): elif value.startswith("<"): value = value[1:] search_type = "lte" + if value == "*": + search_type = "exist" return value, search_type -def _manage_number(k, dct): +def _manage_number(k, dct, excluded=False): """ Manage number from a search query :param k: number key @@ -1116,6 +1118,9 @@ def _manage_number(k, dct): results = [] for value in values: value, search_type = __manage_relative_search(value) + if search_type == "exist": + results.append((search_type, value)) + continue try: value = str(float(value.replace(",", "."))) if value.endswith(".0"): @@ -1126,6 +1131,12 @@ def _manage_number(k, dct): mins = [value for dt, value in results if dt == "gte"] maxs = [value for dt, value in results if dt == "lte"] eqs = [value for dt, value in results if dt == "eq"] + if any([value for dt, value in results if dt == "exist"]): + dct.pop(k) + dct[k + "__isnull"] = False + if excluded and "__" in k: # if on a related field add an exist condition + dct["__".join(k.split("__")[:-1]) + "__isnull"] = True + return if eqs and not mins and not maxs: # TODO: min and max not available dct[k] = ";".join(eqs) return @@ -1136,7 +1147,7 @@ def _manage_number(k, dct): dct[k + "__lte"] = max(maxs) -def _manage_number_fields(fields, dct): +def _manage_number_fields(fields, dct, excluded=False): keys = list(dct.keys()) for key in fields: res = [j for j in keys if j.startswith(key)] @@ -1146,7 +1157,7 @@ def _manage_number_fields(fields, dct): if not dct[k]: dct.pop(k) continue - _manage_number(k, dct) + _manage_number(k, dct, excluded=excluded) today_lbl = pgettext_lazy("key for text search", "today") @@ -2544,7 +2555,7 @@ def main_manager( _manage_dated_fields(my_dated_fields, datetime_fields, excluded_dct) _manage_number_fields(my_number_fields, dct) - _manage_number_fields(my_number_fields, excluded_dct) + _manage_number_fields(my_number_fields, excluded_dct, excluded=True) _manage_hierarchic_fields(model, dct, and_reqs) _manage_hierarchic_fields(model, excluded_dct, exc_and_reqs) -- cgit v1.2.3