forked from CGM_Public/pretix_original
Payment step
This commit is contained in:
@@ -82,6 +82,14 @@ class Organizer(LoggedModel):
|
|||||||
|
|
||||||
return ObjectRelatedCache(self)
|
return ObjectRelatedCache(self)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def has_gift_cards(self):
|
||||||
|
return self.cache.get_or_set(
|
||||||
|
key='has_gift_cards',
|
||||||
|
timeout=15,
|
||||||
|
default=lambda: self.issued_gift_cards.exists() or self.gift_card_issuer_acceptance.exists()
|
||||||
|
)
|
||||||
|
|
||||||
def allow_delete(self):
|
def allow_delete(self):
|
||||||
from . import Order, Invoice
|
from . import Order, Invoice
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -892,7 +892,6 @@ class GiftCardPayment(BasePaymentProvider):
|
|||||||
is_enabled = True
|
is_enabled = True
|
||||||
identifier = "giftcard"
|
identifier = "giftcard"
|
||||||
verbose_name = _("Gift card")
|
verbose_name = _("Gift card")
|
||||||
is_implicit = True
|
|
||||||
|
|
||||||
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
|
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ from pretix.base.services.cart import (
|
|||||||
get_fees, set_cart_addons, update_tax_rates,
|
get_fees, set_cart_addons, update_tax_rates,
|
||||||
)
|
)
|
||||||
from pretix.base.services.orders import perform_order
|
from pretix.base.services.orders import perform_order
|
||||||
|
from pretix.base.templatetags.money import money_filter
|
||||||
from pretix.base.views.tasks import AsyncAction
|
from pretix.base.views.tasks import AsyncAction
|
||||||
from pretix.multidomain.urlreverse import eventreverse
|
from pretix.multidomain.urlreverse import eventreverse
|
||||||
from pretix.presale.forms.checkout import (
|
from pretix.presale.forms.checkout import (
|
||||||
@@ -531,7 +532,7 @@ class PaymentStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
|
|||||||
def post(self, request):
|
def post(self, request):
|
||||||
self.request = request
|
self.request = request
|
||||||
if request.POST.get("giftcard"):
|
if request.POST.get("giftcard"):
|
||||||
# TODO: cross-organizer acceptance, check for valid money, …
|
# TODO: cross-organizer acceptance, …
|
||||||
try:
|
try:
|
||||||
gc = GiftCard.objects.get(
|
gc = GiftCard.objects.get(
|
||||||
issuer=request.organizer,
|
issuer=request.organizer,
|
||||||
@@ -540,13 +541,30 @@ class PaymentStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
|
|||||||
if gc.currency != request.event.currency:
|
if gc.currency != request.event.currency:
|
||||||
messages.error(self.request, _("This gift card does not support this currency."))
|
messages.error(self.request, _("This gift card does not support this currency."))
|
||||||
return self.render()
|
return self.render()
|
||||||
|
if gc.pk in self.cart_session['gift_cards']:
|
||||||
|
messages.error(self.request, _("This gift card is already used for your payment."))
|
||||||
|
return self.render()
|
||||||
|
if gc.value <= Decimal("0.00"):
|
||||||
|
messages.error(self.request, _("All credit on this gift card has been used."))
|
||||||
|
return self.render()
|
||||||
if 'gift_cards' not in self.cart_session:
|
if 'gift_cards' not in self.cart_session:
|
||||||
self.cart_session['gift_cards'] = []
|
self.cart_session['gift_cards'] = []
|
||||||
self.cart_session['gift_cards'] = self.cart_session['gift_cards'] + [gc.pk]
|
self.cart_session['gift_cards'] = self.cart_session['gift_cards'] + [gc.pk]
|
||||||
return self.render()
|
|
||||||
|
remainder = self._total_order_value - gc.value
|
||||||
|
if remainder >= Decimal('0.00'):
|
||||||
|
messages.success(self.request, _("Your gift card has been applied, but {} still need to be paid. Please select a payment method.").format(
|
||||||
|
money_filter(remainder, self.event.currency)
|
||||||
|
))
|
||||||
|
else:
|
||||||
|
messages.success(self.request, _("Your gift card has been applied."))
|
||||||
|
return redirect(self.get_step_url(request))
|
||||||
except GiftCard.DoesNotExist:
|
except GiftCard.DoesNotExist:
|
||||||
messages.error(self.request, _("This gift card is not known."))
|
messages.error(self.request, _("This gift card is not known."))
|
||||||
return self.render()
|
return self.render()
|
||||||
|
except GiftCard.MultipleObjectsReturned:
|
||||||
|
messages.error(self.request, _("This gift card can not be redeemed since its code is not unique. Please contact the organizer of this event."))
|
||||||
|
return self.render()
|
||||||
|
|
||||||
for p in self.provider_forms:
|
for p in self.provider_forms:
|
||||||
if p['provider'].identifier == request.POST.get('payment', ''):
|
if p['provider'].identifier == request.POST.get('payment', ''):
|
||||||
@@ -572,6 +590,7 @@ class PaymentStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
|
|||||||
if len(self.provider_forms) == 1:
|
if len(self.provider_forms) == 1:
|
||||||
ctx['selected'] = self.provider_forms[0]['provider'].identifier
|
ctx['selected'] = self.provider_forms[0]['provider'].identifier
|
||||||
ctx['cart'] = self.get_cart()
|
ctx['cart'] = self.get_cart()
|
||||||
|
ctx['has_gift_cards'] = self.request.organizer.has_gift_cards
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
|
|||||||
@@ -12,26 +12,25 @@
|
|||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="panel-group" id="payment_accordion">
|
<div class="panel-group" id="payment_accordion">
|
||||||
{# TODO: make this proper #}
|
{# TODO: make this proper #}
|
||||||
<input type="text" class="form-control" placeholder="Add gift card" name="giftcard">
|
|
||||||
{% for p in providers %}
|
{% for p in providers %}
|
||||||
<div class="panel panel-default" data-total="{{ p.total|floatformat:2 }}">
|
<div class="panel panel-default" data-total="{{ p.total|floatformat:2 }}">
|
||||||
<label class="accordion-radio">
|
<label class="accordion-radio">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h4 class="panel-title">
|
<h4 class="panel-title">
|
||||||
{% if show_fees %}
|
{% if show_fees %}
|
||||||
<strong class="pull-right flip">{% if p.fee < 0 %}-{% else %}+{% endif %} {{ p.fee|money:event.currency|cut:"-" }}</strong>
|
<strong class="pull-right flip">{% if p.fee < 0 %}-{% else %}+{% endif %} {{ p.fee|money:event.currency|cut:"-" }}</strong>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<input type="radio" name="payment" value="{{ p.provider.identifier }}"
|
<input type="radio" name="payment" value="{{ p.provider.identifier }}"
|
||||||
title="{{ p.provider.public_name }}"
|
title="{{ p.provider.public_name }}"
|
||||||
data-parent="#payment_accordion"
|
data-parent="#payment_accordion"
|
||||||
{% if selected == p.provider.identifier %}checked="checked"{% endif %}
|
{% if selected == p.provider.identifier %}checked="checked"{% endif %}
|
||||||
data-toggle="radiocollapse" data-target="#payment_{{ p.provider.identifier }}"/>
|
data-toggle="radiocollapse" data-target="#payment_{{ p.provider.identifier }}"/>
|
||||||
<strong>{{ p.provider.public_name }}</strong>
|
<strong>{{ p.provider.public_name }}</strong>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
<div id="payment_{{ p.provider.identifier }}"
|
<div id="payment_{{ p.provider.identifier }}"
|
||||||
class="panel-collapse collapsed {% if selected == p.provider.identifier %}in{% endif %}">
|
class="panel-collapse collapsed {% if selected == p.provider.identifier %}in{% endif %}">
|
||||||
<div class="panel-body form-horizontal">
|
<div class="panel-body form-horizontal">
|
||||||
{% if request.event.testmode %}
|
{% if request.event.testmode %}
|
||||||
{% if p.provider.test_mode_message %}
|
{% if p.provider.test_mode_message %}
|
||||||
@@ -52,6 +51,33 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
{% if has_gift_cards %}
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<label class="accordion-radio">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<input type="radio" name="payment" value="giftcard"
|
||||||
|
data-parent="#payment_accordion"
|
||||||
|
data-toggle="radiocollapse" data-target="#payment_giftcard"/>
|
||||||
|
<strong>{% trans "Redeem a gift card" %}</strong>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
<div id="payment_giftcard"
|
||||||
|
class="panel-collapse collapsed">
|
||||||
|
<div class="panel-body form-horizontal">
|
||||||
|
<p>
|
||||||
|
{% blocktrans %}
|
||||||
|
If you have a gift card, please enter the gift card code here. If the gift card does not have
|
||||||
|
enough credit to pay for the full order, you will be shown this page again and you can either
|
||||||
|
redeem another gift card or select a different payment method for the difference.
|
||||||
|
{% endblocktrans %}
|
||||||
|
</p>
|
||||||
|
<input name="giftcard" class="form-control" placeholder="{% trans "Gift card code" %}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
{% if not providers %}
|
{% if not providers %}
|
||||||
<p><em>{% trans "There are no payment providers enabled." %}</em></p>
|
<p><em>{% trans "There are no payment providers enabled." %}</em></p>
|
||||||
{% if not event.live %}
|
{% if not event.live %}
|
||||||
|
|||||||
Reference in New Issue
Block a user