Make stripe refund call optional, add request parameter to order_control_refund_render

This commit is contained in:
Raphael Michel
2017-07-25 16:11:42 +02:00
parent 70a933edc1
commit 92d4566a54
8 changed files with 87 additions and 13 deletions
+6 -1
View File
@@ -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">
+6 -1
View File
@@ -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'])
+32 -2
View File
@@ -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 %}
+32 -2
View File
@@ -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 %}