diff options
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 |
commit | 7ad02fce79819039d6a1d52740b5e49a6a4827d1 (patch) | |
tree | 9c91640c72d3fa55d86a1eb463206ee00b48784f | |
parent | b2f84e94fce3ef064b4e98150ebd0d4979bee5cd (diff) | |
download | Ishtar-7ad02fce79819039d6a1d52740b5e49a6a4827d1.tar.bz2 Ishtar-7ad02fce79819039d6a1d52740b5e49a6a4827d1.zip |
🚑️ search query: fix multiple date criteria on the same attribute
-rw-r--r-- | archaeological_finds/models_finds.py | 1 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 134 |
2 files changed, 73 insertions, 62 deletions
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 6cb1499ca..aea0f51b4 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -1224,6 +1224,7 @@ class Find( "museum_entry_date__gte", "museum_entry_date_end__lte", "museum_entry_date_end__gte", + "museum_allocation_date", "museum_allocation_date__lte", "museum_allocation_date__gte", ] 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): |