from django.views.generic import DetailView, TemplateView
from shuup.core.catalog import ProductCatalog, ProductCatalogContext
from shuup.core.models import Category, ShopProductVisibility, Supplier
from shuup.front.utils.sorts_and_filters import ProductListForm, get_product_queryset, get_query_filters, sort_products
[docs]
def get_context_data(context, request, category, product_filters):
data = request.GET
context["form"] = form = ProductListForm(request=request, shop=request.shop, category=category, data=data)
form.full_clean()
data = form.cleaned_data
if "sort" in form.fields and not data.get("sort"):
# Use first choice by default
data["sort"] = form.fields["sort"].widget.choices[0][0]
catalog = ProductCatalog(
ProductCatalogContext(
shop=request.shop,
user=getattr(request, "user", None),
contact=getattr(request, "customer", None),
purchasable_only=True,
supplier=data.get("supplier") or None,
visibility=ShopProductVisibility.LISTED,
)
)
products = (
catalog.get_products_queryset()
.filter(**product_filters)
.filter(get_query_filters(request, category, data=data))
.select_related("primary_image", "sales_unit", "tax_class")
.prefetch_related("translations", "sales_unit__translations")
)
products = get_product_queryset(products, request, category, data)
products = sort_products(request, category, products, data).distinct()
context["page_size"] = data.get("limit", 12)
context["products"] = products
if "supplier" in data:
context["supplier"] = data.get("supplier")
return context
[docs]
class CategoryView(DetailView):
template_name = "shuup/front/product/category.jinja"
model = Category
template_object_name = "category"
[docs]
def get_queryset(self):
return self.model.objects.all_visible(
customer=self.request.customer,
shop=self.request.shop,
)
[docs]
def get_product_filters(self):
return {
"shop_products__shop": self.request.shop,
"variation_parent__isnull": True,
"shop_products__categories__in": self.object.get_descendants(include_self=True),
"shop_products__suppliers__in": Supplier.objects.enabled(shop=self.request.shop),
}
[docs]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
return get_context_data(context, self.request, self.object, self.get_product_filters())
[docs]
class AllCategoriesView(TemplateView):
template_name = "shuup/front/product/category.jinja"
[docs]
def get_product_filters(self):
category_ids = Category.objects.all_visible(
customer=self.request.customer,
shop=self.request.shop,
).values_list("id", flat=True)
return {
"shop_products__shop": self.request.shop,
"variation_parent__isnull": True,
"shop_products__categories__id__in": category_ids,
"shop_products__suppliers__in": Supplier.objects.enabled(shop=self.request.shop),
}
[docs]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["category"] = None
return get_context_data(context, self.request, None, self.get_product_filters())