Coverage for cookbook/managers.py: 62%
13 statements
« prev ^ index » next coverage.py v7.4.0, created at 2023-12-29 00:47 +0100
« 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
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}
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)
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'))