summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
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
commit3538a1a3e6b649fd8dfc5da80cf69770b0e077d9 (patch)
treeac2e2f8723bb9f4a23a71a8ca4449ea6e6dc2696 /ishtar_common
parente4d433d6bf9e9fde61eff96bd45238f3635b9780 (diff)
downloadIshtar-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.py21
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)