forked from CGM_Public/pretix_original
Order details: Display payment information
This commit is contained in:
@@ -1488,8 +1488,8 @@ class Order(Versionable):
|
||||
STATUS_CANCELLED = "c"
|
||||
STATUS_REFUNDED = "r"
|
||||
STATUS_CHOICE = (
|
||||
(STATUS_PAID, _("pending")),
|
||||
(STATUS_PENDING, _("paid")),
|
||||
(STATUS_PENDING, _("pending")),
|
||||
(STATUS_PAID, _("paid")),
|
||||
(STATUS_EXPIRED, _("expired")),
|
||||
(STATUS_CANCELLED, _("cancelled")),
|
||||
(STATUS_REFUNDED, _("refunded"))
|
||||
|
||||
@@ -273,3 +273,17 @@ class BasePaymentProvider:
|
||||
:param order: The order object
|
||||
"""
|
||||
return None
|
||||
|
||||
def order_control_render(self, request: HttpRequest, order: Order) -> str:
|
||||
"""
|
||||
Will be called if the *event administrator* views the detail page of an order
|
||||
which is associated with this payment provider.
|
||||
|
||||
It should return HTML code containing information regarding the current payment
|
||||
status and, if applicable, next steps.
|
||||
|
||||
The default implementation returns the verbose name of the payment provider.
|
||||
|
||||
:param order: The order object
|
||||
"""
|
||||
return _('Payment provider: %s' % self.verbose_name)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
{% blocktrans trimmed with code=order.code %}
|
||||
Order details: {{ code }}
|
||||
{% endblocktrans %}
|
||||
{% include "pretixcontrol/orders/fragment_order_status.html" with order=order class="pull-right" %}
|
||||
</h1>
|
||||
<div class="panel panel-primary items">
|
||||
<div class="panel-heading">
|
||||
@@ -78,4 +79,19 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel panel-primary items">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
{% trans "Payment information" %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{{ payment }}
|
||||
{% if order.status == 'n' %}
|
||||
<p>{% blocktrans trimmed with date=order.expires %}
|
||||
The payment has to be completed before {{ date }}.
|
||||
{% endblocktrans %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
from itertools import groupby
|
||||
from django.db.models import Q
|
||||
from django.utils.functional import cached_property
|
||||
from django.views.generic import ListView, DetailView
|
||||
|
||||
from pretix.base.models import Order
|
||||
from pretix.base.signals import register_payment_providers
|
||||
from pretix.control.permissions import EventPermissionRequiredMixin
|
||||
|
||||
|
||||
@@ -31,10 +33,19 @@ class OrderDetail(EventPermissionRequiredMixin, DetailView):
|
||||
code=self.kwargs['code'].upper()
|
||||
)
|
||||
|
||||
@cached_property
|
||||
def payment_provider(self):
|
||||
responses = register_payment_providers.send(self.request.event)
|
||||
for receiver, response in responses:
|
||||
provider = response(self.request.event)
|
||||
if provider.identifier == self.object.payment_provider:
|
||||
return provider
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
ctx = super().get_context_data(**kwargs)
|
||||
ctx['items'] = self.get_items()
|
||||
ctx['event'] = self.request.event
|
||||
ctx['payment'] = self.payment_provider.order_control_render(self.request, self.object)
|
||||
return ctx
|
||||
|
||||
def get_items(self):
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
from collections import OrderedDict
|
||||
import json
|
||||
from django.template import Context
|
||||
from django.template.loader import get_template
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
@@ -45,3 +46,14 @@ class BankTransfer(BasePaymentProvider):
|
||||
template = get_template('pretixplugins/banktransfer/pending.html')
|
||||
ctx = Context({'request': request, 'order': order, 'settings': self.settings})
|
||||
return template.render(ctx)
|
||||
|
||||
def order_control_render(self, request, order) -> str:
|
||||
if order.payment_info:
|
||||
payment_info = json.loads(order.payment_info)
|
||||
payment_info['amount'] /= 100
|
||||
else:
|
||||
payment_info = None
|
||||
template = get_template('pretixplugins/banktransfer/control.html')
|
||||
ctx = Context({'request': request, 'event': self.event, 'settings': self.settings,
|
||||
'payment_info': payment_info, 'order': order})
|
||||
return template.render(ctx)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
{% load i18n %}
|
||||
|
||||
{% if payment_info and order.status == "p" %}
|
||||
<p>{% blocktrans trimmed %}
|
||||
This order has been paid via bank transfer.
|
||||
{% endblocktrans %}</p>
|
||||
|
||||
<dl class="dl-horizontal">
|
||||
<dt>{% trans "Bank account" %}</dt>
|
||||
<dd>{{ payment_info.account }}</dd>
|
||||
<dt>{% trans "Payer name" %}</dt>
|
||||
<dd>{{ payment_info.name }}</dd>
|
||||
<dt>{% trans "Total value" %}</dt>
|
||||
<dd>{{ payment_info.value }}</dd>
|
||||
<dt>{% trans "Payment date" %}</dt>
|
||||
<dd>{{ payment_info.date }}</dd>
|
||||
<dt>{% trans "Reference" %}</dt>
|
||||
<dd>{{ payment_info.reference }}</dd>
|
||||
</dl>
|
||||
{% else %}
|
||||
<p>{% blocktrans trimmed %}
|
||||
This order has been planned to be paid via bank transfer, but no payment has been received yet.
|
||||
{% endblocktrans %}</p>
|
||||
<dl class="dl-horizontal">
|
||||
<dt>{% trans "Reference code" %}</dt>
|
||||
<dd>{{ event.slug|upper }}{{ order.code }}</dd>
|
||||
</dl>
|
||||
{% endif %}
|
||||
@@ -153,7 +153,7 @@ class Paypal(BasePaymentProvider):
|
||||
|
||||
self.init_api()
|
||||
payment = paypalrestsdk.Payment.find(request.session.get('payment_paypal_id'))
|
||||
if str(payment.transactions[0].amount.total) != str(order.total) or payment.transactions[1].amount.currency != \
|
||||
if str(payment.transactions[0].amount.total) != str(order.total) or payment.transactions[0].amount.currency != \
|
||||
self.event.currency:
|
||||
messages.error(request, _('We were unable to process your payment. See below for details on how to '
|
||||
'proceed.'))
|
||||
@@ -169,7 +169,7 @@ class Paypal(BasePaymentProvider):
|
||||
messages.warning(request, _('PayPal has not yet approved the payment. We will inform you as soon as the '
|
||||
'payment completed.'))
|
||||
order = order.clone()
|
||||
order.payment_info = str(payment)
|
||||
order.payment_info = json.dumps(payment.to_dict())
|
||||
order.save()
|
||||
return
|
||||
|
||||
@@ -179,7 +179,7 @@ class Paypal(BasePaymentProvider):
|
||||
logger.error('Invalid state: %s' % str(payment))
|
||||
return
|
||||
|
||||
order.mark_paid('paypal', str(payment))
|
||||
order.mark_paid('paypal', json.dumps(payment.to_dict()))
|
||||
messages.success(request, _('We successfully received your payment. Thank you!'))
|
||||
return None
|
||||
|
||||
@@ -194,3 +194,13 @@ class Paypal(BasePaymentProvider):
|
||||
ctx = Context({'request': request, 'event': self.event, 'settings': self.settings,
|
||||
'retry': retry, 'order': order})
|
||||
return template.render(ctx)
|
||||
|
||||
def order_control_render(self, request, order) -> str:
|
||||
if order.payment_info:
|
||||
payment_info = json.loads(order.payment_info)
|
||||
else:
|
||||
payment_info = None
|
||||
template = get_template('pretixplugins/paypal/control.html')
|
||||
ctx = Context({'request': request, 'event': self.event, 'settings': self.settings,
|
||||
'payment_info': payment_info, 'order': order})
|
||||
return template.render(ctx)
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
{% load i18n %}
|
||||
|
||||
{% if payment_info %}
|
||||
{% if order.status == "p" %}
|
||||
<p>{% blocktrans trimmed %}
|
||||
This order has been paid via PayPal.
|
||||
{% endblocktrans %}</p>
|
||||
{% else %}
|
||||
<p>{% blocktrans trimmed %}
|
||||
This order has been planned to be paid via PayPal, but the payment has not yet been completed.
|
||||
{% endblocktrans %}</p>
|
||||
{% endif %}
|
||||
<dl class="dl-horizontal">
|
||||
<dt>{% trans "Payment ID" %}</dt>
|
||||
<dd>{{ payment_info.id }}</dd>
|
||||
<dt>{% trans "Payer" %}</dt>
|
||||
<dd>{{ payment_info.payer.payer_info.email }}</dd>
|
||||
<dt>{% trans "Last update" %}</dt>
|
||||
<dd>{{ payment_info.update_time }}</dd>
|
||||
<dt>{% trans "Total value" %}</dt>
|
||||
<dd>{{ payment_info.transactions.0.amount.total }}</dd>
|
||||
<dt>{% trans "Currency" %}</dt>
|
||||
<dd>{{ payment_info.transactions.0.amount.currency }}</dd>
|
||||
</dl>
|
||||
{% else %}
|
||||
<p>{% blocktrans trimmed %}
|
||||
This order has been planned to be paid via PayPal, but the payment has not yet been completed.
|
||||
{% endblocktrans %}</p>
|
||||
{% endif %}
|
||||
@@ -1,4 +1,5 @@
|
||||
from collections import OrderedDict
|
||||
import json
|
||||
import logging
|
||||
from django.contrib import messages
|
||||
from django.template import Context
|
||||
@@ -82,3 +83,14 @@ class Stripe(BasePaymentProvider):
|
||||
ctx = Context({'request': request, 'event': self.event, 'settings': self.settings,
|
||||
'order': order})
|
||||
return template.render(ctx)
|
||||
|
||||
def order_control_render(self, request, order) -> str:
|
||||
if order.payment_info:
|
||||
payment_info = json.loads(order.payment_info)
|
||||
payment_info['amount'] /= 100
|
||||
else:
|
||||
payment_info = None
|
||||
template = get_template('pretixplugins/stripe/control.html')
|
||||
ctx = Context({'request': request, 'event': self.event, 'settings': self.settings,
|
||||
'payment_info': payment_info, 'order': order})
|
||||
return template.render(ctx)
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
{% load i18n %}
|
||||
|
||||
{% if payment_info %}
|
||||
{% if order.status == "p" %}
|
||||
<p>{% blocktrans trimmed %}
|
||||
This order has been paid via Stripe.
|
||||
{% endblocktrans %}</p>
|
||||
{% else %}
|
||||
<p>{% blocktrans trimmed %}
|
||||
This order has been planned to be paid via Stripe, but the payment has not yet been completed.
|
||||
{% endblocktrans %}</p>
|
||||
{% endif %}
|
||||
<dl class="dl-horizontal">
|
||||
<dt>{% trans "Charge ID" %}</dt>
|
||||
<dd>{{ payment_info.id }}</dd>
|
||||
<dt>{% trans "Card type" %}</dt>
|
||||
<dd>{{ payment_info.source.brand }}</dd>
|
||||
<dt>{% trans "Card number" %}</dt>
|
||||
<dd>**** **** **** {{ payment_info.source.last4 }}</dd>
|
||||
<dt>{% trans "Payer name" %}</dt>
|
||||
<dd>{{ payment_info.source.name }}</dd>
|
||||
<dt>{% trans "Total value" %}</dt>
|
||||
<dd>{{ payment_info.amount|floatformat:2 }}</dd>
|
||||
<dt>{% trans "Currency" %}</dt>
|
||||
<dd>{{ payment_info.currency|upper }}</dd>
|
||||
<dt>{% trans "Status" %}</dt>
|
||||
<dd>{{ payment_info.status }}</dd>
|
||||
</dl>
|
||||
{% else %}
|
||||
<p>{% blocktrans trimmed %}
|
||||
This order has been planned to be paid via Stripe, but the payment has not yet been completed.
|
||||
{% endblocktrans %}</p>
|
||||
{% endif %}
|
||||
Reference in New Issue
Block a user