def _get_best_selling_products(cutoff_days, n_products, orderable_only, request): # noqa (C901) data = get_best_selling_product_info( shop_ids=[request.shop.pk], cutoff_days=cutoff_days ) combined_variation_products = defaultdict(int) for product_id, parent_id, qty in data: if parent_id: combined_variation_products[parent_id] += qty else: combined_variation_products[product_id] += qty product_ids = [ d[0] for d in sorted(six.iteritems(combined_variation_products), key=lambda i: i[1], reverse=True) ][:n_products] products = [] if orderable_only: # get suppliers for later use suppliers = Supplier.objects.filter(shops__in=[request.shop]) for product in Product.objects.filter(id__in=product_ids): try: shop_product = product.get_shop_instance(request.shop, allow_cache=True) except ShopProduct.DoesNotExist: continue if orderable_only: for supplier in suppliers: 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 data = self.request.GET context["form"] = form = ProductListForm(request=self.request, shop=self.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] # TODO: Check if context cache can be utilized here products = Product.objects.listed( customer=self.request.customer, shop=self.request.shop).filter( **self.get_product_filters()).filter( get_query_filters(self.request, category, data=data)) products = get_product_queryset(products, self.request, category, data).distinct() products = post_filter_products(self.request, category, products, data) products = cache_product_things(self.request, products) products = sort_products(self.request, category, products, data) context["page_size"] = data.get("limit", 12) context["products"] = products 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: data = self.form.cleaned_data products = post_filter_products(self.request, None, products, data) products = cache_product_things(self.request, products) products = sort_products(self.request, None, products, data) products = [ p for p in products if is_visible({"request": self.request}, p) ] 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"] key, products = context_cache.get_cached_value( identifier="random_products", item=None, context=request, n_products=n_products, orderable_only=orderable_only) if products is not None and _can_use_cache(products, request.shop, request.customer): return products products = get_listed_products( context, n_products, ordering="?", filter_dict={ "variation_parent": None }, orderable_only=orderable_only, ) products = cache_product_things(request, products) context_cache.set_cached_value(key, products, settings.WSHOP_TEMPLATE_HELPERS_CACHE_DURATION) return products
def get_product_context(request, product, language=None): # noqa (C901) """ Get product context Used in `wshop.front.views.product:ProductDetailView` :return: A context dict containing everything needed to render product view :rtype: dict """ if not language: language = get_language() shop_product = product.get_shop_instance(request.shop) context = {} context["product"] = product context["category"] = shop_product.primary_category context["orderability_errors"] = list( shop_product.get_orderability_errors(supplier=None, quantity=1, customer=request.customer, ignore_minimum=True)) context["variation_children"] = [] if product.mode == ProductMode.SIMPLE_VARIATION_PARENT: context["variation_children"] = cache_product_things( 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"] = [] for p in context["variation_children"]: try: if p.get_shop_instance(request.shop).is_orderable( supplier=None, customer=request.customer, quantity=1): context["orderable_variation_children"].append(p) except ShopProduct.DoesNotExist: pass elif product.mode == ProductMode.VARIABLE_VARIATION_PARENT: variation_variables = product.variation_variables.all( ).prefetch_related("values") orderable_children, is_orderable = get_orderable_variation_children( product, request, variation_variables) context["orderable_variation_children"] = orderable_children context["variation_orderable"] = is_orderable context["variation_variables"] = variation_variables elif product.is_container(): children = product.get_all_package_children().translated().order_by( "translations__name") context["package_children"] = cache_product_things(request, children) context["shop_product"] = shop_product context["attributes"] = product.attributes.filter( attribute__visibility_mode=AttributeVisibility.SHOW_ON_PRODUCT_PAGE) context["primary_image"] = shop_product.public_primary_image context["images"] = shop_product.public_images context["order_form"] = _get_order_form(request, context, product, language) for provide_object in get_provide_objects("product_context_extra"): provider = provide_object(request, product, language) if provider.provides_extra_context(): context.update(provider.extra_context) return context