Order details: Display payment information

This commit is contained in:
Raphael Michel
2015-03-20 23:20:12 +01:00
parent 4a72d11c67
commit 5664177bbb
11 changed files with 172 additions and 5 deletions

View File

@@ -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"))

View File

@@ -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)

View File

@@ -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 %}

View File

@@ -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):

View File

@@ -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)

View File

@@ -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 %}

View File

@@ -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)

View File

@@ -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 %}

View File

@@ -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)

View File

@@ -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 %}