diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/views_item.py | 58 | 
1 files changed, 38 insertions, 20 deletions
| diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 97745921d..33d817a25 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -834,22 +834,29 @@ def _manage_facet_search(model, dct, and_reqs):          if base_k in HIERARCHIC_FIELDS:  # already managed              continue          k = base_k + "__pk" -        if k not in dct or not dct[k].startswith(u'"') \ -                or not dct[k].startswith(u'"'): +        if k not in dct or not dct[k].startswith('"') \ +                or not dct[k].startswith('"'):              continue          val = _clean_type_val(dct.pop(k)) -        if u'";"' in val: +        if '";"' in val:              # OR request -            values = val.split(u";") +            values = val.split(";")          else:              values = [val]          reqs = None          for val in values: -            if not val.endswith(u'"') or not val.startswith(u'"'): +            if not val.endswith('"') or not val.startswith('"'):                  continue -            suffix = "__label__icontains" if u"%" in val else \ -                "__label__iexact" -            query = val[1:-1].replace(u'*', u"") +            lbl_name = "__label__" +            try: +                rel = getattr(model, base_k).field.related_model +                if not hasattr(rel, "label") and hasattr(rel, "cached_label"): +                    lbl_name = "__cached_label__" +            except: +                pass +            suffix = "{}icontains".format(lbl_name) if "%" in val else \ +                "{}iexact".format(lbl_name) +            query = val[1:-1].replace('*', "")              if not reqs:                  reqs = Q(**{base_k + suffix: query})              else: @@ -863,10 +870,13 @@ def _manage_facet_search(model, dct, and_reqs):      for k in dct:          if k in POST_PROCESS_REQUEST and dct[k]:              dct[k] = getattr(model, POST_PROCESS_REQUEST[k])( -                dct[k].replace(u'"', '')) +                dct[k].replace('"', '')) -def _manage_hierarchic_fields(dct, and_reqs): +def _manage_hierarchic_fields(model, dct, and_reqs): +    hierarchic_fields = HIERARCHIC_FIELDS[:] +    if hasattr(model, "hierarchic_fields"): +        hierarchic_fields = model.hierarchic_fields()      for reqs in dct.copy():          if type(reqs) not in (list, tuple):              reqs = [reqs] @@ -928,7 +938,15 @@ def _manage_hierarchic_fields(dct, and_reqs):                  # TODO: improve query with "IN ()"?                  continue -            for k_hr in HIERARCHIC_FIELDS: +            for k_hr in hierarchic_fields: +                lbl_name = "label" +                try: +                    rel = getattr(model, k_hr).field.related_model +                    if not hasattr(rel, "label") and hasattr(rel, +                                                             "cached_label"): +                        lbl_name = "cached_label" +                except: +                    pass                  if type(req) in (list, tuple):                      val = dct.pop(req)                      val = _clean_type_val(val) @@ -942,7 +960,7 @@ def _manage_hierarchic_fields(dct, and_reqs):                      and_reqs.append(q)                      break                  elif req.endswith(k_hr + '__pk') \ -                        or req.endswith(k_hr + '__label__iexact'): +                        or req.endswith(k_hr + '__{}__iexact'.format(lbl_name)):                      val = _clean_type_val(dct.pop(req))                      if '";"' in val: @@ -954,21 +972,21 @@ def _manage_hierarchic_fields(dct, and_reqs):                      reqs = None                      if req.endswith('pk'):                          base_suffix = "pk" -                    elif req.endswith('label__iexact'): -                        base_suffix = "label__iexact" +                    elif req.endswith('{}__iexact'.format(lbl_name)): +                        base_suffix = lbl_name + "__iexact"                      else:                          continue                      for val in values:                          suffix = base_suffix[:]                          req = base_req[:] -                        if val.endswith(u'"') and val.startswith(u'"'): +                        if val.endswith('"') and val.startswith('"'):                              val = val[1:-1]                              # manage search text by label                              if "*" in val: -                                suffix = "label__icontains" -                                val = val.replace('*', u"") +                                suffix = lbl_name + "__icontains" +                                val = val.replace('*', "")                              else: -                                suffix = "label__iexact" +                                suffix = lbl_name + "__iexact"                              req = req[:-(len(base_suffix))] + suffix                          if not reqs: @@ -1675,8 +1693,8 @@ def get_item(model, func_name, default_name, extra_request_keys=None,          _manage_dated_fields(my_dated_fields, dct)          _manage_dated_fields(my_dated_fields, excluded_dct) -        _manage_hierarchic_fields(dct, and_reqs) -        _manage_hierarchic_fields(excluded_dct, exc_and_reqs) +        _manage_hierarchic_fields(model, dct, and_reqs) +        _manage_hierarchic_fields(model, excluded_dct, exc_and_reqs)          _manage_facet_search(model, dct, and_reqs)          _manage_facet_search(model, excluded_dct, exc_and_reqs) | 
