Coverage for apis_core/search/utils.py: 38%
26 statements
« prev ^ index » next coverage.py v7.16.1, created at 2026-10-28 13:07 +0000
« prev ^ index » next coverage.py v7.16.1, created at 2026-10-28 13:07 +0000
1import json
2import unicodedata
4from django.apps import apps
5from django.core.serializers.json import DjangoJSONEncoder
6from django.db import models
8from apis_core.search.serializers import SearchSerializer
11def is_model_registered_for_search(model: models.Model) -> bool:
12 config = getattr(model, "Config", {})
13 return getattr(config, "index_for_search", False)
16def get_models_registered_for_search() -> list[models.Model]:
17 return list(filter(lambda x: is_model_registered_for_search(x), apps.get_models()))
20def get_search_serialization_from_instance(instance) -> dict:
21 if hasattr(instance, "search_serialization"):
22 return instance.search_serialization()
24 serializer = SearchSerializer()
25 fields = getattr(instance.__class__.Config, "search_fields", None)
26 serialization = serializer.serialize(
27 [instance], fields=fields, cls=DjangoJSONEncoder
28 )
29 serialization = unicodedata.normalize("NFKD", serialization)
30 return json.loads(serialization)[0]["fields"]
33def split_query_string_for_search(query_str: str) -> list:
34 query_str = unicodedata.normalize("NFKD", query_str)
35 words = query_str.split()
36 if len(words) > 1:
37 words.insert(0, query_str)
38 parts = list(dict.fromkeys(words))
39 return parts