diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2026-06-09 17:47:17 +0200 |
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2026-06-09 17:59:18 +0200 |
| commit | 3538a1a3e6b649fd8dfc5da80cf69770b0e077d9 (patch) | |
| tree | ac2e2f8723bb9f4a23a71a8ca4449ea6e6dc2696 /ishtar_common | |
| parent | e4d433d6bf9e9fde61eff96bd45238f3635b9780 (diff) | |
| download | Ishtar-3538a1a3e6b649fd8dfc5da80cf69770b0e077d9.tar.bz2 Ishtar-3538a1a3e6b649fd8dfc5da80cf69770b0e077d9.zip | |
✨ search: manage empty and non empty search for numeric searches (refs #6752)
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/views_item.py | 21 |
1 files 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) |
