Beispiel #1
0
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
Beispiel #2
0
    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
Beispiel #3
0
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
Beispiel #4
0
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