From 40387428e7475cb0d14e9afac771498d656d9c96 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Sun, 21 Feb 2021 16:49:34 +0100 Subject: [PATCH] recipe filter --- cookbook/filters.py | 25 +++++++++++++------------ cookbook/views/lists.py | 4 ++-- cookbook/views/views.py | 2 +- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/cookbook/filters.py b/cookbook/filters.py index 2d75bde3..b35cd36f 100644 --- a/cookbook/filters.py +++ b/cookbook/filters.py @@ -12,17 +12,23 @@ with scopes_disabled(): class RecipeFilter(django_filters.FilterSet): name = django_filters.CharFilter(method='filter_name') keywords = django_filters.ModelMultipleChoiceFilter( - queryset=Keyword.objects.all(), + queryset=Keyword.objects.none(), widget=MultiSelectWidget, method='filter_keywords' ) foods = django_filters.ModelMultipleChoiceFilter( - queryset=Food.objects.all(), + queryset=Food.objects.none(), widget=MultiSelectWidget, method='filter_foods', label=_('Ingredients') ) + def __init__(self, data=None, *args, **kwargs): + space = kwargs.pop('space') + super().__init__(data, *args, **kwargs) + self.filters['foods'].queryset = Food.objects.filter(space=space).all() + self.filters['keywords'].queryset = Keyword.objects.filter(space=space).all() + @staticmethod def filter_keywords(queryset, name, value): if not name == 'keywords': @@ -36,20 +42,15 @@ with scopes_disabled(): if not name == 'foods': return queryset for x in value: - queryset = queryset.filter( - steps__ingredients__food__name=x - ).distinct() + queryset = queryset.filter(steps__ingredients__food__name=x).distinct() return queryset @staticmethod def filter_name(queryset, name, value): if not name == 'name': return queryset - if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2': # noqa: E501 - queryset = queryset \ - .annotate(similarity=TrigramSimilarity('name', value), ) \ - .filter(Q(similarity__gt=0.1) | Q(name__unaccent__icontains=value)) \ - .order_by('-similarity') + if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2': + queryset = queryset.annotate(similarity=TrigramSimilarity('name', value), ).filter(Q(similarity__gt=0.1) | Q(name__unaccent__icontains=value)).order_by('-similarity') else: queryset = queryset.filter(name__icontains=value) return queryset @@ -59,7 +60,7 @@ with scopes_disabled(): fields = ['name', 'keywords', 'foods', 'internal'] - class IngredientFilter(django_filters.FilterSet): + class FoodFilter(django_filters.FilterSet): name = django_filters.CharFilter(lookup_expr='icontains') class Meta: @@ -73,7 +74,7 @@ with scopes_disabled(): if data is not None: data = data.copy() data.setdefault("finished", False) - super(ShoppingListFilter, self).__init__(data, *args, **kwargs) + super().__init__(data, *args, **kwargs) class Meta: model = ShoppingList diff --git a/cookbook/views/lists.py b/cookbook/views/lists.py index 7cfcb229..433aa980 100644 --- a/cookbook/views/lists.py +++ b/cookbook/views/lists.py @@ -6,7 +6,7 @@ from django.shortcuts import render from django.utils.translation import gettext as _ from django_tables2 import RequestConfig -from cookbook.filters import IngredientFilter, ShoppingListFilter +from cookbook.filters import FoodFilter, ShoppingListFilter from cookbook.helper.permission_helper import group_required from cookbook.models import (Food, InviteLink, Keyword, RecipeImport, ShoppingList, Storage, SyncLog) @@ -56,7 +56,7 @@ def recipe_import(request): @group_required('user') def food(request): - f = IngredientFilter(request.GET, queryset=Food.objects.filter(space=request.space).all().order_by('pk')) + f = FoodFilter(request.GET, queryset=Food.objects.filter(space=request.space).all().order_by('pk')) table = IngredientTable(f.qs) RequestConfig(request, paginate={'per_page': 25}).configure(table) diff --git a/cookbook/views/views.py b/cookbook/views/views.py index d2f2faef..0cb152dd 100644 --- a/cookbook/views/views.py +++ b/cookbook/views/views.py @@ -55,7 +55,7 @@ def index(request): def search(request): if has_group_permission(request.user, ('guest',)): - f = RecipeFilter(request.GET, queryset=Recipe.objects.filter(space=request.user.userpreference.space).all().order_by('name')) + f = RecipeFilter(request.GET, queryset=Recipe.objects.filter(space=request.user.userpreference.space).all().order_by('name'), space=request.space) if request.user.userpreference.search_style == UserPreference.LARGE: table = RecipeTable(f.qs)