From 1fe93ac6b749d3ca69abd615a832eb4c4f63b7ee Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 17 Oct 2019 18:12:06 +0200 Subject: [PATCH] Do not allow to pay gift cards with gift cards --- src/pretix/base/payment.py | 16 +++++++++++++++- src/pretix/base/services/orders.py | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index fbdbdc4d1..f9f0af89d 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -32,7 +32,7 @@ from pretix.base.templatetags.money import money_filter from pretix.base.templatetags.rich_text import rich_text from pretix.helpers.money import DecimalTextInput from pretix.multidomain.urlreverse import eventreverse -from pretix.presale.views import get_cart_total +from pretix.presale.views import get_cart, get_cart_total from pretix.presale.views.cart import cart_session, get_or_create_cart_id logger = logging.getLogger(__name__) @@ -954,6 +954,11 @@ class GiftCardPayment(BasePaymentProvider): return True def checkout_prepare(self, request: HttpRequest, cart: Dict[str, Any]) -> Union[bool, str, None]: + for p in get_cart(request): + if p.item.issue_giftcard: + messages.error(request, _("You cannot pay with gift cards when buying a gift card.")) + return + cs = cart_session(request) try: gc = self.event.organizer.accepted_gift_cards.get( @@ -1000,6 +1005,11 @@ class GiftCardPayment(BasePaymentProvider): messages.error(request, _("This gift card can not be redeemed since its code is not unique. Please contact the organizer of this event.")) def payment_prepare(self, request: HttpRequest, payment: OrderPayment) -> Union[bool, str, None]: + for p in payment.order.positions.all(): + if p.item.issue_giftcard: + messages.error(request, _("You cannot pay with gift cards when buying a gift card.")) + return + try: gc = self.event.organizer.accepted_gift_cards.get( secret=request.POST.get("giftcard") @@ -1034,6 +1044,10 @@ class GiftCardPayment(BasePaymentProvider): messages.error(request, _("This gift card can not be redeemed since its code is not unique. Please contact the organizer of this event.")) def execute_payment(self, request: HttpRequest, payment: OrderPayment) -> str: + for p in payment.order.positions.all(): + if p.item.issue_giftcard: + raise PaymentException(_("You cannot pay with gift cards when buying a gift card.")) + gcpk = payment.info_data.get('gift_card') if not gcpk or not payment.info_data.get('retry'): raise PaymentException("Invalid state, should never occur.") diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index d8e433e9e..06bd5f931 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -607,6 +607,8 @@ def _create_order(event: Event, email: str, positions: List[CartPosition], now_d if not gc.accepted_by(event.organizer): raise OrderError(_("This gift card is not accepted by this event organizer.")) checked_gift_cards.append(gc) + if checked_gift_cards and any(c.item.issue_giftcard for c in positions): + raise OrderError(_("You cannot pay with gift cards when buying a gift card.")) fees, pf, gift_card_values = _get_fees(positions, payment_provider, address, meta_info, event, checked_gift_cards) total = pending_sum = sum([c.price for c in positions]) + sum([c.value for c in fees])