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