This commit is contained in:
Tobias Lindenberg 2021-01-10 12:46:02 +01:00
parent c7da37e7e7
commit 7ab6276397

View File

@ -1,18 +1,26 @@
import django_filters import django_filters
from django.conf import settings
from django.contrib.postgres.search import TrigramSimilarity from django.contrib.postgres.search import TrigramSimilarity
from django.db.models import Q from django.db.models import Q
from cookbook.forms import MultiSelectWidget
from cookbook.models import Recipe, Keyword, Food, ShoppingList
from django.conf import settings
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from cookbook.forms import MultiSelectWidget
from cookbook.models import Food, Keyword, Recipe, ShoppingList
class RecipeFilter(django_filters.FilterSet): class RecipeFilter(django_filters.FilterSet):
name = django_filters.CharFilter(method='filter_name') name = django_filters.CharFilter(method='filter_name')
keywords = django_filters.ModelMultipleChoiceFilter(queryset=Keyword.objects.all(), widget=MultiSelectWidget, keywords = django_filters.ModelMultipleChoiceFilter(
method='filter_keywords') queryset=Keyword.objects.all(),
foods = django_filters.ModelMultipleChoiceFilter(queryset=Food.objects.all(), widget=MultiSelectWidget, widget=MultiSelectWidget,
method='filter_foods', label=_('Ingredients')) method='filter_keywords'
)
foods = django_filters.ModelMultipleChoiceFilter(
queryset=Food.objects.all(),
widget=MultiSelectWidget,
method='filter_foods',
label=_('Ingredients')
)
@staticmethod @staticmethod
def filter_keywords(queryset, name, value): def filter_keywords(queryset, name, value):
@ -27,16 +35,20 @@ class RecipeFilter(django_filters.FilterSet):
if not name == 'foods': if not name == 'foods':
return queryset return queryset
for x in value: for x in value:
queryset = queryset.filter(steps__ingredients__food__name=x).distinct() queryset = queryset.filter(
steps__ingredients__food__name=x
).distinct()
return queryset return queryset
@staticmethod @staticmethod
def filter_name(queryset, name, value): def filter_name(queryset, name, value):
if not name == 'name': if not name == 'name':
return queryset return queryset
if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2': if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2': # noqa: E501
queryset = queryset.annotate(similarity=TrigramSimilarity('name', value), ).filter( queryset = queryset \
Q(similarity__gt=0.1) | Q(name__icontains=value)).order_by('-similarity') .annotate(similarity=TrigramSimilarity('name', value), ) \
.filter(Q(similarity__gt=0.1) | Q(name__icontains=value)) \
.order_by('-similarity')
else: else:
queryset = queryset.filter(name__icontains=value) queryset = queryset.filter(name__icontains=value)
return queryset return queryset