forked from CGM_Public/pretix_original
Make stripe refund call optional, add request parameter to order_control_refund_render
This commit is contained in:
@@ -484,7 +484,7 @@ class BasePaymentProvider:
|
|||||||
"""
|
"""
|
||||||
return _('Payment provider: %s' % self.verbose_name)
|
return _('Payment provider: %s' % self.verbose_name)
|
||||||
|
|
||||||
def order_control_refund_render(self, order: Order) -> str:
|
def order_control_refund_render(self, order: Order, request: HttpRequest=None) -> str:
|
||||||
"""
|
"""
|
||||||
Will be called if the event administrator clicks an order's 'refund' button.
|
Will be called if the event administrator clicks an order's 'refund' button.
|
||||||
This can be used to display information *before* the order is being refunded.
|
This can be used to display information *before* the order is being refunded.
|
||||||
@@ -494,6 +494,11 @@ class BasePaymentProvider:
|
|||||||
automatically.
|
automatically.
|
||||||
|
|
||||||
:param order: The order object
|
:param order: The order object
|
||||||
|
:param request: The HTTP request
|
||||||
|
|
||||||
|
.. versionchanged:: 1.6
|
||||||
|
|
||||||
|
The parameter ``request`` has been added.
|
||||||
"""
|
"""
|
||||||
return '<div class="alert alert-warning">%s</div>' % _('The money can not be automatically refunded, '
|
return '<div class="alert alert-warning">%s</div>' % _('The money can not be automatically refunded, '
|
||||||
'please transfer the money back manually.')
|
'please transfer the money back manually.')
|
||||||
|
|||||||
@@ -13,13 +13,13 @@
|
|||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
</a>
|
</a>
|
||||||
</h1>
|
</h1>
|
||||||
<p>{% blocktrans trimmed %}
|
|
||||||
Do you really want to refund this order? You cannot revert this action.
|
|
||||||
{% endblocktrans %}</p>
|
|
||||||
|
|
||||||
{{ payment|safe }}
|
|
||||||
|
|
||||||
<form method="post" href="">
|
<form method="post" href="">
|
||||||
|
<p>{% blocktrans trimmed %}
|
||||||
|
Do you really want to refund this order? You cannot revert this action.
|
||||||
|
{% endblocktrans %}</p>
|
||||||
|
|
||||||
|
{{ payment|safe }}
|
||||||
|
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="hidden" name="status" value="r" />
|
<input type="hidden" name="status" value="r" />
|
||||||
<div class="row checkout-button-row">
|
<div class="row checkout-button-row">
|
||||||
|
|||||||
@@ -240,9 +240,14 @@ class OrderTransition(OrderView):
|
|||||||
'order': self.order,
|
'order': self.order,
|
||||||
})
|
})
|
||||||
elif self.order.status == Order.STATUS_PAID and to == 'r':
|
elif self.order.status == Order.STATUS_PAID and to == 'r':
|
||||||
|
try:
|
||||||
|
cr = self.payment_provider.order_control_refund_render(self.order, self.request)
|
||||||
|
except TypeError:
|
||||||
|
cr = self.payment_provider.order_control_refund_render(self.order)
|
||||||
|
|
||||||
return render(self.request, 'pretixcontrol/order/refund.html', {
|
return render(self.request, 'pretixcontrol/order/refund.html', {
|
||||||
'order': self.order,
|
'order': self.order,
|
||||||
'payment': self.payment_provider.order_control_refund_render(self.order),
|
'payment': cr,
|
||||||
})
|
})
|
||||||
else:
|
else:
|
||||||
return HttpResponseNotAllowed(['POST'])
|
return HttpResponseNotAllowed(['POST'])
|
||||||
|
|||||||
@@ -19,6 +19,18 @@ from pretix.plugins.paypal.models import ReferencedPayPalObject
|
|||||||
logger = logging.getLogger('pretix.plugins.paypal')
|
logger = logging.getLogger('pretix.plugins.paypal')
|
||||||
|
|
||||||
|
|
||||||
|
class RefundForm(forms.Form):
|
||||||
|
auto_refund = forms.ChoiceField(
|
||||||
|
initial='auto',
|
||||||
|
label=_('Refund automatically?'),
|
||||||
|
choices=(
|
||||||
|
('auto', _('Automatically refund charge with PayPal')),
|
||||||
|
('manual', _('Do not send refund instruction to PayPal, only mark as refunded in pretix'))
|
||||||
|
),
|
||||||
|
widget=forms.RadioSelect,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Paypal(BasePaymentProvider):
|
class Paypal(BasePaymentProvider):
|
||||||
identifier = 'paypal'
|
identifier = 'paypal'
|
||||||
verbose_name = _('PayPal')
|
verbose_name = _('PayPal')
|
||||||
@@ -248,10 +260,28 @@ class Paypal(BasePaymentProvider):
|
|||||||
'payment_info': payment_info, 'order': order}
|
'payment_info': payment_info, 'order': order}
|
||||||
return template.render(ctx)
|
return template.render(ctx)
|
||||||
|
|
||||||
def order_control_refund_render(self, order) -> str:
|
def _refund_form(self, request):
|
||||||
return '<div class="alert alert-info">%s</div>' % _('The money will be automatically refunded.')
|
return RefundForm(data=request.POST if request.method == "POST" else None)
|
||||||
|
|
||||||
|
def order_control_refund_render(self, order, request) -> str:
|
||||||
|
template = get_template('pretixplugins/paypal/control_refund.html')
|
||||||
|
ctx = {
|
||||||
|
'request': request,
|
||||||
|
'form': self._refund_form(request),
|
||||||
|
}
|
||||||
|
return template.render(ctx)
|
||||||
|
|
||||||
def order_control_refund_perform(self, request, order) -> "bool|str":
|
def order_control_refund_perform(self, request, order) -> "bool|str":
|
||||||
|
f = self._refund_form(request)
|
||||||
|
if not f.is_valid():
|
||||||
|
messages.error(request, _('Your input was invalid, please try again.'))
|
||||||
|
return
|
||||||
|
elif f.cleaned_data.get('auto_refund') == 'manual':
|
||||||
|
order = mark_order_refunded(order, user=request.user)
|
||||||
|
order.payment_manual = True
|
||||||
|
order.save()
|
||||||
|
return
|
||||||
|
|
||||||
self.init_api()
|
self.init_api()
|
||||||
|
|
||||||
if order.payment_info:
|
if order.payment_info:
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
{% load bootstrap3 %}
|
||||||
|
{% bootstrap_form form %}
|
||||||
@@ -21,6 +21,18 @@ from pretix.plugins.stripe.models import ReferencedStripeObject
|
|||||||
logger = logging.getLogger('pretix.plugins.stripe')
|
logger = logging.getLogger('pretix.plugins.stripe')
|
||||||
|
|
||||||
|
|
||||||
|
class RefundForm(forms.Form):
|
||||||
|
auto_refund = forms.ChoiceField(
|
||||||
|
initial='auto',
|
||||||
|
label=_('Refund automatically?'),
|
||||||
|
choices=(
|
||||||
|
('auto', _('Automatically refund charge with Stripe')),
|
||||||
|
('manual', _('Do not send refund instruction to Stripe, only mark as refunded in pretix'))
|
||||||
|
),
|
||||||
|
widget=forms.RadioSelect,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class StripeSettingsHolder(BasePaymentProvider):
|
class StripeSettingsHolder(BasePaymentProvider):
|
||||||
identifier = 'stripe_settings'
|
identifier = 'stripe_settings'
|
||||||
verbose_name = _('Stripe')
|
verbose_name = _('Stripe')
|
||||||
@@ -247,12 +259,30 @@ class StripeMethod(BasePaymentProvider):
|
|||||||
}
|
}
|
||||||
return template.render(ctx)
|
return template.render(ctx)
|
||||||
|
|
||||||
def order_control_refund_render(self, order) -> str:
|
def _refund_form(self, request):
|
||||||
return '<div class="alert alert-info">%s</div>' % _('The money will be automatically refunded.')
|
return RefundForm(data=request.POST if request.method == "POST" else None)
|
||||||
|
|
||||||
|
def order_control_refund_render(self, order, request) -> str:
|
||||||
|
template = get_template('pretixplugins/stripe/control_refund.html')
|
||||||
|
ctx = {
|
||||||
|
'request': request,
|
||||||
|
'form': self._refund_form(request),
|
||||||
|
}
|
||||||
|
return template.render(ctx)
|
||||||
|
|
||||||
def order_control_refund_perform(self, request, order) -> "bool|str":
|
def order_control_refund_perform(self, request, order) -> "bool|str":
|
||||||
self._init_api()
|
self._init_api()
|
||||||
|
|
||||||
|
f = self._refund_form(request)
|
||||||
|
if not f.is_valid():
|
||||||
|
messages.error(request, _('Your input was invalid, please try again.'))
|
||||||
|
return
|
||||||
|
elif f.cleaned_data.get('auto_refund') == 'manual':
|
||||||
|
order = mark_order_refunded(order, user=request.user)
|
||||||
|
order.payment_manual = True
|
||||||
|
order.save()
|
||||||
|
return
|
||||||
|
|
||||||
if order.payment_info:
|
if order.payment_info:
|
||||||
payment_info = json.loads(order.payment_info)
|
payment_info = json.loads(order.payment_info)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
This order has been planned to be paid with {{ method }}, but the payment has not yet been completed.
|
This order has been planned to be paid with {{ method }}, but the payment has not yet been completed.
|
||||||
{% endblocktrans %}</p>
|
{% endblocktrans %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if order.status == "p" %}
|
{% if "source" in payment_info %}
|
||||||
<dl class="dl-horizontal">
|
<dl class="dl-horizontal">
|
||||||
<dt>{% trans "Charge ID" %}</dt>
|
<dt>{% trans "Charge ID" %}</dt>
|
||||||
<dd>{{ payment_info.id }}</dd>
|
<dd>{{ payment_info.id }}</dd>
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
{% load bootstrap3 %}
|
||||||
|
{% bootstrap_form form %}
|
||||||
Reference in New Issue
Block a user