diff options
Diffstat (limited to 'ishtar_common/views_item.py')
| -rw-r--r-- | ishtar_common/views_item.py | 134 | 
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): | 
