diff options
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 |
commit | 3f2d67d7361ba062780b423728189aaa66c13cea (patch) | |
tree | 2fe434db7cee5702525bc9a7ed8e1aef82943385 /ishtar_common/views_item.py | |
parent | 5b04b565807929ef7df59b7587ecab799c2df699 (diff) | |
download | Ishtar-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.py | 91 |
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): |