summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2024-04-30 14:34:20 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2024-04-30 14:34:20 +0200
commit7ad02fce79819039d6a1d52740b5e49a6a4827d1 (patch)
tree9c91640c72d3fa55d86a1eb463206ee00b48784f /ishtar_common
parentb2f84e94fce3ef064b4e98150ebd0d4979bee5cd (diff)
downloadIshtar-7ad02fce79819039d6a1d52740b5e49a6a4827d1.tar.bz2
Ishtar-7ad02fce79819039d6a1d52740b5e49a6a4827d1.zip
🚑️ search query: fix multiple date criteria on the same attribute
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/views_item.py134
1 files changed, 72 insertions, 62 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index 270337ad1..6fd59624a 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -983,73 +983,83 @@ for language_code, language_lbl in settings.LANGUAGES:
deactivate()
+def _manage_date(k, dct):
+ """
+ Manage date from a search query
+ :param k: date key
+ :param dct: search dict
+ :return: None -> search dict is modified
+ """
+ values = dct[k].split(";")
+ results = []
+ for value in values:
+ value = value.replace('"', "").strip()
+ date_type = "eq"
+ if value.startswith(">"):
+ value = value[1:]
+ date_type = "gte"
+ elif value.startswith("<"):
+ value = value[1:]
+ date_type = "lte"
+ has_today = False
+ for today in TODAYS:
+ if value.startswith(today):
+ base_date = datetime.date.today()
+ value = value[len(today):].replace(" ", "")
+ if value and value[0] in ("-", "+"):
+ sign = value[0]
+ try:
+ days = int(value[1:])
+ except ValueError:
+ days = 0
+ if days:
+ if sign == "-":
+ base_date = base_date - datetime.timedelta(days=days)
+ else:
+ base_date = base_date + datetime.timedelta(days=days)
+ value = base_date.strftime("%Y-%m-%d")
+ has_today = True
+ break
+ if has_today:
+ results.append((date_type, value))
+ continue
+ items = []
+ if "/" in value:
+ items = list(reversed(value.split("/")))
+ elif "-" in value: # already date formated
+ items = value.split("-")
+ if len(items) != 3:
+ continue
+ try:
+ results.append((date_type, datetime.datetime(*map(lambda x: int(x), items)).strftime(
+ "%Y-%m-%d"
+ )))
+ except ValueError:
+ pass
+ 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 eqs and not mins and not maxs: # TODO: min and max not available when using single dates
+ dct[k] = ";".join(eqs)
+ return
+ dct.pop(k)
+ if mins:
+ dct[k + "__gte"] = min(mins)
+ if maxs:
+ dct[k + "__lte"] = max(maxs)
+
+
def _manage_dated_fields(dated_fields, dct):
keys = list(dct.keys())
- for k in dated_fields:
- res = [j for j in keys if j.startswith(k)]
+ for key in dated_fields:
+ res = [j for j in keys if j.startswith(key)]
if not res:
continue
- k = res[0]
- if not dct[k]:
- dct.pop(k)
- continue
- values = dct[k].split(";")
- results = []
- for value in values:
- value = value.replace('"', "").strip()
- date_type = "eq"
- if value.startswith(">"):
- value = value[1:]
- date_type = "gte"
- elif value.startswith("<"):
- value = value[1:]
- date_type = "lte"
- has_today = False
- for today in TODAYS:
- if value.startswith(today):
- base_date = datetime.date.today()
- value = value[len(today):].replace(" ", "")
- if value and value[0] in ("-", "+"):
- sign = value[0]
- try:
- days = int(value[1:])
- except ValueError:
- days = 0
- if days:
- if sign == "-":
- base_date = base_date - datetime.timedelta(days=days)
- else:
- base_date = base_date + datetime.timedelta(days=days)
- value = base_date.strftime("%Y-%m-%d")
- has_today = True
- break
- if has_today:
- results.append((date_type, value))
- continue
- items = []
- if "/" in value:
- items = list(reversed(value.split("/")))
- elif "-" in value: # already date formated
- items = value.split("-")
- if len(items) != 3:
+ for k in res:
+ if not dct[k]:
+ dct.pop(k)
continue
- try:
- results.append((date_type, datetime.datetime(*map(lambda x: int(x), items)).strftime(
- "%Y-%m-%d"
- )))
- except ValueError:
- pass
- 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 eqs and not mins and not maxs: # TODO: min and max not available when using single dates
- dct[k] = ";".join(eqs)
- return
- dct.pop(k)
- if mins:
- dct[k + "__gte"] = min(mins)
- if maxs:
- dct[k + "__lte"] = max(maxs)
+ _manage_date(k, dct)
def _clean_type_val(val):