Source code for shoop.front.template_helpers.general
# -*- coding: utf-8 -*-
# This file is part of Shoop.
#
# Copyright (c) 2012-2016, Shoop Ltd. All rights reserved.
#
# This source code is licensed under the AGPLv3 license found in the
# LICENSE file in the root directory of this source tree.
from django.core.paginator import Paginator
from django.utils.translation import get_language
from jinja2.utils import contextfunction
from mptt.templatetags.mptt_tags import cache_tree_children
from shoop.core.models import Category, Manufacturer, Product, Supplier
from shoop.front.utils.product_statistics import get_best_selling_product_info
from shoop.front.utils.views import cache_product_things
from shoop.utils.translation import cache_translations_for_tree
@contextfunction
[docs]def get_visible_products(context, n_products, ordering=None, filter_dict=None, orderable_only=True):
"""
:param context: Rendering context
:type context: jinja2.runtime.Context
:param n_products: Number of products to return
:type n_products: int
:param ordering: String specifying ordering
:type ordering: str
:param filter_dict: Dictionary of filter parameters
:type filter_dict: dict[str, object]
:param orderable_only: Boolean limiting results to orderable products
:type orderable_only: bool
:rtype: list[shoop.core.models.Product]
"""
request = context["request"]
customer = request.customer
shop = request.shop
if not filter_dict:
filter_dict = {}
products_qs = Product.objects.list_visible(
shop=shop,
customer=customer,
language=get_language(),
).filter(**filter_dict)
if ordering:
products_qs = products_qs.order_by(ordering)
if orderable_only:
products = []
for product in products_qs[:(n_products * 4)]:
if len(products) == n_products:
break
shop_product = product.get_shop_instance(shop)
for supplier in Supplier.objects.all():
if shop_product.is_orderable(supplier, customer, shop_product.minimum_purchase_quantity):
products.append(product)
break
return products
return products_qs[:n_products]
@contextfunction
[docs]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
@contextfunction
[docs]def get_newest_products(context, n_products=6, orderable_only=True):
request = context["request"]
products = get_visible_products(
context,
n_products,
ordering="-pk",
orderable_only=orderable_only,
)
products = cache_product_things(request, products)
return products
@contextfunction
[docs]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
@contextfunction
[docs]def get_all_manufacturers(context):
request = context["request"]
products = Product.objects.list_visible(shop=request.shop, customer=request.customer)
manufacturers_ids = products.values_list("manufacturer__id").distinct()
manufacturers = Manufacturer.objects.filter(pk__in=manufacturers_ids)
return manufacturers
@contextfunction
[docs]def get_root_categories(context):
request = context["request"]
language = get_language()
roots = cache_tree_children(
Category.objects.all_visible(
customer=request.customer, shop=request.shop, language=language))
cache_translations_for_tree(roots, languages=[language])
return roots
@contextfunction