summaryrefslogtreecommitdiff
path: root/ishtar_common/views_item.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-09-09 12:25:51 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-02-28 12:15:20 +0100
commitd2b8f1997ec52e8f32d6fa680d7107ee9421bd31 (patch)
tree0eaed830f776d8d6dee3af1776e701bef1a1f27d /ishtar_common/views_item.py
parent1c10e26f76f7c406576091dcaf4eb94daf835797 (diff)
downloadIshtar-d2b8f1997ec52e8f32d6fa680d7107ee9421bd31.tar.bz2
Ishtar-d2b8f1997ec52e8f32d6fa680d7107ee9421bd31.zip
Find search: hierarchical search by container
Diffstat (limited to 'ishtar_common/views_item.py')
-rw-r--r--ishtar_common/views_item.py58
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)