diff --git a/combo/apps/lingo/manager_views.py b/combo/apps/lingo/manager_views.py
index 72a99116..ed2afb41 100644
--- a/combo/apps/lingo/manager_views.py
+++ b/combo/apps/lingo/manager_views.py
@@ -27,7 +27,12 @@ from django.http import HttpResponse
import eopayment
-from .models import Regie, Transaction
+from .models import PaymentBackend, Regie, Transaction
+
+
+REGIE_FIELDS = ['label', 'slug', 'description', 'payment_backend', 'is_default', 'webservice_url',
+ 'extra_fees_ws_url', 'payment_min_amount', 'text_on_success']
+
class RegieListView(ListView):
model = Regie
@@ -35,7 +40,7 @@ class RegieListView(ListView):
class RegieCreateView(CreateView):
model = Regie
- fields = '__all__'
+ fields = REGIE_FIELDS
success_url = reverse_lazy('lingo-manager-regie-list')
def get_initial(self):
@@ -46,7 +51,7 @@ class RegieCreateView(CreateView):
class RegieUpdateView(UpdateView):
model = Regie
- fields = '__all__'
+ fields = REGIE_FIELDS
success_url = reverse_lazy('lingo-manager-regie-list')
@@ -55,6 +60,27 @@ class RegieDeleteView(DeleteView):
success_url = reverse_lazy('lingo-manager-regie-list')
+class PaymentBackendListView(ListView):
+ model = PaymentBackend
+
+
+class PaymentBackendCreateView(CreateView):
+ model = PaymentBackend
+ fields = '__all__'
+ success_url = reverse_lazy('lingo-manager-paymentbackend-list')
+
+
+class PaymentBackendUpdateView(UpdateView):
+ model = PaymentBackend
+ fields = '__all__'
+ success_url = reverse_lazy('lingo-manager-paymentbackend-list')
+
+
+class PaymentBackendDeleteView(DeleteView):
+ model = PaymentBackend
+ success_url = reverse_lazy('lingo-manager-paymentbackend-list')
+
+
class TransactionListView(ListView):
model = Transaction
paginate_by = 10
diff --git a/combo/apps/lingo/templates/lingo/paymentbackend_confirm_delete.html b/combo/apps/lingo/templates/lingo/paymentbackend_confirm_delete.html
new file mode 100644
index 00000000..d1617fea
--- /dev/null
+++ b/combo/apps/lingo/templates/lingo/paymentbackend_confirm_delete.html
@@ -0,0 +1,17 @@
+{% extends "combo/manager_base.html" %}
+{% load i18n %}
+
+{% block appbar %}
+
{{ view.model.get_verbose_name }}
+{% endblock %}
+
+{% block content %}
+
+{% endblock %}
diff --git a/combo/apps/lingo/templates/lingo/paymentbackend_form.html b/combo/apps/lingo/templates/lingo/paymentbackend_form.html
new file mode 100644
index 00000000..41ea23c4
--- /dev/null
+++ b/combo/apps/lingo/templates/lingo/paymentbackend_form.html
@@ -0,0 +1,22 @@
+{% extends "lingo/paymentbackend_list.html" %}
+{% load i18n %}
+
+{% block appbar %}
+{% if object.id %}
+{% trans "Edit Payment backend" %}
+{% else %}
+{% trans "New Payment backend" %}
+{% endif %}
+{% endblock %}
+
+{% block content %}
+
+
+{% endblock %}
diff --git a/combo/apps/lingo/templates/lingo/paymentbackend_list.html b/combo/apps/lingo/templates/lingo/paymentbackend_list.html
new file mode 100644
index 00000000..f9af2f73
--- /dev/null
+++ b/combo/apps/lingo/templates/lingo/paymentbackend_list.html
@@ -0,0 +1,38 @@
+{% extends "lingo/manager_base.html" %}
+{% load i18n %}
+
+{% block appbar %}
+{% trans 'Payment backends' %}
+
+{% trans 'New' %}
+
+{% endblock %}
+
+{% block breadcrumb %}
+{{ block.super }}
+{% trans 'Payment backends' %}
+{% endblock %}
+
+{% block content %}
+
+{% if object_list %}
+
+{% else %}
+
+ {% blocktrans %}
+ This site doesn't have any payment backend yet. Click on the "New" button in the top
+ right of the page to add a first one.
+ {% endblocktrans %}
+
+{% endif %}
+
+{% endblock %}
diff --git a/combo/apps/lingo/templates/lingo/regie_list.html b/combo/apps/lingo/templates/lingo/regie_list.html
index 48dac21d..6db40ef8 100644
--- a/combo/apps/lingo/templates/lingo/regie_list.html
+++ b/combo/apps/lingo/templates/lingo/regie_list.html
@@ -20,7 +20,7 @@
{% for regie in object_list %}
{{ regie.label }}
- ({{regie.service}})
+ ({{regie.payment_backend.label}})
{% if regie.is_default %}{% endif %}
{% trans "remove" %}
diff --git a/combo/apps/lingo/templates/lingo/transaction_list.html b/combo/apps/lingo/templates/lingo/transaction_list.html
index 29786ad5..67b62645 100644
--- a/combo/apps/lingo/templates/lingo/transaction_list.html
+++ b/combo/apps/lingo/templates/lingo/transaction_list.html
@@ -4,6 +4,7 @@
{% block appbar %}
{% trans 'Transactions' %}
+{% trans 'Payment backends' %}
{% trans 'Regies' %}
{% trans 'download CSV' %}
diff --git a/combo/apps/lingo/urls.py b/combo/apps/lingo/urls.py
index bc5aba40..5498d9f1 100644
--- a/combo/apps/lingo/urls.py
+++ b/combo/apps/lingo/urls.py
@@ -23,7 +23,9 @@ from .views import (RegiesApiView, AddBasketItemApiView, PayView, CallbackView,
RemoveBasketItemApiView, ValidateTransactionApiView,
CancelTransactionApiView, SelfInvoiceView, BasketItemPayView)
from .manager_views import (RegieListView, RegieCreateView, RegieUpdateView,
- RegieDeleteView, TransactionListView, download_transactions_csv)
+ RegieDeleteView, TransactionListView, download_transactions_csv,
+ PaymentBackendListView, PaymentBackendCreateView,
+ PaymentBackendUpdateView, PaymentBackendDeleteView)
lingo_manager_urls = [
url('^$', TransactionListView.as_view(), name='lingo-manager-homepage'),
@@ -34,6 +36,14 @@ lingo_manager_urls = [
name='lingo-manager-regie-edit'),
url(r'^regies/(?P\w+)/delete$', RegieDeleteView.as_view(),
name='lingo-manager-regie-delete'),
+ url('^paymentbackends/$', PaymentBackendListView.as_view(),
+ name='lingo-manager-paymentbackend-list'),
+ url('^paymentbackends/add/$', PaymentBackendCreateView.as_view(),
+ name='lingo-manager-paymentbackend-add'),
+ url(r'^paymentbackends/(?P\w+)/edit$', PaymentBackendUpdateView.as_view(),
+ name='lingo-manager-paymentbackend-edit'),
+ url(r'^paymentbackends/(?P\w+)/delete$', PaymentBackendDeleteView.as_view(),
+ name='lingo-manager-paymentbackend-delete'),
]
urlpatterns = [
diff --git a/tests/test_lingo_cells.py b/tests/test_lingo_cells.py
index 8bbc0376..c8250514 100644
--- a/tests/test_lingo_cells.py
+++ b/tests/test_lingo_cells.py
@@ -10,7 +10,7 @@ from django.utils.http import quote
from combo.data.models import Page
from combo.apps.lingo.models import Regie, BasketItem, Transaction
-from combo.apps.lingo.models import (LingoBasketCell,
+from combo.apps.lingo.models import (LingoBasketCell, PaymentBackend,
LingoRecentTransactionsCell, LingoBasketLinkCell, TipiPaymentFormCell)
pytestmark = pytest.mark.django_db
@@ -25,6 +25,11 @@ def user():
@pytest.fixture
def regie():
+ try:
+ payment_backend = PaymentBackend.objects.get(slug='test1')
+ except PaymentBackend.DoesNotExist:
+ payment_backend = PaymentBackend.objects.create(
+ label='test1', slug='test1')
try:
regie = Regie.objects.get(slug='test')
except Regie.DoesNotExist:
@@ -32,6 +37,7 @@ def regie():
regie.label = 'Test'
regie.slug = 'test'
regie.description = 'test'
+ regie.payment_backend = payment_backend
regie.save()
return regie
diff --git a/tests/test_lingo_manager.py b/tests/test_lingo_manager.py
index ffff1f32..a66a1786 100644
--- a/tests/test_lingo_manager.py
+++ b/tests/test_lingo_manager.py
@@ -10,12 +10,19 @@ import pytest
import eopayment
from combo.data.models import Page
-from combo.apps.lingo.models import Regie, BasketItem, Transaction, ActiveItems, TipiPaymentFormCell
+from combo.apps.lingo.models import (Regie, BasketItem, Transaction, ActiveItems,
+ TipiPaymentFormCell, PaymentBackend)
from decimal import Decimal
pytestmark = pytest.mark.django_db
+@pytest.fixture
+def payment_backend():
+ return PaymentBackend.objects.create(
+ label='test1', slug='test1', service='dummy', service_options={'siret': '1234'})
+
+
def login(app, username='admin', password='admin'):
login_page = app.get('/login/')
login_form = login_page.forms[0]
@@ -30,7 +37,7 @@ def test_access(app, admin_user):
resp = app.get('/manage/', status=200)
assert '/manage/lingo/' in resp.text
-def test_add_regie(app, admin_user):
+def test_add_regie(app, admin_user, payment_backend):
Regie.objects.all().delete()
app = login(app)
resp = app.get('/manage/lingo/regies/', status=200)
@@ -38,7 +45,7 @@ def test_add_regie(app, admin_user):
resp.forms[0]['label'] = 'Test'
resp.forms[0]['slug'] = 'test'
resp.forms[0]['description'] = 'description'
- resp.forms[0]['service'] = 'dummy'
+ resp.forms[0]['payment_backend'] = payment_backend.pk
assert resp.form['is_default'].checked is True
resp = resp.forms[0].submit()
assert resp.location.endswith('/manage/lingo/regies/')
@@ -47,8 +54,8 @@ def test_add_regie(app, admin_user):
assert regie.label == 'Test'
assert regie.is_default is True
-def test_edit_regie(app, admin_user):
- test_add_regie(app, admin_user)
+def test_edit_regie(app, admin_user, payment_backend):
+ test_add_regie(app, admin_user, payment_backend)
app = login(app)
resp = app.get('/manage/lingo/regies/', status=200)
resp = resp.click('Test')
@@ -59,18 +66,17 @@ def test_edit_regie(app, admin_user):
regie = Regie.objects.all()[0]
assert regie.description == 'other description'
-def test_delete_regie(app, admin_user):
- test_add_regie(app, admin_user)
+def test_delete_regie(app, admin_user, payment_backend):
+ test_add_regie(app, admin_user, payment_backend)
app = login(app)
resp = app.get('/manage/lingo/regies/', status=200)
resp = resp.click('remove')
assert 'Are you sure you want to delete this?' in resp.text
resp = resp.forms[0].submit()
- assert resp.location.endswith('/manage/lingo/regies/')
assert Regie.objects.count() == 0
-def test_add_second_regie(app, admin_user):
- test_add_regie(app, admin_user)
+def test_add_second_regie(app, admin_user, payment_backend):
+ test_add_regie(app, admin_user, payment_backend)
regie = Regie.objects.all()[0]
app = login(app)
@@ -79,7 +85,7 @@ def test_add_second_regie(app, admin_user):
resp.forms[0]['label'] = 'Test2'
resp.forms[0]['slug'] = 'test2'
resp.forms[0]['description'] = 'description'
- resp.forms[0]['service'] = 'dummy'
+ resp.forms[0]['payment_backend'] = payment_backend.pk
assert resp.form['is_default'].checked is False
resp = resp.forms[0].submit()
assert resp.location.endswith('/manage/lingo/regies/')
@@ -88,8 +94,8 @@ def test_add_second_regie(app, admin_user):
assert Regie.objects.get(id=regie.id).is_default is True
assert Regie.objects.exclude(id=regie.id)[0].is_default is False
-def test_download_transaction(app, admin_user):
- test_add_regie(app, admin_user)
+def test_download_transaction(app, admin_user, payment_backend):
+ test_add_regie(app, admin_user, payment_backend)
regie = Regie.objects.filter(slug='test')[0]
user = User.objects.create_user('dimebag', 'dime@bag.pan', 'pwd')
user.last_name = u'Darëll'
@@ -164,7 +170,7 @@ def test_configure_tipi_cell(app, admin_user):
assert resp.text.count('ROLDEB:') == 1
assert resp.text.count('ROLDET:') == 1
-def test_configure_invoices_cell(app, admin_user):
+def test_configure_invoices_cell(app, admin_user, payment_backend):
page = Page(title='xxx', slug='test', template_name='standard')
page.save()
@@ -179,6 +185,7 @@ def test_configure_invoices_cell(app, admin_user):
regie.label = 'Test'
regie.slug = 'test'
regie.description = 'test'
+ regie.payment_backend = payment_backend
regie.save()
resp = app.get('/manage/pages/%s/' % page.id, status=200)
@@ -202,6 +209,7 @@ def test_configure_invoices_cell(app, admin_user):
regie2.slug = 'test2'
regie2.description = 'test2'
regie2.webservice_url = 'http://example.net/'
+ regie2.payment_backend = payment_backend
regie2.save()
resp = app.get('/manage/pages/%s/' % page.id, status=200)
@@ -215,3 +223,55 @@ def test_configure_invoices_cell(app, admin_user):
resp.form['clingo_activeitems-%s-regie' % cell.id].value = 'test2'
resp.form.submit()
assert ActiveItems.objects.get(id=cell.id).regie == regie2.slug
+
+
+def test_payment_backend_list(app, admin_user):
+ PaymentBackend.objects.create(label='label1', slug='slug1')
+ PaymentBackend.objects.create(label='label2', slug='slug2')
+ app = login(app)
+ resp = app.get('/manage/lingo/paymentbackends/', status=200)
+
+ assert '/manage/lingo/paymentbackends/add' in resp.text
+ assert 'label1' in resp.content
+ assert 'label2' in resp.content
+
+ for payment_backend in PaymentBackend.objects.all():
+ assert '/manage/lingo/paymentbackends/%s' % payment_backend.pk in resp.text
+ assert '/manage/lingo/paymentbackends/%s/delete' % payment_backend.pk in resp.text
+
+
+def test_add_payment_backend(app, admin_user):
+ assert not PaymentBackend.objects.count()
+ app = login(app)
+ resp = app.get('/manage/lingo/paymentbackends/add/', status=200)
+ assert '/manage/lingo/paymentbackends/' in resp.text
+
+ resp.forms[0]['label'] = 'Test'
+ resp.forms[0]['slug'] = 'test-add'
+ resp.forms[0]['service'] = 'dummy'
+ resp.forms[0]['service_options'] = '{"siret": "1234"}'
+ resp = resp.forms[0].submit()
+
+ assert PaymentBackend.objects.count() == 1
+ payment_backend = PaymentBackend.objects.get(slug='test-add')
+ assert payment_backend.label == 'Test'
+ assert payment_backend.service_options == {'siret': '1234'}
+
+ assert resp.location.endswith('/manage/lingo/paymentbackends/')
+
+
+def test_edit_payment_backend(app, admin_user):
+ payment_backend = PaymentBackend.objects.create(label='label1', slug='slug1')
+ app = login(app)
+ resp = app.get('/manage/lingo/paymentbackends/%s/edit' % payment_backend.pk, status=200)
+ assert '/manage/lingo/paymentbackends/' in resp.text
+
+ resp.forms[0]['label'] = 'label1-modified'
+ resp.forms[0]['slug'] = 'slug1'
+ resp.forms[0]['service'] = 'dummy'
+ resp.forms[0]['service_options'] = '{"siret": "1234"}'
+ resp = resp.forms[0].submit()
+
+ assert resp.location.endswith('/manage/lingo/paymentbackends/')
+ payment_backend = PaymentBackend.objects.get(slug='slug1')
+ assert payment_backend.label == 'label1-modified'
diff --git a/tests/test_notification.py b/tests/test_notification.py
index fddb88c2..ae5ea2cf 100644
--- a/tests/test_notification.py
+++ b/tests/test_notification.py
@@ -14,7 +14,7 @@ from django.test import Client
from combo.data.models import Page
from combo.apps.notifications.models import Notification, NotificationsCell
-from combo.apps.lingo.models import Regie, ActiveItems
+from combo.apps.lingo.models import Regie, ActiveItems, PaymentBackend
pytestmark = pytest.mark.django_db
@@ -28,6 +28,11 @@ def login(user):
@pytest.fixture
def regie():
+ try:
+ payment_backend = PaymentBackend.objects.get(slug='test1')
+ except PaymentBackend.DoesNotExist:
+ payment_backend = PaymentBackend.objects.create(
+ label='test1', slug='test1', service='dummy')
try:
regie = Regie.objects.get(slug='remote')
except Regie.DoesNotExist:
@@ -36,7 +41,7 @@ def regie():
regie.slug = 'remote'
regie.description = 'remote'
regie.payment_min_amount = Decimal(2.0)
- regie.service = 'dummy'
+ regie.payment_backend = payment_backend
regie.save()
return regie