From 2acc653807602eb9d120d56a07d75f87f0befab3 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 6 Mar 2015 23:57:09 +0100 Subject: [PATCH] Basic confirmation page --- .../static/pretixpresale/less/event.less | 3 ++ .../pretixpresale/event/checkout_confirm.html | 46 +++++++++++++++++++ .../pretixpresale/event/fragment_cart.html | 12 +++++ src/pretix/presale/urls.py | 2 + src/pretix/presale/views/__init__.py | 14 +++++- src/pretix/presale/views/checkout.py | 16 +++++-- 6 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html diff --git a/src/pretix/presale/static/pretixpresale/less/event.less b/src/pretix/presale/static/pretixpresale/less/event.less index a6560c329..19f97f1f3 100644 --- a/src/pretix/presale/static/pretixpresale/less/event.less +++ b/src/pretix/presale/static/pretixpresale/less/event.less @@ -44,6 +44,9 @@ border-top: 1px solid @table-border-color; } } +.panel-primary .panel-heading a { + color: white; +} .checkout-button-row { padding: 15px 0; } diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html new file mode 100644 index 000000000..0e78521d6 --- /dev/null +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html @@ -0,0 +1,46 @@ +{% extends "pretixpresale/event/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %}{% trans "Confirm order" %}{% endblock %} +{% block content %} +

{% trans "Confirm order" %}

+

{% trans "Please review the details below and confirm your order." %}

+
+ {% csrf_token %} +
+
+ +

+ {% trans "Your cart" %} +

+
+
+ {% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event editable=False %} +
+
+ {% if cart.minutes_left > 0 %} + {% blocktrans trimmed with minutes=cart.minutes_left %} + The items in your cart are reserved for you for {{ minutes }} minutes. + {% endblocktrans %} + {% else %} + {% trans "The items in your cart are no longer reserved for you." %} + {% endif %} +
+
+
+
+
+ {# TODO: Question answers #} + {# TODO: Payment method #} +
+
+ +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html b/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html index d89458978..7715ff46a 100644 --- a/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html @@ -52,6 +52,18 @@
{% endfor %} +{% if cart.payment_fee %} + {# TODO: Tax rate? #} +
+
+ {% trans "Payment method fee" %} +
+
+ {{ event.currency }} {{ cart.payment_fee|floatformat:2 }} +
+
+
+{% endif %}
{% trans "Total" %} diff --git a/src/pretix/presale/urls.py b/src/pretix/presale/urls.py index 761943d2f..4eeb6236a 100644 --- a/src/pretix/presale/urls.py +++ b/src/pretix/presale/urls.py @@ -16,6 +16,8 @@ urlpatterns = patterns( url(r'^checkout$', pretix.presale.views.checkout.CheckoutStart.as_view(), name='event.checkout.start'), url(r'^checkout/payment$', pretix.presale.views.checkout.PaymentDetails.as_view(), name='event.checkout.payment'), + url(r'^checkout/confirm$', pretix.presale.views.checkout.OrderConfirm.as_view(), + name='event.checkout.confirm'), url(r'^login$', pretix.presale.views.event.EventLogin.as_view(), name='event.checkout.login'), ) )), diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index 506600053..25157302d 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -8,6 +8,7 @@ from django.db.models import Q from django.utils.timezone import now from pretix.base.models import CartPosition +from pretix.base.signals import register_payment_providers class EventLoginRequiredMixin: @@ -59,10 +60,21 @@ class CartDisplayMixin: group.total = group.count * group.price positions.append(group) + total = sum(p.total for p in positions) + + payment_fee = 0 + if 'payment' in self.request.session: + responses = register_payment_providers.send(self.request.event) + for receiver, response in responses: + provider = response(self.request.event) + if provider.identifier == self.request.session['payment']: + payment_fee = provider.calculate_fee(total) + return { 'positions': positions, 'raw': cartpos, - 'total': sum(p.total for p in positions), + 'total': total + payment_fee, + 'payment_fee': payment_fee, 'minutes_left': ( max(min(p.expires for p in positions) - now(), timedelta()).seconds // 60 if positions else 0 diff --git a/src/pretix/presale/views/checkout.py b/src/pretix/presale/views/checkout.py index e39698172..c18d3e2dc 100644 --- a/src/pretix/presale/views/checkout.py +++ b/src/pretix/presale/views/checkout.py @@ -76,7 +76,7 @@ class QuestionsForm(forms.Form): self.fields['question_%s' % q.identity] = field -class CheckoutStart(EventViewMixin, CartDisplayMixin, EventLoginRequiredMixin, TemplateView): +class CheckoutStart(EventViewMixin, EventLoginRequiredMixin, TemplateView): template_name = "pretixpresale/event/checkout_questions.html" def get_success_url(self): @@ -183,11 +183,11 @@ class CheckoutStart(EventViewMixin, CartDisplayMixin, EventLoginRequiredMixin, T return ctx -class PaymentDetails(EventViewMixin, CartDisplayMixin, EventLoginRequiredMixin, TemplateView): +class PaymentDetails(EventViewMixin, EventLoginRequiredMixin, TemplateView): template_name = "pretixpresale/event/checkout_payment.html" def get_success_url(self): - return reverse('presale:event.index', kwargs={ + return reverse('presale:event.checkout.confirm', kwargs={ 'event': self.request.event.slug, 'organizer': self.request.event.organizer.slug, }) @@ -229,6 +229,7 @@ class PaymentDetails(EventViewMixin, CartDisplayMixin, EventLoginRequiredMixin, def post(self, request, *args, **kwargs): for p in self.provider_forms: if p['provider'].identifier == request.POST.get('payment', ''): + request.session['payment'] = p['provider'].identifier total = self._total_order_value + p['provider'].calculate_fee(self._total_order_value) resp = p['provider'].checkout_prepare(request, total) if isinstance(resp, HttpResponse): @@ -242,3 +243,12 @@ class PaymentDetails(EventViewMixin, CartDisplayMixin, EventLoginRequiredMixin, ctx = super().get_context_data(**kwargs) ctx['providers'] = self.provider_forms return ctx + + +class OrderConfirm(EventViewMixin, CartDisplayMixin, EventLoginRequiredMixin, TemplateView): + template_name = "pretixpresale/event/checkout_confirm.html" + + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + ctx['cart'] = self.get_cart() + return ctx