summaryrefslogtreecommitdiff
path: root/ishtar_common/views_item.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2024-04-08 15:14:44 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2024-04-16 16:43:03 +0200
commit3f2d67d7361ba062780b423728189aaa66c13cea (patch)
tree2fe434db7cee5702525bc9a7ed8e1aef82943385 /ishtar_common/views_item.py
parent5b04b565807929ef7df59b7587ecab799c2df699 (diff)
downloadIshtar-3f2d67d7361ba062780b423728189aaa66c13cea.tar.bz2
Ishtar-3f2d67d7361ba062780b423728189aaa66c13cea.zip
✨ search: manage date range with strings such as ">2024-02-03"
Diffstat (limited to 'ishtar_common/views_item.py')
-rw-r--r--ishtar_common/views_item.py91
1 files changed, 56 insertions, 35 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index 26145161b..6865f3932 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -993,42 +993,63 @@ def _manage_dated_fields(dated_fields, dct):
if not dct[k]:
dct.pop(k)
continue
- value = dct[k].replace('"', "").strip()
- 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)
- dct[k] = base_date.strftime("%Y-%m-%d")
- has_today = True
- break
- if has_today:
- continue
- items = []
- if "/" in value:
- items = list(reversed(value.split("/")))
- elif "-" in value: # already date formated
- items = value.split("-")
- if len(items) != 3:
- dct.pop(k)
+ 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
- try:
- dct[k] = datetime.datetime(*map(lambda x: int(x), items)).strftime(
- "%Y-%m-%d"
- )
- except ValueError:
- dct.pop(k)
+ dct.pop(k)
+ if mins:
+ dct[k + "__gte"] = min(mins)
+ if maxs:
+ dct[k + "__lte"] = max(maxs)
def _clean_type_val(val):