Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
    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
Ejemplo n.º 14
0
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