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) |