Source code for shuup.front.apps.simple_search.views

from django.db.models import Q
from django.views.generic import ListView

from shuup.core.catalog import ProductCatalog, ProductCatalogContext
from shuup.core.models import Product, ProductMode, ShopProductVisibility
from shuup.front.utils.sorts_and_filters import ProductListForm, get_product_queryset, get_query_filters, sort_products


[docs] class SearchView(ListView): form_class = ProductListForm template_name = "shuup/simple_search/search.jinja" model = Product context_object_name = "products"
[docs] def dispatch(self, request, *args, **kwargs): self.form = ProductListForm( request=self.request, shop=self.request.shop, category=None, data=self.request.GET, ) return super().dispatch(request, *args, **kwargs)
[docs] def get_queryset(self): if not self.form.is_valid(): return Product.objects.none() data = self.form.cleaned_data if not (data and data.get("q")): # pragma: no cover return Product.objects.none() catalog = ProductCatalog( ProductCatalogContext( shop=self.request.shop, user=self.request.user, contact=getattr(self.request, "customer", None), purchasable_only=True, visibility=ShopProductVisibility.SEARCHABLE, ) ) products = catalog.get_products_queryset().filter( Q(mode__in=ProductMode.get_parent_modes()), Q(get_query_filters(self.request, None, data=data)), ) products = get_product_queryset(products, self.request, None, data) products = sort_products(self.request, None, products, data) return products.distinct()
[docs] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["form"] = self.form products = context["products"] context["no_results"] = self.form.is_valid() and not products.exists() return context