summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
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
commit23b95b9d8de9037e40b0c79e9d0fdda1dba23d2b (patch)
treeb3a79525887488ca98e4adccbcab9538c0e6f9a5 /ishtar_common
parentd643afb7db26be3a697bfd0ab1ab2239ef7b1275 (diff)
downloadIshtar-23b95b9d8de9037e40b0c79e9d0fdda1dba23d2b.tar.bz2
Ishtar-23b95b9d8de9037e40b0c79e9d0fdda1dba23d2b.zip
Search administrativ act configuration
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/views_item.py178
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)