def get_context_data(self, **kwargs): context = super(ProductDetailView, self).get_context_data(**kwargs) language = self.language = get_language() product = self.object context["category"] = self.shop_product.primary_category context["orderability_errors"] = list(self.shop_product.get_orderability_errors( supplier=None, quantity=1, customer=self.request.customer, ignore_minimum=True )) context["variation_children"] = [] if product.mode == ProductMode.SIMPLE_VARIATION_PARENT: context["variation_children"] = cache_product_things( self.request, sorted( product.variation_children.language(language).all(), key=lambda p: get_string_sort_order(p.variation_name or p.name) ) ) context["orderable_variation_children"] = [ p for p in context["variation_children"] if p.get_shop_instance(self.request.shop).is_orderable( supplier=None, customer=self.request.customer, quantity=1 ) ] elif product.mode == ProductMode.VARIABLE_VARIATION_PARENT: context["variation_variables"] = product.variation_variables.all().prefetch_related("values") elif product.mode == ProductMode.PACKAGE_PARENT: children = ( product.get_all_package_children() .translated() .order_by("translations__name") ) context["package_children"] = cache_product_things(self.request, children) context["shop_product"] = self.shop_product primary_image = None if self.shop_product.shop_primary_image_id: primary_image = self.shop_product.shop_primary_image elif product.primary_image_id: primary_image = self.shop_product.primary_image context["primary_image"] = primary_image context["images"] = self.shop_product.images.all() # TODO: Maybe add hook for ProductDetailView get_context_data? # dispatch_hook("get_context_data", view=self, context=context) return context
def get_best_selling_products(context, n_products=12, cutoff_days=30, orderable_only=True): request = context["request"] data = get_best_selling_product_info(shop_ids=[request.shop.pk], cutoff_days=cutoff_days) product_ids = [d[0] for d in data][:n_products] products = [] for product in Product.objects.filter(id__in=product_ids): shop_product = product.get_shop_instance(request.shop) if orderable_only: for supplier in Supplier.objects.all(): if shop_product.is_orderable( supplier, request.customer, shop_product.minimum_purchase_quantity): products.append(product) break elif shop_product.is_visible(request.customer): products.append(product) products = cache_product_things(request, products) products = sorted( products, key=lambda p: product_ids.index(p.id)) # pragma: no branch return products
def get_context_data(self, **kwargs): context = super(ProductDetailView, self).get_context_data(**kwargs) language = self.language = get_language() product = self.object context["category"] = self.shop_product.primary_category context["orderability_errors"] = list( self.shop_product.get_orderability_errors( supplier=None, quantity=1, customer=self.request.customer, ignore_minimum=True)) context["variation_children"] = [] if product.mode == ProductMode.SIMPLE_VARIATION_PARENT: context["variation_children"] = cache_product_things( self.request, sorted(product.variation_children.language(language).all(), key=lambda p: get_string_sort_order(p.variation_name or p.name))) context["orderable_variation_children"] = [ p for p in context["variation_children"] if p.get_shop_instance(self.request.shop).is_orderable( supplier=None, customer=self.request.customer, quantity=1) ] elif product.mode == ProductMode.VARIABLE_VARIATION_PARENT: context["variation_variables"] = product.variation_variables.all( ).prefetch_related("values") elif product.mode == ProductMode.PACKAGE_PARENT: children = (product.package_children.language(language).order_by( "translations__name").all()) context["package_children"] = cache_product_things( self.request, children) context["shop_product"] = self.shop_product primary_image = None if self.shop_product.shop_primary_image_id: primary_image = self.shop_product.shop_primary_image elif product.primary_image_id: primary_image = self.shop_product.primary_image context["primary_image"] = primary_image context["images"] = self.shop_product.images.all() # TODO: Maybe add hook for ProductDetailView get_context_data? # dispatch_hook("get_context_data", view=self, context=context) return context
def get_context_data(self, **kwargs): context = super(SearchView, self).get_context_data(**kwargs) context["form"] = self.form products = context["products"] if products: products = cache_product_things(self.request, products) products = sort_products(self.request, products, self.form.cleaned_data.get("sort")) context["products"] = products context["no_results"] = (self.form.is_valid() and not products) return context
def get_random_products(context, n_products=6, orderable_only=True): request = context["request"] products = get_visible_products( context, n_products, ordering="?", orderable_only=orderable_only, ) products = cache_product_things(request, products) return products
def get_best_selling_products(context, n_products=12, cutoff_days=30, orderable_only=True): request = context["request"] data = get_best_selling_product_info(shop_ids=[request.shop.pk], cutoff_days=cutoff_days) product_ids = [d[0] for d in data][:n_products] products = get_visible_products( context, n_products, filter_dict={"id__in": product_ids}, orderable_only=orderable_only ) products = cache_product_things(request, products) products = sorted(products, key=lambda p: product_ids.index(p.id)) # pragma: no branch products = products[:n_products] return products
def get_best_selling_products(context, n_products=12, cutoff_days=30, no_variation_children=False): request = context["request"] data = get_best_selling_product_info( shop_ids=[request.shop.pk], cutoff_days=cutoff_days ) product_ids = [d[0] for d in data][:n_products * 2] products = _get_list_products(request).filter(id__in=product_ids) if no_variation_children: # pragma: no branch products = products.filter(variation_parent=None) products = cache_product_things(request, products) products = sorted(products, key=lambda p: product_ids.index(p.id)) # pragma: no branch products = products[:n_products] return products
def get_best_selling_products(context, n_products=12, cutoff_days=30, orderable_only=True): request = context["request"] data = get_best_selling_product_info(shop_ids=[request.shop.pk], cutoff_days=cutoff_days) product_ids = [d[0] for d in data][:n_products] products = get_visible_products( context, n_products, filter_dict={"id__in": product_ids}, orderable_only=orderable_only, ) products = cache_product_things(request, products) products = sorted( products, key=lambda p: product_ids.index(p.id)) # pragma: no branch products = products[:n_products] return products
def get_best_selling_products(context, n_products=12, cutoff_days=30, orderable_only=True): request = context["request"] data = get_best_selling_product_info( shop_ids=[request.shop.pk], cutoff_days=cutoff_days ) product_ids = [d[0] for d in data][:n_products] products = [] for product in Product.objects.filter(id__in=product_ids): shop_product = product.get_shop_instance(request.shop) if orderable_only: for supplier in Supplier.objects.all(): if shop_product.is_orderable(supplier, request.customer, shop_product.minimum_purchase_quantity): products.append(product) break elif shop_product.is_visible(request.customer): products.append(product) products = cache_product_things(request, products) products = sorted(products, key=lambda p: product_ids.index(p.id)) # pragma: no branch return products
def get_context_data(self, **kwargs): context = super(CategoryView, self).get_context_data(**kwargs) category = self.object context["form"] = form = ProductListForm(data=self.request.GET) form.full_clean() filters = { "shop_products__shop": self.request.shop, "shop_products__categories": category, "variation_parent": None } manufacturers = form.cleaned_data.get("manufacturers") if manufacturers: filters["manufacturer__in"] = manufacturers products = Product.objects.list_visible( customer=self.request.customer, shop=self.request.shop ).filter(**filters).distinct() products = cache_product_things(self.request, products) products = sort_products(self.request, products, self.request.GET.get("sort")) context["products"] = products return context
def get_random_products(context, n_products=6): request = context["request"] products = _get_list_products(request).order_by("?")[:n_products] products = cache_product_things(request, products) return products