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

1import json 

2import unicodedata 

3 

4from django.apps import apps 

5from django.core.serializers.json import DjangoJSONEncoder 

6from django.db import models 

7 

8from apis_core.search.serializers import SearchSerializer 

9 

10 

11def is_model_registered_for_search(model: models.Model) -> bool: 

12 config = getattr(model, "Config", {}) 

13 return getattr(config, "index_for_search", False) 

14 

15 

16def get_models_registered_for_search() -> list[models.Model]: 

17 return list(filter(lambda x: is_model_registered_for_search(x), apps.get_models())) 

18 

19 

20def get_search_serialization_from_instance(instance) -> dict: 

21 if hasattr(instance, "search_serialization"): 

22 return instance.search_serialization() 

23 

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"] 

31 

32 

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