diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/views_item.py | 93 | 
1 files changed, 45 insertions, 48 deletions
| diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index d93db355b..83d326ee9 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -564,11 +564,9 @@ def _parse_query_string(string, query_parameters, current_dct, exc_dct,                                  dct[k] = dct[k].replace('"', '')                              # distinct query wait for a query                              _manage_clean_search_field(dct) -                            if excluded: -                                extra_distinct_q[-1] = ~Q(**dct) -                            else: -                                extra_distinct_q[-1] = Q(**dct) -                return u"" +                            extra_distinct_q[-1] = \ +                                ~Q(**dct) if excluded else Q(**dct) +                return ""      for reserved_char in FORBIDDEN_CHAR:          string = string.replace(reserved_char, u"")      if len(string) != 1: @@ -576,9 +574,9 @@ def _parse_query_string(string, query_parameters, current_dct, exc_dct,              string = string.replace(reserved_char, u"")      if not string:          return "" -    if string.endswith(u'*'): +    if string.endswith('*'):          if len(string.strip()) == 1: -            return u"" +            return ""          string = string[:-1] + ':*'      elif string not in ("&", "|", "!", "-"):          # like search by default @@ -644,7 +642,7 @@ def _parse_parentheses_groups(groups, query_parameters, current_dct=None,              extra_distinct_q)      if not groups:  # empty list          return "", current_dct, exc_dct, extra_distinct_q -    query = u"(" +    query = "("      previous_sep, has_item = None, False      for item in groups:          q, current_dct, exc_dct, extra_distinct_q = _parse_parentheses_groups( @@ -652,16 +650,13 @@ def _parse_parentheses_groups(groups, query_parameters, current_dct=None,          q = q.strip()          if not q:              continue -        if q in (u"|", u"&"): +        if q in ("|", "&"):              if previous_sep or not has_item:                  continue  # multiple sep is not relevant              previous_sep = q              continue          if has_item: -            if previous_sep: -                query += previous_sep -            else: -                query += u" & " +            query += previous_sep or " & "          query += q          has_item = True          previous_sep = None @@ -685,19 +680,19 @@ def _search_manage_search_vector(model, dct, exc_dct, distinct_queries,      distinct_queries += extra_distinct_q      exc_dct.update(extra_exc_dct) +    if not search_query: +        return dct, exc_dct, distinct_queries +    # remove inside parenthesis +    search_query = search_query.replace('(', '').replace(')', '').strip()      if search_query: -        # remove inside parenthesis -        search_query = \ -            search_query.replace('(', '').replace(')', '').strip() -        if search_query: -            if 'extras' not in dct: -                dct['extras'] = [] -            dct['extras'].append( -                {'where': [model._meta.db_table + -                           ".search_vector @@ (to_tsquery(%s, %s)) = true"], -                 'params': [settings.ISHTAR_SEARCH_LANGUAGE, -                            search_query]} -            ) +        if 'extras' not in dct: +            dct['extras'] = [] +        dct['extras'].append( +            {'where': [model._meta.db_table + +                       ".search_vector @@ (to_tsquery(%s, %s)) = true"], +             'params': [settings.ISHTAR_SEARCH_LANGUAGE, +                        search_query]} +        )      return dct, exc_dct, distinct_queries @@ -743,14 +738,11 @@ def _manage_many_counted_fields(fields, reversed_fields, dct, excluded_dct):      for k in bool_fields:          if k not in dct:              continue -        elif dct[k] == u"1": +        elif dct[k] == "1":              dct.pop(k)              continue -        dct[k] = dct[k].replace(u'"', u'') -        if dct[k] in [u"2", u"yes", str(_(u"Yes")).lower()]: -            dct[k] = True -        else: -            dct[k] = None +        dct[k] = dct[k].replace('"', '') +        dct[k] = True if dct[k] in ["2", "yes", str(_("Yes")).lower()] else None          if reversed_fields and k in reversed_fields:              dct[k] = True if not dct[k] else None          if dct[k]: @@ -1008,19 +1000,25 @@ def _manage_hierarchic_fields(model, dct, and_reqs):                      break -def _manage_clean_search_field(dct): -    for k in dct.keys(): +def _manage_clean_search_field(dct, exclude=None): +    for k in list(dct.keys()):          # clean quoted search field -        if type(dct[k]) == str: -            dct[k] = dct[k].replace(u'"', '') -            dct[k] = _clean_type_val(dct[k]) -            if '*' in dct[k] and k.endswith('__iexact'): -                value = dct.pop(k).strip() -                if value.startswith("*"): -                    value = value[1:] -                if value.endswith("*"): -                    value = value[:-1] -                dct[k[:-len('__iexact')] + '__icontains'] = value +        if type(dct[k]) != str: +            continue +        dct[k] = dct[k].replace('"', '') +        dct[k] = _clean_type_val(dct[k]) +        if '*' not in dct[k] or not k.endswith('__iexact'): +            continue +        value = dct.pop(k).strip() +        if value.startswith("*"): +            value = value[1:] +        if value.endswith("*"): +            value = value[:-1] +        base_key = k[:-len('__iexact')] +        if value: +            dct[base_key + '__icontains'] = value +        elif exclude is not None: +            exclude[base_key + '__exact'] = ""  def _manage_relation_types(relation_types, dct, query, or_reqs): @@ -1069,7 +1067,7 @@ def _manage_relation_types(relation_types, dct, query, or_reqs):  def _construct_query(relation_types, dct, or_reqs, and_reqs):      # manage multi value not already managed -    for key in dct.keys(): +    for key in list(dct.keys()):          if type(dct[key]) == str and u";" in dct[key]:              values = [v for v in dct[key].split(u';') if v]              if not values: @@ -1256,8 +1254,7 @@ def _get_data_from_query(items, query_table_cols, extra_request_keys,      if hasattr(items.model, "locked"):          values.append("locked")          values.append("lock_user_id") -    data_list = items.values_list(*values) -    return data_list +    return items.values_list(*values)  def _get_data_from_query_old(items, query_table_cols, request, @@ -1712,8 +1709,8 @@ def get_item(model, func_name, default_name, extra_request_keys=None,          if 'exc_and_reqs' in dct:              exc_and_reqs += dct.pop('exc_and_reqs') -        _manage_clean_search_field(dct) -        _manage_clean_search_field(excluded_dct) +        _manage_clean_search_field(dct, excluded_dct) +        _manage_clean_search_field(excluded_dct, dct)          query = _construct_query(relation_types, dct, or_reqs, and_reqs)          exc_query = None | 
