diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-05-23 23:03:57 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-05-23 23:03:57 +0200 |
commit | 61b2b6e73b925735b9ee5f9a018bb599b0900c49 (patch) | |
tree | 3f98c413fca071b24828acb475647e9a5784a8bb /ishtar_common | |
parent | 9122bc96d1c755e55b65b0f2d9c48f55965e61a9 (diff) | |
download | Ishtar-61b2b6e73b925735b9ee5f9a018bb599b0900c49.tar.bz2 Ishtar-61b2b6e73b925735b9ee5f9a018bb599b0900c49.zip |
Search: fix relation type searches
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/views_item.py | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 0cb61eee2..9543d74f5 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -1114,6 +1114,22 @@ def _manage_clean_search_field(dct, exclude=None): exclude[base_key + "__exact"] = "" +def _get_relation_type_dict(my_relation_types_prefix, dct): + relation_types = {} + for rtype_key in my_relation_types_prefix: + relation_types[my_relation_types_prefix[rtype_key]] = set() + for rtype_key in my_relation_types_prefix: + 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) + ) + return relation_types + + def _manage_relation_types(relation_types, dct, query, or_reqs): for rtype_prefix in relation_types: vals = relation_types[rtype_prefix] @@ -1140,10 +1156,11 @@ def _manage_relation_types(relation_types, dct, query, or_reqs): if k.endswith("year"): k += "__exact" alt_dct[rtype_prefix + "right_relations__right_record__" + k] = val - if not dct: + # TODO: AFAC + #if not dct: # fake condition to trick Django (1.4): without it only the # alt_dct is managed - query &= Q(pk__isnull=False) + # query &= Q(pk__isnull=False) query |= Q(**alt_dct) for k, or_req in or_reqs: altor_dct = alt_dct.copy() @@ -1841,18 +1858,10 @@ def get_item( # manage relations types if "relation_types" not in my_relation_types_prefix: my_relation_types_prefix["relation_types"] = "" - relation_types = {} - for rtype_key in my_relation_types_prefix: - relation_types[my_relation_types_prefix[rtype_key]] = set() - for rtype_key in my_relation_types_prefix: - 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) - ) + + relation_types = _get_relation_type_dict(my_relation_types_prefix, dct) + exc_relation_types =_get_relation_type_dict(my_relation_types_prefix, + excluded_dct) _manage_bool_fields( model, my_bool_fields, my_reversed_bool_fields, dct, or_reqs @@ -1893,9 +1902,9 @@ def get_item( query = _construct_query(relation_types, dct, or_reqs, and_reqs) exc_query = None - if excluded_dct or exc_and_reqs or exc_or_reqs: + if excluded_dct or exc_and_reqs or exc_or_reqs or exc_relation_types: exc_query = _construct_query( - relation_types, excluded_dct, exc_or_reqs, exc_and_reqs + exc_relation_types, excluded_dct, exc_or_reqs, exc_and_reqs ) if query_own: |