diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-08-10 12:59:00 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-08-13 18:26:04 +0200 |
commit | 23b95b9d8de9037e40b0c79e9d0fdda1dba23d2b (patch) | |
tree | b3a79525887488ca98e4adccbcab9538c0e6f9a5 /ishtar_common | |
parent | d643afb7db26be3a697bfd0ab1ab2239ef7b1275 (diff) | |
download | Ishtar-23b95b9d8de9037e40b0c79e9d0fdda1dba23d2b.tar.bz2 Ishtar-23b95b9d8de9037e40b0c79e9d0fdda1dba23d2b.zip |
Search administrativ act configuration
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/views_item.py | 178 |
1 files changed, 97 insertions, 81 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 3b09bc7da..1a0ef61e7 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -537,88 +537,91 @@ def _manage_facet_search(model, dct, and_reqs): def _manage_hierarchic_fields(dct, and_reqs): - for req in dct.copy(): - if req.endswith('areas__pk'): - val = _clean_type_val(dct.pop(req)) - reqs = Q(**{req: val}) - base_req = req[:-2] + '__' - req = base_req[:] - for idx in range(HIERARCHIC_LEVELS): - req = req[:-2] + 'parent__pk' - q = Q(**{req: val}) - reqs |= q - req = base_req[:] - for idx in range(HIERARCHIC_LEVELS): - req = req[:-2] + 'children__pk' - q = Q(**{req: val}) - reqs |= q - and_reqs.append(reqs) - continue - - if req.endswith('town__pk') or req.endswith('towns__pk'): - val = _clean_type_val(dct.pop(req)) - reqs = Q(**{req: val}) - base_req = req[:-2] + '__' - req = base_req[:] - for idx in range(HIERARCHIC_LEVELS): - req = req[:-2] + 'parents__pk' - q = Q(**{req: val}) - reqs |= q - req = base_req[:] - for idx in range(HIERARCHIC_LEVELS): - req = req[:-2] + 'children__pk' - q = Q(**{req: val}) - reqs |= q - and_reqs.append(reqs) - continue + for reqs in dct.copy(): + if type(reqs) not in (list, tuple): + reqs = [reqs] + for req in reqs: + if req.endswith('areas__pk'): + val = _clean_type_val(dct.pop(req)) + reqs = Q(**{req: val}) + base_req = req[:-2] + '__' + req = base_req[:] + for idx in range(HIERARCHIC_LEVELS): + req = req[:-2] + 'parent__pk' + q = Q(**{req: val}) + reqs |= q + req = base_req[:] + for idx in range(HIERARCHIC_LEVELS): + req = req[:-2] + 'children__pk' + q = Q(**{req: val}) + reqs |= q + and_reqs.append(reqs) + continue - for k_hr in HIERARCHIC_FIELDS: - if type(req) in (list, tuple): - val = dct.pop(req) - q = None - for idx, r in enumerate(req): - r = _clean_type_val(r) - if not idx: - q = Q(**{r: val}) - else: - q |= Q(**{r: val}) - and_reqs.append(q) - break - elif req.endswith(k_hr + '__pk'): + if req.endswith('town__pk') or req.endswith('towns__pk'): val = _clean_type_val(dct.pop(req)) + reqs = Q(**{req: val}) + base_req = req[:-2] + '__' + req = base_req[:] + for idx in range(HIERARCHIC_LEVELS): + req = req[:-2] + 'parents__pk' + q = Q(**{req: val}) + reqs |= q + req = base_req[:] + for idx in range(HIERARCHIC_LEVELS): + req = req[:-2] + 'children__pk' + q = Q(**{req: val}) + reqs |= q + and_reqs.append(reqs) + continue - if u";" in val: - # OR request - values = val.split(u";") - else: - values = [val] - base_req = req[:] - reqs = None - for val in values: - suffix = "pk" - req = base_req[:] - - if val.startswith(u'"') and val.startswith(u'"'): - # manage search text by label - if u"*" in val: - suffix = "label__icontains" - val = val.replace(u'*', u"") + for k_hr in HIERARCHIC_FIELDS: + if type(req) in (list, tuple): + val = dct.pop(req) + q = None + for idx, r in enumerate(req): + r = _clean_type_val(r) + if not idx: + q = Q(**{r: val}) else: - suffix = "label__iexact" - val = val[1:-1] - req = req[:-2] + suffix + q |= Q(**{r: val}) + and_reqs.append(q) + break + elif req.endswith(k_hr + '__pk'): + val = _clean_type_val(dct.pop(req)) - if not reqs: - reqs = Q(**{req: val}) + if u";" in val: + # OR request + values = val.split(u";") else: - reqs |= Q(**{req: val}) - for idx in range(HIERARCHIC_LEVELS): - req = req[:-(len(suffix))] + 'parent__' + suffix - q = Q(**{req: val}) - reqs |= q - if reqs: - and_reqs.append(reqs) - break + values = [val] + base_req = req[:] + reqs = None + for val in values: + suffix = "pk" + req = base_req[:] + + if val.startswith(u'"') and val.startswith(u'"'): + # manage search text by label + if u"*" in val: + suffix = "label__icontains" + val = val.replace(u'*', u"") + else: + suffix = "label__iexact" + val = val[1:-1] + req = req[:-2] + suffix + + if not reqs: + reqs = Q(**{req: val}) + else: + reqs |= Q(**{req: val}) + for idx in range(HIERARCHIC_LEVELS): + req = req[:-(len(suffix))] + 'parent__' + suffix + q = Q(**{req: val}) + reqs |= q + if reqs: + and_reqs.append(reqs) + break def _manage_clean_search_field(dct): @@ -689,6 +692,16 @@ def _construct_query(relation_types, dct, or_reqs, and_reqs): (key, {key: v}) ) + for k in list(dct.keys()): + if type(k) not in (list, tuple): + continue + first_key = k[0] + value = dct[k][:] + dct.pop(k) + dct[first_key] = value + for other_key in k[1:]: + or_reqs.append((first_key, {other_key: value})) + query = Q(**dct) for k, or_req in or_reqs: alt_dct = dct.copy() @@ -952,11 +965,14 @@ def get_item(model, func_name, default_name, extra_request_keys=[], relation_types = {} for rtype_key in my_relation_types_prefix: relation_types[my_relation_types_prefix[rtype_key]] = set() - for k in list(dct.keys()): - if k.startswith(rtype_key): - relation_types[my_relation_types_prefix[rtype_key]].add( - dct.pop(k) - ) + for keys in list(dct.keys()): + if type(keys) not in (list, tuple): + keys = [keys] + for k in keys: + if k.startswith(rtype_key): + relation_types[my_relation_types_prefix[rtype_key]].add( + dct.pop(k) + ) _manage_bool_fields(model, my_bool_fields, my_reversed_bool_fields, dct, or_reqs) |