Pass cart positions to fee_calculation_for_cart

This commit is contained in:
Raphael Michel
2019-11-04 11:00:48 +01:00
parent d15e37d93e
commit 8f112f8d9a
5 changed files with 15 additions and 7 deletions

View File

@@ -702,8 +702,9 @@ class FreeOrderProvider(BasePaymentProvider):
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
from .services.cart import get_fees
cart = get_cart(request)
total = get_cart_total(request)
total += sum([f.value for f in get_fees(self.event, request, total, None, None)])
total += sum([f.value for f in get_fees(self.event, request, total, None, None, cart)])
return total == 0
def order_change_allowed(self, order: Order) -> bool:

View File

@@ -958,12 +958,12 @@ def update_tax_rates(event: Event, cart_id: str, invoice_address: InvoiceAddress
return totaldiff
def get_fees(event, request, total, invoice_address, provider):
def get_fees(event, request, total, invoice_address, provider, positions):
from pretix.presale.views.cart import cart_session
fees = []
for recv, resp in fee_calculation_for_cart.send(sender=event, request=request, invoice_address=invoice_address,
total=total):
total=total, positions=positions):
if resp:
fees += resp

View File

@@ -505,8 +505,10 @@ class PaymentStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
@cached_property
def _total_order_value(self):
cart = get_cart(self.request)
total = get_cart_total(self.request)
total += sum([f.value for f in get_fees(self.request.event, self.request, total, self.invoice_address, None)])
total += sum([f.value for f in get_fees(self.request.event, self.request, total, self.invoice_address, None,
cart)])
return Decimal(total)
@cached_property

View File

@@ -119,7 +119,7 @@ argument will contain the request object.
"""
fee_calculation_for_cart = EventPluginSignal(
providing_args=['request', 'invoice_address', 'total']
providing_args=['request', 'invoice_address', 'total', 'positions']
)
"""
This signals allows you to add fees to a cart. You are expected to return a list of ``OrderFee``
@@ -129,6 +129,7 @@ As with all plugin signals, the ``sender`` keyword argument will contain the eve
argument will contain the request object and ``invoice_address`` the invoice address (useful for
tax calculation). The ``total`` keyword argument will contain the total cart sum without any fees.
You should not rely on this ``total`` value for fee calculations as other fees might interfere.
The ``positions`` argument will contain a list or queryset of ``CartPosition`` objects.
"""
contact_form_fields = EventPluginSignal(

View File

@@ -133,7 +133,10 @@ class CartMixin:
if order:
fees = order.fees.all()
elif positions:
fees = get_fees(self.request.event, self.request, total, self.invoice_address, self.cart_session.get('payment'))
fees = get_fees(
self.request.event, self.request, total, self.invoice_address, self.cart_session.get('payment'),
cartpos
)
else:
fees = []
@@ -231,9 +234,10 @@ def get_cart_is_free(request):
if not hasattr(request, '_cart_free_cache'):
cs = cart_session(request)
pos = get_cart(request)
ia = get_cart_invoice_address(request)
total = get_cart_total(request)
fees = get_fees(request.event, request, total, ia, cs.get('payment'))
fees = get_fees(request.event, request, total, ia, cs.get('payment'), pos)
request._cart_free_cache = total + sum(f.value for f in fees) == Decimal('0.00')
return request._cart_free_cache