def _calculate( price, product=None, shipping_method=None, cart=None, order=None, bare=False, **kwargs ): if bare or price is None or DISCOUNT in price: return discounts = Discount.objects.none() if product: discounts = Discount.objects.filter( applies_to=APPLIES_TO_PRODUCT_PRICE ).for_product(product) elif shipping_method: discounts = Discount.objects.filter( applies_to=APPLIES_TO_SHIPPING_COSTS ) elif cart or order: discounts = Discount.objects.filter(applies_to=APPLIES_TO_TOTAL) if 'customer_group' in kwargs: customer_group = kwargs['customer_group'] else: CustomerGroup.current_customer_group() now = timezone.now() discounts = discounts.filter(active=True) discounts = discounts.filter( Q(valid_from__isnull=True) | Q( valid_from__lte=now ) ) discounts = discounts.filter( Q(valid_to__isnull=True) | Q( valid_to__gte=now ) ) discounts = discounts.filter( Q(customer_groups=customer_group) | Q( customer_groups=None ) ) discounts = discounts.polymorphic() for discount in discounts: price = discount.apply(price) yield chaining.update(price=price) yield price
def from_request(cls, products, request, query=None, **kwargs): if query is None: query = QueryString(request) yield chaining.update(query=query) if products is None: products = indexer.get_index('product') products = products.search(get_product_queryset()) # Retrieve price from index if products.can_use_price_field('price'): products = products.with_price_field('price') # Handle price sorting if query and products.can_use_price_field('price'): if ('sort', 'price') in query: products = products.order_by_price('price') elif ('sort', '-price') in query: products = products.order_by_price('-price') # Filter on customer group if products.can_use_field('customer_group'): customer_group = CustomerGroup.get_current() products = products.filter(customer_group=customer_group) yield products products = (yield chaining.forward).result if not products.bare_is_set(): # Ideally we want to fetch final prices products = products.set_bare(False) yield products
def _calculate( price, product=None, shipping_method=None, payment_method=None, bare=False, **kwargs ): if bare or price is None or TAX in price: return tax_policy = settings_manager['tax_policy'] if tax_policy: address_type = POLICY_CUSTOMER_ADDRESS_TYPES.get(tax_policy, None) zone = AddressZone.get_current(address_type) taxes = Tax.objects.spans(zone) tax_rules = TaxRule.objects.none() if product: product_classes = ProductTaxClass.objects.for_product(product) tax_rules = TaxRule.objects.filter(product_classes__in=product_classes) elif shipping_method: tax_rules = TaxRule.objects.filter(applies_to_shipping_costs=True) elif payment_method: tax_rules = TaxRule.objects.filter(applies_to_payment_costs=True) if 'customer_group' in kwargs: customer_group = kwargs['customer_group'] else: CustomerGroup.current_customer_group() tax_rules = tax_rules.filter( Q(customer_groups=customer_group) | Q( customer_groups=None ) ) taxes = taxes.polymorphic().filter(tax_rules__in=tax_rules).distinct() for tax in taxes: price = tax.apply(price) yield chaining.update(price=price) yield price
def _calculate(price, product=None, shipping_method=None, payment_method=None, bare=False, **kwargs): if bare or price is None or TAX in price: return tax_policy = settings_manager['tax_policy'] if tax_policy: address_type = POLICY_CUSTOMER_ADDRESS_TYPES.get(tax_policy, None) zone = AddressZone.get_current(address_type) taxes = Tax.objects.spans(zone) tax_rules = TaxRule.objects.none() if product: product_classes = ProductTaxClass.objects.for_product(product) tax_rules = TaxRule.objects.filter(product_classes__in=product_classes) elif shipping_method: tax_rules = TaxRule.objects.filter(applies_to_shipping_costs=True) elif payment_method: tax_rules = TaxRule.objects.filter(applies_to_payment_costs=True) if 'customer_group' in kwargs: customer_group = kwargs['customer_group'] else: CustomerGroup.current_customer_group() tax_rules = tax_rules.filter( Q(customer_groups=customer_group) | Q(customer_groups=None)) taxes = taxes.polymorphic().filter(tax_rules__in=tax_rules).distinct() for tax in taxes: price = tax.apply(price) yield chaining.update(price=price) yield price