Skip to content

Commit d765037

Browse files
authored
Merge pull request #379 from VOKO-Utrecht/377-upgrade-mollie
377 upgrade mollie
2 parents e833574 + 319b549 commit d765037

File tree

7 files changed

+43
-136
lines changed

7 files changed

+43
-136
lines changed

.github/workflows/lint.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ jobs:
1212
- name: Setup Python
1313
uses: actions/setup-python@v4
1414
with:
15-
python-version: '3.7'
15+
python-version: '3.10.12'
1616
- name: flake8 Lint
1717
uses: py-actions/[email protected]

webapp/finance/urls.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
from finance import views, admin_views
44

55
urlpatterns = (
6-
url(r'^pay/choosebank/$',
7-
views.ChooseBankView.as_view(),
8-
name="finance.choosebank"),
96
url(r'^pay/cancel/$',
107
views.CancelPaymentView.as_view(),
118
name="finance.cancelpayment"),

webapp/finance/views.py

Lines changed: 33 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
from mollie.api.client import Client as MollieClient
2-
from mollie.api.resources.methods import Method as MollieMethods
32
from braces.views import LoginRequiredMixin
4-
from django import forms
53
from django.conf import settings
64
from django.contrib import messages
75
from django.urls import reverse
@@ -15,33 +13,6 @@
1513
from ordering.models import Order
1614

1715

18-
def choosebankform_factory(methods):
19-
"""
20-
Generate a Django Form used to choose your bank from a drop down
21-
Based on the up-to-date list of :banks: from our PSP
22-
"""
23-
paymethods = [(method['id'], method['description'])
24-
for method in methods
25-
if method['status'] == 'activated']
26-
27-
bankchoices = []
28-
for method in methods:
29-
if (method['id'] == 'ideal'):
30-
bankchoices = [(issuer['id'], issuer['name'])
31-
for issuer in method['issuers']]
32-
33-
class ChooseBankForm(forms.Form):
34-
method = forms.ChoiceField(
35-
choices=paymethods,
36-
required=True,
37-
initial='ideal',
38-
widget=forms.RadioSelect,
39-
label="Betaalwijze")
40-
bank = forms.ChoiceField(choices=bankchoices, required=True)
41-
42-
return ChooseBankForm
43-
44-
4516
def get_order_to_pay(user):
4617
cur_order_round = get_current_order_round()
4718

@@ -54,26 +25,19 @@ class MollieMixin(object):
5425
def __init__(self):
5526
self.mollie = MollieClient()
5627
self.mollie.set_api_key(settings.MOLLIE_API_KEY)
57-
self.methods = self.mollie.methods.all(include='issuers')
58-
59-
def create_payment(self, amount, description, issuer_id, order_id, method):
60-
if (method == 'ideal'):
61-
mollieMethod = MollieMethods.IDEAL
62-
else:
63-
mollieMethod = MollieMethods.BANCONTACT
6428

29+
def create_payment(self, amount, description, order_id):
6530
# Mollie API wants exactly two decimals, always
6631
return self.mollie.payments.create({
6732
'amount': {'currency': 'EUR', 'value': "{0:.2f}".format(amount)},
6833
'description': description,
34+
'method': 'ideal',
6935
'redirectUrl': (
7036
settings.BASE_URL
7137
+ reverse("finance.confirmtransaction")
7238
+ "?order=%s" % order_id
7339
),
7440
'webhookUrl': settings.BASE_URL + reverse("finance.callback"),
75-
'method': mollieMethod,
76-
'issuer': issuer_id,
7741
'metadata': {
7842
'order_id': order_id
7943
},
@@ -83,59 +47,44 @@ def get_payment(self, payment_id):
8347
return self.mollie.payments.get(payment_id)
8448

8549

86-
class ChooseBankView(LoginRequiredMixin, MollieMixin, FormView):
87-
"""
88-
Let user choose a bank to use for iDeal payment
89-
"""
90-
template_name = "finance/choose_bank.html"
91-
92-
def get_form_class(self):
93-
return choosebankform_factory(methods=self.methods)
94-
95-
def get_context_data(self, **kwargs):
96-
context = super(ChooseBankView, self).get_context_data(**kwargs)
97-
context['order'] = get_order_to_pay(self.request.user)
98-
return context
99-
100-
10150
class CreateTransactionView(LoginRequiredMixin, MollieMixin, FormView):
10251
"""
10352
Create transaction @ bank and redirect user to bank URL
10453
"""
105-
106-
def get_form_class(self):
107-
return choosebankform_factory(methods=self.methods)
108-
10954
def post(self, request, *args, **kwargs):
110-
Form = self.get_form_class()
111-
form = Form(data=request.POST)
112-
form.full_clean()
113-
114-
# input validation
115-
if 'method' not in form.cleaned_data:
116-
return redirect(reverse('finance.choosebank'))
117-
method = form.cleaned_data.get('method')
118-
119-
if (method == 'ideal'):
120-
if 'bank' not in form.cleaned_data:
121-
return redirect(reverse('finance.choosebank'))
122-
bank = form.cleaned_data.get('bank')
123-
else:
124-
bank = None
125-
# end input validation
126-
12755
order_to_pay = get_order_to_pay(request.user)
12856
if not order_to_pay:
12957
messages.error(request, "Geen bestelling gevonden")
13058
return redirect(reverse('view_products'))
13159

60+
user_notes = request.POST.get('notes').strip()
61+
if user_notes:
62+
order_to_pay.user_notes = user_notes
63+
64+
log_event(event="Finalizing order %s" % order_to_pay.id, user=order_to_pay.user)
65+
order_to_pay.finalized = True # Freeze order
66+
order_to_pay.save()
67+
13268
amount_to_pay = order_to_pay\
13369
.total_price_to_pay_with_balances_taken_into_account()
13470
log_event(
13571
event="Initiating payment (creating transaction) for order %d "
13672
"and amount %f" %
13773
(order_to_pay.id, amount_to_pay), user=order_to_pay.user)
13874

75+
if amount_to_pay == 0:
76+
log_event(
77+
event="Payment for order %d not necessary because order total "
78+
"is %f and user's credit is %f" %
79+
(order_to_pay.id, order_to_pay.total_price,
80+
order_to_pay.user.balance.credit()),
81+
user=order_to_pay.user
82+
)
83+
84+
self._message_payment_unnecessary()
85+
order_to_pay.complete_after_payment()
86+
return redirect(reverse('order_summary', args=(order_to_pay.pk,)))
87+
13988
# Sanity checks. If one of these fails, it's very likely that someone
14089
# is tampering.
14190
assert order_to_pay.user == request.user
@@ -159,9 +108,10 @@ def post(self, request, *args, **kwargs):
159108
amount=float(amount_to_pay),
160109
description="VOKO Utrecht %d"
161110
% order_to_pay.id,
162-
issuer_id=bank,
111+
# issuer_id=bank,
112+
# method=method,
163113
order_id=order_to_pay.id,
164-
method=method)
114+
)
165115

166116
Payment.objects.create(amount=amount_to_pay,
167117
order=order_to_pay,
@@ -170,6 +120,13 @@ def post(self, request, *args, **kwargs):
170120
redirect_url = results.checkout_url
171121
return redirect(redirect_url)
172122

123+
def _message_payment_unnecessary(self):
124+
messages.add_message(
125+
self.request, messages.SUCCESS,
126+
'Omdat je genoeg krediet had was betalen niet nodig. '
127+
'Je bestelling is bevestigd.'
128+
)
129+
173130

174131
class ConfirmTransactionView(LoginRequiredMixin, MollieMixin, TemplateView):
175132
"""

webapp/ordering/views.py

Lines changed: 2 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
ListView, DetailView, FormView, View, UpdateView
1010
)
1111
from django.views.generic.detail import SingleObjectMixin
12-
from log import log_event
1312

1413
from ordering.core import (get_or_create_order, get_order_product,
1514
update_totals_for_products_with_max_order_amounts)
@@ -46,7 +45,7 @@ def get(self, *args, **kwargs):
4645
self.request, "Je bent doorgestuurd naar de betaalpagina "
4746
"omdat je bestelling nog niet is betaald!"
4847
)
49-
return HttpResponseRedirect(reverse('finance.choosebank'))
48+
return HttpResponseRedirect(reverse('finish_order', args=(order.pk,)))
5049
return ret
5150

5251
def post(self, request, *args, **kwargs): # noqa: C901
@@ -91,7 +90,7 @@ def post(self, request, *args, **kwargs): # noqa: C901
9190
value = 0
9291

9392
# User deleted a product
94-
if type(value) != int and not value.isdigit():
93+
if not isinstance(value, int) and not value.isdigit():
9594
value = 0
9695
if not int(value):
9796
if order_product:
@@ -281,43 +280,6 @@ def get_context_data(self, **kwargs):
281280
self.request)
282281
return super(UpdateView, self).get_context_data(**kwargs)
283282

284-
def calculate_payment(self):
285-
order = self.get_object()
286-
return order.total_price_to_pay_with_balances_taken_into_account()
287-
288-
def post(self, request, *args, **kwargs):
289-
order = self.get_object()
290-
291-
user_notes = request.POST.get('notes').strip()
292-
if user_notes:
293-
order.user_notes = user_notes
294-
295-
log_event(event="Finalizing order %s" % order.id, user=order.user)
296-
order.finalized = True # Freeze order
297-
order.save()
298-
299-
if self.calculate_payment() == 0:
300-
log_event(
301-
event="Payment for order %d not necessary because order total "
302-
"is %f and user's credit is %f" %
303-
(order.id, order.total_price,
304-
order.user.balance.credit()),
305-
user=order.user
306-
)
307-
308-
self._message_payment_unnecessary()
309-
order.complete_after_payment()
310-
return redirect(reverse('order_summary', args=(order.pk,)))
311-
312-
return redirect('finance.choosebank')
313-
314-
def _message_payment_unnecessary(self):
315-
messages.add_message(
316-
self.request, messages.SUCCESS,
317-
'Omdat je genoeg krediet had was betalen niet nodig. '
318-
'Je bestelling is bevestigd.'
319-
)
320-
321283

322284
class OrdersDisplay(LoginRequiredMixin, UserOwnsObjectMixin, ListView):
323285
"""

webapp/templates/finance/after_payment.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ <h1>Betaling geslaagd</h1>
88
</p>
99
{% else %}
1010
<h1>Betaling mislukt</h1>
11-
<p><a href="{% url 'finance.choosebank' %}">Klik hier om het nogmaals te proberen.</a></p>
11+
<p><a href="{% url 'finish_order' user.orders.get_current_order.pk %}">Klik hier om het nogmaals te proberen.</a></p>
1212
{% endif %}
1313

1414
{% endblock %}

webapp/templates/finance/choose_bank.html

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,8 @@
22
{% load django_bootstrap5 %}
33
{% block title %}Betalen{% endblock %}
44
{% block content %}
5-
<script type="text/javascript">
6-
window.onload = function() {
7-
$("#id_method").change( function(){
8-
if ($("#id_method input[name='method']:checked").val() == "ideal") {
9-
$("#id_bank").parent().show();
10-
}else
11-
$("#id_bank").parent().hide();
12-
});
13-
}
14-
</script>
15-
<h1>Betalen via iDeal</h1>
5+
6+
<h1>Betaaloverzicht voor deze bestelling</h1>
167
{% if not order %}
178
<div class="alert alert-warning" role="alert">Je hebt geen bestelling om te betalen.</div>
189
{% else %}
@@ -23,14 +14,14 @@ <h1>Betalen via iDeal</h1>
2314
<br/><br/>
2415
<strong>Te betalen: &euro; {{ order.total_price_to_pay_with_balances_taken_into_account }}</strong>
2516
</p>
17+
<p>Klik hieronder op ‘Betalen’ om naar de betaalomgeving te gaan.</p>
2618

2719
<div class="w-50 row">
2820
<form action="{% url 'finance.createtransaction' %}" method="post">{% csrf_token %}
29-
{% bootstrap_form form %}
3021
<div class="mt-4 d-flex justify-content-between">
3122
<a class="btn btn-warning" href="{% url 'finance.cancelpayment' %}" role="button"><span class="bi-x-square"></span> Annuleren</a>
3223
<button type="submit" class="btn btn-primary">
33-
<span class="bi-star"></span> Betalen
24+
<span class="bi-cash-coin"></span> Betalen
3425
</button>
3526
</div>
3627
</form>

webapp/templates/ordering/order_finish.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ <h1>Bestelling plaatsen</h1>
1212
{% else %}
1313
<p>
1414
<strong>Hieronder zie je de producten in je "winkelmandje".</strong><br/>
15-
Door op de rode knop onderaan deze pagina te klikken wordt je bestelling <strong>geplaatst</strong> en
15+
Door op de groene knop onderaan deze pagina te klikken wordt je bestelling <strong>geplaatst</strong> en
1616
ga je naar de betalingspagina.</p>
1717
<p>
1818
Als je een product niet hebt kunnen bestellen (zie eventuele melding bovenaan deze pagina) of als je
@@ -81,7 +81,7 @@ <h1>Bestelling plaatsen</h1>
8181
</table>
8282
</div>
8383

84-
<form action="" method="post">{% csrf_token %}
84+
<form action="{% url 'finance.createtransaction' %}" method="post">{% csrf_token %}
8585

8686
<div class="row">
8787
<div class="col-md-6">

0 commit comments

Comments
 (0)