Coverage for cookbook/managers.py: 62%

13 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2023-12-29 00:47 +0100

1from django.contrib.postgres.aggregates import StringAgg 

2from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector 

3from django.db import models 

4from django.db.models import Q 

5from django.utils import translation 

6 

7DICTIONARY = { 

8 # TODO find custom dictionaries - maybe from here https://www.postgresql.org/message-id/CAF4Au4x6X_wSXFwsQYE8q5o0aQZANrvYjZJ8uOnsiHDnOVPPEg%40mail.gmail.com 

9 # 'hy': 'Armenian', 

10 # 'ca': 'Catalan', 

11 # 'cs': 'Czech', 

12 'nl': 'dutch', 

13 'en': 'english', 

14 'fr': 'french', 

15 'de': 'german', 

16 'it': 'italian', 

17 # 'lv': 'Latvian', 

18 'es': 'spanish', 

19 'sv': 'swedish', 

20} 

21 

22 

23# TODO add schedule index rebuild 

24class RecipeSearchManager(models.Manager): 

25 def search(self, search_text, space): 

26 language = DICTIONARY.get(translation.get_language(), 'simple') 

27 search_query = SearchQuery( 

28 search_text, 

29 config=language, 

30 search_type="websearch" 

31 ) 

32 search_vectors = ( 

33 SearchVector('search_vector') 

34 + SearchVector(StringAgg('steps__ingredients__food__name__unaccent', delimiter=' '), weight='B', config=language) 

35 + SearchVector(StringAgg('keywords__name__unaccent', delimiter=' '), weight='B', config=language)) 

36 search_rank = SearchRank(search_vectors, search_query) 

37 

38 return ( 

39 self.get_queryset() 

40 .annotate( 

41 search=search_vectors, 

42 rank=search_rank, 

43 ) 

44 .filter( 

45 Q(search=search_query) 

46 ) 

47 .order_by('-rank'))