recipe filter
This commit is contained in:
parent
46fb02376e
commit
40387428e7
@ -12,17 +12,23 @@ with scopes_disabled():
|
|||||||
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(
|
keywords = django_filters.ModelMultipleChoiceFilter(
|
||||||
queryset=Keyword.objects.all(),
|
queryset=Keyword.objects.none(),
|
||||||
widget=MultiSelectWidget,
|
widget=MultiSelectWidget,
|
||||||
method='filter_keywords'
|
method='filter_keywords'
|
||||||
)
|
)
|
||||||
foods = django_filters.ModelMultipleChoiceFilter(
|
foods = django_filters.ModelMultipleChoiceFilter(
|
||||||
queryset=Food.objects.all(),
|
queryset=Food.objects.none(),
|
||||||
widget=MultiSelectWidget,
|
widget=MultiSelectWidget,
|
||||||
method='filter_foods',
|
method='filter_foods',
|
||||||
label=_('Ingredients')
|
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
|
@staticmethod
|
||||||
def filter_keywords(queryset, name, value):
|
def filter_keywords(queryset, name, value):
|
||||||
if not name == 'keywords':
|
if not name == 'keywords':
|
||||||
@ -36,20 +42,15 @@ with scopes_disabled():
|
|||||||
if not name == 'foods':
|
if not name == 'foods':
|
||||||
return queryset
|
return queryset
|
||||||
for x in value:
|
for x in value:
|
||||||
queryset = queryset.filter(
|
queryset = queryset.filter(steps__ingredients__food__name=x).distinct()
|
||||||
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': # noqa: E501
|
if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2':
|
||||||
queryset = queryset \
|
queryset = queryset.annotate(similarity=TrigramSimilarity('name', value), ).filter(Q(similarity__gt=0.1) | Q(name__unaccent__icontains=value)).order_by('-similarity')
|
||||||
.annotate(similarity=TrigramSimilarity('name', value), ) \
|
|
||||||
.filter(Q(similarity__gt=0.1) | Q(name__unaccent__icontains=value)) \
|
|
||||||
.order_by('-similarity')
|
|
||||||
else:
|
else:
|
||||||
queryset = queryset.filter(name__icontains=value)
|
queryset = queryset.filter(name__icontains=value)
|
||||||
return queryset
|
return queryset
|
||||||
@ -59,7 +60,7 @@ with scopes_disabled():
|
|||||||
fields = ['name', 'keywords', 'foods', 'internal']
|
fields = ['name', 'keywords', 'foods', 'internal']
|
||||||
|
|
||||||
|
|
||||||
class IngredientFilter(django_filters.FilterSet):
|
class FoodFilter(django_filters.FilterSet):
|
||||||
name = django_filters.CharFilter(lookup_expr='icontains')
|
name = django_filters.CharFilter(lookup_expr='icontains')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@ -73,7 +74,7 @@ with scopes_disabled():
|
|||||||
if data is not None:
|
if data is not None:
|
||||||
data = data.copy()
|
data = data.copy()
|
||||||
data.setdefault("finished", False)
|
data.setdefault("finished", False)
|
||||||
super(ShoppingListFilter, self).__init__(data, *args, **kwargs)
|
super().__init__(data, *args, **kwargs)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ShoppingList
|
model = ShoppingList
|
||||||
|
@ -6,7 +6,7 @@ from django.shortcuts import render
|
|||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
from django_tables2 import RequestConfig
|
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.helper.permission_helper import group_required
|
||||||
from cookbook.models import (Food, InviteLink, Keyword, RecipeImport,
|
from cookbook.models import (Food, InviteLink, Keyword, RecipeImport,
|
||||||
ShoppingList, Storage, SyncLog)
|
ShoppingList, Storage, SyncLog)
|
||||||
@ -56,7 +56,7 @@ def recipe_import(request):
|
|||||||
|
|
||||||
@group_required('user')
|
@group_required('user')
|
||||||
def food(request):
|
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)
|
table = IngredientTable(f.qs)
|
||||||
RequestConfig(request, paginate={'per_page': 25}).configure(table)
|
RequestConfig(request, paginate={'per_page': 25}).configure(table)
|
||||||
|
@ -55,7 +55,7 @@ def index(request):
|
|||||||
|
|
||||||
def search(request):
|
def search(request):
|
||||||
if has_group_permission(request.user, ('guest',)):
|
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:
|
if request.user.userpreference.search_style == UserPreference.LARGE:
|
||||||
table = RecipeTable(f.qs)
|
table = RecipeTable(f.qs)
|
||||||
|
Loading…
Reference in New Issue
Block a user