diff options
-rw-r--r-- | archaeological_context_records/models.py | 1 | ||||
-rw-r--r-- | archaeological_files/models.py | 5 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 35 | ||||
-rw-r--r-- | archaeological_finds/models_treatments.py | 3 | ||||
-rw-r--r-- | archaeological_operations/models.py | 9 | ||||
-rw-r--r-- | ishtar_common/models.py | 21 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 3 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 63 | ||||
-rw-r--r-- | locale/fr/LC_MESSAGES/django.po | 4 |
9 files changed, 111 insertions, 33 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index a112829f1..940b7347f 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -598,6 +598,7 @@ class ContextRecord( "archaeological_site": SearchAltName( pgettext_lazy("key for text search", "site"), "archaeological_site__cached_label__icontains", + related_name="archaeological_site" ), "ope_relation_types": SearchAltName( pgettext_lazy("key for text search", "operation-relation-type"), diff --git a/archaeological_files/models.py b/archaeological_files/models.py index 49f680031..dcee68e88 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -477,6 +477,7 @@ class File( "parcel": SearchAltName( pgettext_lazy("key for text search", "parcel"), "parcels__cached_label__iexact", + related_name="parcels" ), "towns__numero_insee__startswith": SearchAltName( pgettext_lazy("key for text search", "department"), @@ -494,10 +495,12 @@ class File( "saisine_type": SearchAltName( pgettext_lazy("key for text search", "saisine-type"), "saisine_type__label__iexact", + related_name="saisine_type" ), "permit_type": SearchAltName( pgettext_lazy("key for text search", "permit-type"), "permit_type__label__iexact", + related_name="permit_type" ), "permit_reference": SearchAltName( pgettext_lazy("key for text search", "permit-reference"), @@ -513,10 +516,12 @@ class File( "general_contractor": SearchAltName( pgettext_lazy("key for text search", "general-contractor"), "general_contractor__cached_label__iexact", + related_name="general_contractor" ), "general_contractor__attached_to": SearchAltName( pgettext_lazy("key for text search", "general-contractor-organization"), "general_contractor__attached_to__cached_label__iexact", + related_name="general_contractor__attached_to" ), } ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index aa92a93c4..35ba0f5c0 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -1365,6 +1365,7 @@ class Find( "material_types": SearchAltName( pgettext_lazy("key for text search", "material"), "material_types__label__iexact", + related_name="material_types", ), "object_types": SearchAltName( pgettext_lazy("key for text search", "object-type"), @@ -1603,7 +1604,7 @@ class Find( ), "dimensions_comment": SearchAltName( pgettext_lazy("key for text search", "dimensions-comment"), - "dimensions_comment__icontains", + "dimensions_comment__iexact", ), "base_finds__topographic_localisation": SearchAltName( pgettext_lazy("key for text search", "topographic-localisation"), @@ -1701,16 +1702,19 @@ class Find( ), "museum_owner_institution": SearchAltName( pgettext_lazy("key for text search", "museum-owner-institution"), - "museum_owner_institution__name__iexact" + "museum_owner_institution__name__iexact", + related_name="museum_owner_institution" ), "museum_assigned_institution": SearchAltName( pgettext_lazy("key for text search", "museum-assigned-institution"), - "museum_assigned_institution__name__iexact" + "museum_assigned_institution__name__iexact", + related_name="museum_assigned_institution" ), "museum_custodian_institution": SearchAltName( pgettext_lazy("key for text search", "museum-custodian-institution"), - "museum_custodian_institution__name__iexact" - ), + "museum_custodian_institution__name__iexact", + related_name="museum_custodian_institution" + ), "museum_depositor_inventory_number": SearchAltName( pgettext_lazy("key for text search", "museum-depositor-inventory-number"), "museum_depositor_inventory_number__iexact" @@ -1745,7 +1749,8 @@ class Find( ), "museum_donor": SearchAltName( pgettext_lazy("key for text search", "museum-donor"), - "museum_donor__denomination__iexact" + "museum_donor__denomination__iexact", + related_name="museum_donor" ), "museum_inventory_marking_presence": SearchAltName( pgettext_lazy("key for text search", "museum-inventory-marking-presence"), @@ -1757,12 +1762,14 @@ class Find( ), "museum_collection": SearchAltName( pgettext_lazy("key for text search", "museum-collection"), - "museum_collection__label__iexact" - ), + "museum_collection__label__iexact", + related_name="museum_collection" + ), "museum_former_collections": SearchAltName( pgettext_lazy("key for text search", "museum-former-collection"), - "museum_former_collections__denomination__iexact" - ), + "museum_former_collections__denomination__iexact", + related_name="museum_former_collections" + ), "museum_inventory_entry_year_before": SearchAltName( pgettext_lazy("key for text search", "museum-inventory-entry-year-before"), "museum_inventory_entry_year__lte" @@ -1773,7 +1780,8 @@ class Find( ), "museum_inventory_conformity": SearchAltName( pgettext_lazy("key for text search", "museum-inventory-conformity"), - "museum_inventory_conformity__label__iexact" + "museum_inventory_conformity__label__iexact", + related_name="museum_inventory_conformity" ), "museum_conformity_comment": SearchAltName( pgettext_lazy("key for text search", "museum-conformity-comment"), @@ -1785,8 +1793,9 @@ class Find( ), "museum_original_repro": SearchAltName( pgettext_lazy("key for text search", "museum-original-repro"), - "museum_original_repro__label__iexact" - ), + "museum_original_repro__label__iexact", + related_name="museum_original_repro" + ), "museum_allocation_date_before": SearchAltName( pgettext_lazy("key for text search", "museum-allocation-date-before"), "museum_allocation_date__lte" diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py index abd5de98b..3d1759b54 100644 --- a/archaeological_finds/models_treatments.py +++ b/archaeological_finds/models_treatments.py @@ -164,6 +164,7 @@ class Treatment( "scientific_monitoring_manager": SearchAltName( pgettext_lazy("key for text search", "scientific-manager"), "scientific_monitoring_manager__cached_label__iexact", + related_name="scientific_monitoring_manager" ), } ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) @@ -1067,10 +1068,12 @@ class TreatmentFile( "applicant": SearchAltName( pgettext_lazy("key for text search", "applicant"), "applicant__cached_label__iexact", + related_name="applicant" ), "applicant_organisation": SearchAltName( pgettext_lazy("key for text search", "applicant-organisation"), "applicant_organisation__cached_label__iexact", + related_name="applicant_organisation" ), "exhibition_start_before": SearchAltName( pgettext_lazy("key for text search", "exhibition-start-before"), diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 13be0727b..be2af0d1a 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -1148,6 +1148,7 @@ class Operation( "parcel": SearchAltName( pgettext_lazy("key for text search", "parcel"), "parcels__cached_label__iexact", + related_name="parcels" ), "towns__numero_insee__startswith": SearchAltName( pgettext_lazy("key for text search", "department"), @@ -1169,14 +1170,17 @@ class Operation( "in_charge": SearchAltName( pgettext_lazy("key for text search", "scientific-monitor"), "in_charge__cached_label__iexact", + related_name="in_charge" ), "scientist": SearchAltName( pgettext_lazy("key for text search", "scientist"), "scientist__cached_label__iexact", + related_name="scientist" ), "operator": SearchAltName( pgettext_lazy("key for text search", "operator"), "operator__cached_label__iexact", + related_name="operator" ), "remains": SearchAltName( pgettext_lazy("key for text search", "remain"), "remains__label__iexact" @@ -1226,6 +1230,7 @@ class Operation( "archaeological_sites": SearchAltName( pgettext_lazy("key for text search", "site"), "archaeological_sites__cached_label__icontains", + related_name="archaeological_sites" ), "documentation_deposit_date": SearchAltName( pgettext_lazy("key for text search", "documentation-deposit-date"), @@ -1263,7 +1268,9 @@ class Operation( "finds_deadline__gte", ), "drassm_code": SearchAltName( - pgettext_lazy("key for text search", "code-drassm"), "drassm_code__iexact" + pgettext_lazy("key for text search", "code-drassm"), + "drassm_code__iexact", + related_name="drassm_code" ), } ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) diff --git a/ishtar_common/models.py b/ishtar_common/models.py index d13b2eaa2..c098eee02 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -2894,18 +2894,21 @@ class Person(Address, Merge, OwnPerms, ValueGetter, MainItem): pgettext_lazy("key for text search", "email"), "email__iexact" ), "title": SearchAltName( - pgettext_lazy("key for text search", "title"), "title__label__iexact" - ), + pgettext_lazy("key for text search", "title"), "title__label__iexact", + related_name="title" + ), "salutation": SearchAltName( pgettext_lazy("key for text search", "salutation"), "salutation__iexact" ), "person_types": SearchAltName( pgettext_lazy("key for text search", "type"), "person_types__label__iexact", + related_name="person_types" ), "attached_to": SearchAltName( pgettext_lazy("key for text search", "organization"), "attached_to__cached_label__iexact", + related_name="attached_to" ), "ishtaruser__isnull": SearchAltName( pgettext_lazy("key for text search", "has-account"), @@ -4292,10 +4295,12 @@ class Document( "authors": SearchAltName( pgettext_lazy("key for text search", "author"), "authors__cached_label__iexact", + related_name="authors" ), "publisher": SearchAltName( pgettext_lazy("key for text search", "publisher"), "publisher__name__iexact", + related_name="publisher" ), "publishing_year": SearchAltName( pgettext_lazy("key for text search", "publishing-year"), @@ -4321,11 +4326,13 @@ class Document( "description__iexact", ), "tag": SearchAltName( - pgettext_lazy("key for text search", "tag"), "tags__label__iexact" + pgettext_lazy("key for text search", "tag"), "tags__label__iexact", + related_name="tags" ), "format": SearchAltName( pgettext_lazy("key for text search", "format"), "format_type__label__iexact", + related_name="format_type" ), "support": SearchAltName( pgettext_lazy("key for text search", "medium"), @@ -4338,6 +4345,7 @@ class Document( "licenses": SearchAltName( pgettext_lazy("key for text search", "license"), "licenses__label__iexact", + related_name="licenses" ), "rights_owner": SearchAltName( pgettext_lazy("key for text search", "rights-owner"), @@ -4352,6 +4360,7 @@ class Document( "associated_url": SearchAltName( pgettext_lazy("key for text search", "url"), "associated_url__iexact", + related_name="associated_url" ), "isbn": SearchAltName( pgettext_lazy("key for text search", "isbn"), "isbn__iexact" @@ -4388,6 +4397,7 @@ class Document( "operation": SearchAltName( pgettext_lazy("key for text search", "operation"), "operations__cached_label__iexact", + related_name="operations" ), "operations__operation_type": SearchAltName( pgettext_lazy("key for text search", "operation-type"), @@ -4400,14 +4410,17 @@ class Document( "context_record": SearchAltName( pgettext_lazy("key for text search", "context-record"), "context_records__cached_label__iexact", + related_name="context_records" ), "find_basket": SearchAltName( pgettext_lazy("key for text search", "basket-finds"), "finds__basket__label__iexact", + related_name="finds__basket" ), "find": SearchAltName( pgettext_lazy("key for text search", "find"), "finds__cached_label__iexact", + related_name="finds" ), "find__denomination": SearchAltName( pgettext_lazy("key for text search", "find-denomination"), @@ -4420,6 +4433,7 @@ class Document( "containers": SearchAltName( pgettext_lazy("key for text search", "container"), "containers__cached_label__iexact", + related_name="containers" ), "site": SearchAltName( pgettext_lazy("key for text search", "site"), @@ -4432,6 +4446,7 @@ class Document( "town": SearchAltName( pgettext_lazy("key for text search", "town"), "towns__name__iexact", + related_name="towns" ), "area": SearchAltName( pgettext_lazy("key for text search", "area"), diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index f58ff8f09..6abe515d6 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -1115,12 +1115,13 @@ class FullSearch(models.Model): class SearchAltName(object): def __init__( - self, search_key, search_query, extra_query=None, distinct_query=False + self, search_key, search_query, extra_query=None, distinct_query=False, related_name=None ): self.search_key = search_key self.search_query = search_query self.extra_query = extra_query or {} self.distinct_query = distinct_query + self.related_name = related_name class Imported(models.Model): diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 1a35e766e..9f2fbb7b5 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -753,6 +753,8 @@ def _parse_query_string( dct = exc_dct if query_parameters[base_term].extra_query: dct.update(query_parameters[base_term].extra_query) + if query_parameters[base_term].related_name and query == '"*"': + term = query_parameters[base_term].related_name if term in dct: dct[term] += ";" + query else: @@ -1140,10 +1142,20 @@ def _manage_hierarchic_fields(model, dct, and_reqs): suffix = "label__iexact" else: continue - val = _clean_type_val(dct.pop(req)) if val.startswith('"') and val.endswith('"'): val = val[1:-1] + if val == "*": + req = req.replace("label__", "").replace("pk", "").replace("iexact", "") + req += "isnull" + reqs = Q(**{req: False}) + and_reqs.append(reqs) + continue + elif "*" in val and "iexact" in suffix: + suffix = suffix.replace("iexact", "icontains") + req = req.replace("iexact", "icontains") + val = val.replace("*", "") + reqs = Q(**{req: val}) for idx in range(HIERARCHIC_LEVELS): @@ -1154,12 +1166,18 @@ def _manage_hierarchic_fields(model, dct, and_reqs): # TODO: improve query with "IN ()"? continue - if req.endswith("wcontainer_id") or req.endswith("wcontainer_ref_id"): + if req.endswith("wcontainer_id") or req.endswith("wcontainer_ref_id"): val = _clean_type_val(dct.pop(req)).strip('"') if val.startswith('"') and val.endswith('"'): val = val[1:-1] vals = [v.replace('"', "") for v in val.split(";")] + req = req[1:] # remove "w" container_ids = [] + if "*" in vals: + main_req = Q(**{req + "__isnull": False}) + and_reqs.append(main_req) + continue + for val in vals: q = Container.objects.filter(cached_label__iexact=val).values_list( "id", flat=True) @@ -1167,7 +1185,6 @@ def _manage_hierarchic_fields(model, dct, and_reqs): continue container_id = q.all()[0] container_ids.append(container_id) - req = req[1:] # remove "w" main_req = Q(**{req + "__in": container_ids}) and_reqs.append(main_req) @@ -1215,15 +1232,29 @@ def _manage_hierarchic_fields(model, dct, and_reqs): vals = [v.replace('"', "") for v in val.split(";")] main_req = None for val in vals: + suf = suffix + if "*" == val: + req = req.replace("cached_label__", "").replace("pk", "").replace("iexact", "") + req += "isnull" + reqs = Q(**{req: False}) + if not main_req: + main_req = reqs + else: + main_req |= reqs + continue + elif "*" in val and "iexact" in suf: + suf = suffix.replace("iexact", "icontains") + req = req.replace("iexact", "icontains") + val = val.replace("*", "") reqs = Q(**{req: val}) nreq = base_req = req[:] for idx in range(HIERARCHIC_LEVELS): - nreq = nreq[: -(len(suffix))] + "parents__" + suffix + nreq = nreq[: -(len(suf))] + "parents__" + suf q = Q(**{nreq: val}) reqs |= q nreq = base_req[:] for idx in range(HIERARCHIC_LEVELS): - nreq = nreq[: -(len(suffix))] + "children__" + suffix + nreq = nreq[: -(len(suf))] + "children__" + suf q = Q(**{nreq: val}) reqs |= q if not main_req: @@ -1311,21 +1342,24 @@ def _manage_hierarchic_fields(model, dct, and_reqs): break -def _manage_clean_search_field(dct, exclude=None, reverse=False): +def _manage_clean_search_field(dct, exclude=None, reverse=False, related_name_fields=None): + related_names = related_name_fields if related_name_fields else [] for k in list(dct.keys()): # clean quoted search field - if type(dct[k]) != str: + if not isinstance(dct[k], str): continue dct[k] = dct[k].replace('"', "") dct[k] = _clean_type_val(dct[k]) - if "*" not in dct[k] or not k.endswith("__iexact"): + if "*" not in dct[k] or k.endswith("regex"): continue value = dct.pop(k).strip() - base_key = k[:-len("__iexact")] + base_key = k[:] + if k.endswith("__iexact"): + base_key = k[:-len("__iexact")] if value == "*": - if not reverse: + if k in related_names or not reverse: dct[base_key + "__isnull"] = False - if exclude is not None: + if exclude is not None and k.endswith("__iexact"): exclude[base_key + "__exact"] = "" continue if value.startswith("*"): @@ -2218,6 +2252,9 @@ def get_item( if k not in query_parameters: query_parameters[k] = SearchAltName(k, request_keys[k]) + related_name_fields = [query_parameters[k].related_name for k in query_parameters + if query_parameters[k].related_name] + dct, excluded_dct, distinct_queries = _search_manage_search_vector( model, dct, @@ -2273,8 +2310,8 @@ def get_item( exc_and_reqs += dct.pop("exc_and_reqs") updated_excluded = {} - _manage_clean_search_field(dct, updated_excluded) - _manage_clean_search_field(excluded_dct, dct, reverse=True) + _manage_clean_search_field(dct, updated_excluded, related_name_fields=related_name_fields) + _manage_clean_search_field(excluded_dct, dct, reverse=True, related_name_fields=related_name_fields) if updated_excluded: excluded_dct.update(updated_excluded) diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 5b172238e..d204d6e36 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -5992,7 +5992,7 @@ msgstr "index" #: archaeological_finds/models_treatments.py:165 msgctxt "key for text search" msgid "scientific-manager" -msgstr "reponsable-suivi-scientifique" +msgstr "responsable-suivi-scientifique" #: archaeological_finds/models_treatments.py:222 msgid "Treatment have been executed" @@ -7440,7 +7440,7 @@ msgstr "est-ouvert" #: archaeological_operations/models.py:1170 msgctxt "key for text search" msgid "scientific-monitor" -msgstr "reponsable-suivi-scientifique" +msgstr "responsable-suivi-scientifique" #: archaeological_operations/models.py:1188 msgctxt "key for text search" |