0004-lingo-make-manager-views-compliant-with-PaymentBacke.patch
combo/apps/lingo/manager_views.py | ||
---|---|---|
27 | 27 | |
28 | 28 |
import eopayment |
29 | 29 | |
30 |
from .models import Regie, Transaction |
|
30 |
from .models import PaymentBackend, Regie, Transaction
|
|
31 | 31 | |
32 | 32 |
class RegieListView(ListView): |
33 | 33 |
model = Regie |
... | ... | |
55 | 55 |
success_url = reverse_lazy('lingo-manager-regie-list') |
56 | 56 | |
57 | 57 | |
58 |
class PaymentBackendListView(ListView): |
|
59 |
model = PaymentBackend |
|
60 | ||
61 | ||
62 |
class PaymentBackendCreateView(CreateView): |
|
63 |
model = PaymentBackend |
|
64 |
fields = '__all__' |
|
65 |
success_url = reverse_lazy('lingo-manager-paymentbackend-list') |
|
66 | ||
67 | ||
68 |
class PaymentBackendUpdateView(UpdateView): |
|
69 |
model = PaymentBackend |
|
70 |
fields = '__all__' |
|
71 |
success_url = reverse_lazy('lingo-manager-paymentbackend-list') |
|
72 | ||
73 | ||
74 |
class PaymentBackendDeleteView(DeleteView): |
|
75 |
model = PaymentBackend |
|
76 |
success_url = reverse_lazy('lingo-manager-paymentbackend-list') |
|
77 | ||
78 | ||
58 | 79 |
class TransactionListView(ListView): |
59 | 80 |
model = Transaction |
60 | 81 |
paginate_by = 10 |
combo/apps/lingo/templates/lingo/paymentbackend_confirm_delete.html | ||
---|---|---|
1 |
{% extends "combo/manager_base.html" %} |
|
2 |
{% load i18n %} |
|
3 | ||
4 |
{% block appbar %} |
|
5 |
<h2>{{ view.model.get_verbose_name }}</h2> |
|
6 |
{% endblock %} |
|
7 | ||
8 |
{% block content %} |
|
9 |
<form method="post"> |
|
10 |
{% csrf_token %} |
|
11 |
{% blocktrans %}Are you sure you want to delete this ?{% endblocktrans %} |
|
12 |
<div class="buttons"> |
|
13 |
<button class="delete-button">{% trans 'Delete' %}</button> |
|
14 |
<a class="cancel" href="{% url 'lingo-manager-paymentbackend-list' %}">{% trans 'Cancel' %}</a> |
|
15 |
</div> |
|
16 |
</form> |
|
17 |
{% endblock %} |
combo/apps/lingo/templates/lingo/paymentbackend_form.html | ||
---|---|---|
1 |
{% extends "lingo/paymentbackend_list.html" %} |
|
2 |
{% load i18n %} |
|
3 | ||
4 |
{% block appbar %} |
|
5 |
{% if object.id %} |
|
6 |
<h2>{% trans "Edit Payment backend" %}</h2> |
|
7 |
{% else %} |
|
8 |
<h2>{% trans "New Payment backend" %}</h2> |
|
9 |
{% endif %} |
|
10 |
{% endblock %} |
|
11 | ||
12 |
{% block content %} |
|
13 | ||
14 |
<form method="post" enctype="multipart/form-data"> |
|
15 |
{% csrf_token %} |
|
16 |
{{ form.as_p }} |
|
17 |
<div class="buttons"> |
|
18 |
<button class="submit-button">{% trans "Save" %}</button> |
|
19 |
<a class="cancel" href="{% url 'lingo-manager-homepage' %}">{% trans 'Cancel' %}</a> |
|
20 |
</div> |
|
21 |
</form> |
|
22 |
{% endblock %} |
combo/apps/lingo/templates/lingo/paymentbackend_list.html | ||
---|---|---|
1 |
{% extends "lingo/manager_base.html" %} |
|
2 |
{% load i18n %} |
|
3 | ||
4 |
{% block appbar %} |
|
5 |
<h2>{% trans 'Payment backends' %}</h2> |
|
6 |
<span class="actions"> |
|
7 |
<a rel="popup" href="{% url 'lingo-manager-paymentbackend-add' %}">{% trans 'New' %}</a> |
|
8 |
</span> |
|
9 |
{% endblock %} |
|
10 | ||
11 |
{% block breadcrumb %} |
|
12 |
{{ block.super }} |
|
13 |
<a href="{% url 'lingo-manager-paymentbackend-list' %}">{% trans 'Payment backends' %}</a> |
|
14 |
{% endblock %} |
|
15 | ||
16 |
{% block content %} |
|
17 | ||
18 |
{% if object_list %} |
|
19 |
<ul class="objects-list single-links"> |
|
20 |
{% for payment_backend in object_list %} |
|
21 |
<li> |
|
22 |
<a href="{% url 'lingo-manager-paymentbackend-edit' pk=payment_backend.id %}">{{ payment_backend.label }} |
|
23 |
<span>({{payment_backend.service}})</span> |
|
24 |
</a> |
|
25 |
<a rel="popup" class="delete" href="{% url 'lingo-manager-paymentbackend-delete' pk=payment_backend.id %}">{% trans "remove" %}</a> |
|
26 |
</li> |
|
27 |
{% endfor %} |
|
28 |
</ul> |
|
29 |
{% else %} |
|
30 |
<div class="big-msg-info"> |
|
31 |
{% blocktrans %} |
|
32 |
This site doesn't have any payment backend yet. Click on the "New" button in the top |
|
33 |
right of the page to add a first one. |
|
34 |
{% endblocktrans %} |
|
35 |
</div> |
|
36 |
{% endif %} |
|
37 | ||
38 |
{% endblock %} |
combo/apps/lingo/templates/lingo/transaction_list.html | ||
---|---|---|
4 | 4 |
{% block appbar %} |
5 | 5 |
<h2>{% trans 'Transactions' %}</h2> |
6 | 6 |
<span class="actions"> |
7 |
<a href="{% url 'lingo-manager-paymentbackend-list' %}">{% trans 'Payment backends' %}</a> |
|
7 | 8 |
<a href="{% url 'lingo-manager-regie-list' %}">{% trans 'Regies' %}</a> |
8 | 9 |
<a href="{% url 'lingo-manager-transactions-download' %}">{% trans 'download CSV' %}</a> |
9 | 10 |
</span> |
combo/apps/lingo/urls.py | ||
---|---|---|
23 | 23 |
RemoveBasketItemApiView, ValidateTransactionApiView, |
24 | 24 |
CancelTransactionApiView, SelfInvoiceView, BasketItemPayView) |
25 | 25 |
from .manager_views import (RegieListView, RegieCreateView, RegieUpdateView, |
26 |
RegieDeleteView, TransactionListView, download_transactions_csv) |
|
26 |
RegieDeleteView, TransactionListView, download_transactions_csv, |
|
27 |
PaymentBackendListView, PaymentBackendCreateView, |
|
28 |
PaymentBackendUpdateView, PaymentBackendDeleteView) |
|
27 | 29 | |
28 | 30 |
lingo_manager_urls = [ |
29 | 31 |
url('^$', TransactionListView.as_view(), name='lingo-manager-homepage'), |
... | ... | |
34 | 36 |
name='lingo-manager-regie-edit'), |
35 | 37 |
url(r'^regies/(?P<pk>\w+)/delete$', RegieDeleteView.as_view(), |
36 | 38 |
name='lingo-manager-regie-delete'), |
39 |
url('^paymentbackends/$', PaymentBackendListView.as_view(), |
|
40 |
name='lingo-manager-paymentbackend-list'), |
|
41 |
url('^paymentbackends/add/$', PaymentBackendCreateView.as_view(), |
|
42 |
name='lingo-manager-paymentbackend-add'), |
|
43 |
url(r'^paymentbackends/(?P<pk>\w+)/edit$', PaymentBackendUpdateView.as_view(), |
|
44 |
name='lingo-manager-paymentbackend-edit'), |
|
45 |
url(r'^paymentbackends/(?P<pk>\w+)/delete$', PaymentBackendDeleteView.as_view(), |
|
46 |
name='lingo-manager-paymentbackend-delete'), |
|
37 | 47 |
] |
38 | 48 | |
39 | 49 |
urlpatterns = [ |
tests/test_lingo_cells.py | ||
---|---|---|
10 | 10 | |
11 | 11 |
from combo.data.models import Page |
12 | 12 |
from combo.apps.lingo.models import Regie, BasketItem, Transaction |
13 |
from combo.apps.lingo.models import (LingoBasketCell, |
|
13 |
from combo.apps.lingo.models import (LingoBasketCell, PaymentBackend,
|
|
14 | 14 |
LingoRecentTransactionsCell, LingoBasketLinkCell, TipiPaymentFormCell) |
15 | 15 | |
16 | 16 |
pytestmark = pytest.mark.django_db |
... | ... | |
25 | 25 | |
26 | 26 |
@pytest.fixture |
27 | 27 |
def regie(): |
28 |
try: |
|
29 |
payment_backend = PaymentBackend.objects.get(slug='test1') |
|
30 |
except PaymentBackend.DoesNotExist: |
|
31 |
payment_backend = PaymentBackend.objects.create( |
|
32 |
label='test1', slug='test1') |
|
28 | 33 |
try: |
29 | 34 |
regie = Regie.objects.get(slug='test') |
30 | 35 |
except Regie.DoesNotExist: |
... | ... | |
32 | 37 |
regie.label = 'Test' |
33 | 38 |
regie.slug = 'test' |
34 | 39 |
regie.description = 'test' |
40 |
regie.payment_backend = payment_backend |
|
35 | 41 |
regie.save() |
36 | 42 |
return regie |
37 | 43 |
tests/test_lingo_manager.py | ||
---|---|---|
10 | 10 | |
11 | 11 |
import eopayment |
12 | 12 |
from combo.data.models import Page |
13 |
from combo.apps.lingo.models import Regie, BasketItem, Transaction, ActiveItems, TipiPaymentFormCell |
|
13 |
from combo.apps.lingo.models import (Regie, BasketItem, Transaction, ActiveItems, |
|
14 |
TipiPaymentFormCell, PaymentBackend) |
|
14 | 15 |
from decimal import Decimal |
15 | 16 | |
16 | 17 |
pytestmark = pytest.mark.django_db |
17 | 18 | |
18 | 19 | |
20 |
@pytest.fixture |
|
21 |
def payment_backend(): |
|
22 |
return PaymentBackend.objects.create( |
|
23 |
label='test1', slug='test1', service='dummy', service_options={'siret': '1234'}) |
|
24 | ||
25 | ||
19 | 26 |
def login(app, username='admin', password='admin'): |
20 | 27 |
login_page = app.get('/login/') |
21 | 28 |
login_form = login_page.forms[0] |
... | ... | |
30 | 37 |
resp = app.get('/manage/', status=200) |
31 | 38 |
assert '/manage/lingo/' in resp.text |
32 | 39 | |
33 |
def test_add_regie(app, admin_user): |
|
40 |
def test_add_regie(app, admin_user, payment_backend):
|
|
34 | 41 |
Regie.objects.all().delete() |
35 | 42 |
app = login(app) |
36 | 43 |
resp = app.get('/manage/lingo/regies/', status=200) |
... | ... | |
38 | 45 |
resp.forms[0]['label'] = 'Test' |
39 | 46 |
resp.forms[0]['slug'] = 'test' |
40 | 47 |
resp.forms[0]['description'] = 'description' |
41 |
resp.forms[0]['service'] = 'dummy'
|
|
48 |
resp.forms[0]['payment_backend'] = payment_backend.pk
|
|
42 | 49 |
assert resp.form['is_default'].checked is True |
43 | 50 |
resp = resp.forms[0].submit() |
44 | 51 |
assert resp.location.endswith('/manage/lingo/regies/') |
... | ... | |
47 | 54 |
assert regie.label == 'Test' |
48 | 55 |
assert regie.is_default is True |
49 | 56 | |
50 |
def test_edit_regie(app, admin_user): |
|
51 |
test_add_regie(app, admin_user) |
|
57 |
def test_edit_regie(app, admin_user, payment_backend):
|
|
58 |
test_add_regie(app, admin_user, payment_backend)
|
|
52 | 59 |
app = login(app) |
53 | 60 |
resp = app.get('/manage/lingo/regies/', status=200) |
54 | 61 |
resp = resp.click('Test') |
... | ... | |
59 | 66 |
regie = Regie.objects.all()[0] |
60 | 67 |
assert regie.description == 'other description' |
61 | 68 | |
62 |
def test_delete_regie(app, admin_user): |
|
63 |
test_add_regie(app, admin_user) |
|
69 |
def test_delete_regie(app, admin_user, payment_backend):
|
|
70 |
test_add_regie(app, admin_user, payment_backend)
|
|
64 | 71 |
app = login(app) |
65 | 72 |
resp = app.get('/manage/lingo/regies/', status=200) |
66 | 73 |
resp = resp.click('remove') |
67 | 74 |
assert 'Are you sure you want to delete this?' in resp.text |
68 | 75 |
resp = resp.forms[0].submit() |
69 |
assert resp.location.endswith('/manage/lingo/regies/') |
|
70 | 76 |
assert Regie.objects.count() == 0 |
71 | 77 | |
72 |
def test_add_second_regie(app, admin_user): |
|
73 |
test_add_regie(app, admin_user) |
|
78 |
def test_add_second_regie(app, admin_user, payment_backend):
|
|
79 |
test_add_regie(app, admin_user, payment_backend)
|
|
74 | 80 |
regie = Regie.objects.all()[0] |
75 | 81 | |
76 | 82 |
app = login(app) |
... | ... | |
79 | 85 |
resp.forms[0]['label'] = 'Test2' |
80 | 86 |
resp.forms[0]['slug'] = 'test2' |
81 | 87 |
resp.forms[0]['description'] = 'description' |
82 |
resp.forms[0]['service'] = 'dummy'
|
|
88 |
resp.forms[0]['payment_backend'] = payment_backend.pk
|
|
83 | 89 |
assert resp.form['is_default'].checked is False |
84 | 90 |
resp = resp.forms[0].submit() |
85 | 91 |
assert resp.location.endswith('/manage/lingo/regies/') |
... | ... | |
88 | 94 |
assert Regie.objects.get(id=regie.id).is_default is True |
89 | 95 |
assert Regie.objects.exclude(id=regie.id)[0].is_default is False |
90 | 96 | |
91 |
def test_download_transaction(app, admin_user): |
|
92 |
test_add_regie(app, admin_user) |
|
97 |
def test_download_transaction(app, admin_user, payment_backend):
|
|
98 |
test_add_regie(app, admin_user, payment_backend)
|
|
93 | 99 |
regie = Regie.objects.filter(slug='test')[0] |
94 | 100 |
user = User.objects.create_user('dimebag', 'dime@bag.pan', 'pwd') |
95 | 101 |
user.last_name = u'Darëll' |
... | ... | |
164 | 170 |
assert resp.text.count('ROLDEB:') == 1 |
165 | 171 |
assert resp.text.count('ROLDET:') == 1 |
166 | 172 | |
167 |
def test_configure_invoices_cell(app, admin_user): |
|
173 |
def test_configure_invoices_cell(app, admin_user, payment_backend):
|
|
168 | 174 |
page = Page(title='xxx', slug='test', template_name='standard') |
169 | 175 |
page.save() |
170 | 176 | |
... | ... | |
179 | 185 |
regie.label = 'Test' |
180 | 186 |
regie.slug = 'test' |
181 | 187 |
regie.description = 'test' |
188 |
regie.payment_backend = payment_backend |
|
182 | 189 |
regie.save() |
183 | 190 | |
184 | 191 |
resp = app.get('/manage/pages/%s/' % page.id, status=200) |
... | ... | |
202 | 209 |
regie2.slug = 'test2' |
203 | 210 |
regie2.description = 'test2' |
204 | 211 |
regie2.webservice_url = 'http://example.net/' |
212 |
regie2.payment_backend = payment_backend |
|
205 | 213 |
regie2.save() |
206 | 214 | |
207 | 215 |
resp = app.get('/manage/pages/%s/' % page.id, status=200) |
... | ... | |
215 | 223 |
resp.form['clingo_activeitems-%s-regie' % cell.id].value = 'test2' |
216 | 224 |
resp.form.submit() |
217 | 225 |
assert ActiveItems.objects.get(id=cell.id).regie == regie2.slug |
226 | ||
227 | ||
228 |
def test_payment_backend_list(app, admin_user): |
|
229 |
PaymentBackend.objects.create(label='label1', slug='slug1') |
|
230 |
PaymentBackend.objects.create(label='label2', slug='slug2') |
|
231 |
app = login(app) |
|
232 |
resp = app.get('/manage/lingo/paymentbackends/', status=200) |
|
233 | ||
234 |
assert '/manage/lingo/paymentbackends/add' in resp.text |
|
235 |
assert 'label1' in resp.content |
|
236 |
assert 'label2' in resp.content |
|
237 | ||
238 |
for payment_backend in PaymentBackend.objects.all(): |
|
239 |
assert '/manage/lingo/paymentbackends/%s' % payment_backend.pk in resp.text |
|
240 |
assert '/manage/lingo/paymentbackends/%s/delete' % payment_backend.pk in resp.text |
|
241 | ||
242 | ||
243 |
def test_add_payment_backend(app, admin_user): |
|
244 |
assert not PaymentBackend.objects.count() |
|
245 |
app = login(app) |
|
246 |
resp = app.get('/manage/lingo/paymentbackends/add/', status=200) |
|
247 |
resp.forms[0]['label'] = 'Test' |
|
248 |
resp.forms[0]['slug'] = 'test-add' |
|
249 |
resp.forms[0]['service'] = 'dummy' |
|
250 |
resp.forms[0]['service_options'] = '{"siret": "1234"}' |
|
251 |
resp = resp.forms[0].submit() |
|
252 | ||
253 |
assert PaymentBackend.objects.count() == 1 |
|
254 |
payment_backend = PaymentBackend.objects.get(slug='test-add') |
|
255 |
assert payment_backend.label == 'Test' |
|
256 |
assert payment_backend.service_options == {'siret': '1234'} |
|
257 | ||
258 |
assert resp.location.endswith('/manage/lingo/paymentbackends/') |
|
259 | ||
260 | ||
261 |
def test_edit_payment_backend(app, admin_user): |
|
262 |
payment_backend = PaymentBackend.objects.create(label='label1', slug='slug1') |
|
263 |
app = login(app) |
|
264 |
resp = app.get('/manage/lingo/paymentbackends/%s/edit' % payment_backend.pk, status=200) |
|
265 | ||
266 |
resp.forms[0]['label'] = 'label1-modified' |
|
267 |
resp.forms[0]['slug'] = 'slug1' |
|
268 |
resp.forms[0]['service'] = 'dummy' |
|
269 |
resp.forms[0]['service_options'] = '{"siret": "1234"}' |
|
270 |
resp = resp.forms[0].submit() |
|
271 | ||
272 |
assert resp.location.endswith('/manage/lingo/paymentbackends/') |
|
273 |
payment_backend = PaymentBackend.objects.get(slug='slug1') |
|
274 |
assert payment_backend.label == 'label1-modified' |
tests/test_notification.py | ||
---|---|---|
14 | 14 | |
15 | 15 |
from combo.data.models import Page |
16 | 16 |
from combo.apps.notifications.models import Notification, NotificationsCell |
17 |
from combo.apps.lingo.models import Regie, ActiveItems |
|
17 |
from combo.apps.lingo.models import Regie, ActiveItems, PaymentBackend
|
|
18 | 18 | |
19 | 19 |
pytestmark = pytest.mark.django_db |
20 | 20 | |
... | ... | |
28 | 28 | |
29 | 29 |
@pytest.fixture |
30 | 30 |
def regie(): |
31 |
try: |
|
32 |
payment_backend = PaymentBackend.objects.get(slug='test1') |
|
33 |
except PaymentBackend.DoesNotExist: |
|
34 |
payment_backend = PaymentBackend.objects.create( |
|
35 |
label='test1', slug='test1', service='dummy') |
|
31 | 36 |
try: |
32 | 37 |
regie = Regie.objects.get(slug='remote') |
33 | 38 |
except Regie.DoesNotExist: |
... | ... | |
36 | 41 |
regie.slug = 'remote' |
37 | 42 |
regie.description = 'remote' |
38 | 43 |
regie.payment_min_amount = Decimal(2.0) |
39 |
regie.service = 'dummy'
|
|
44 |
regie.payment_backend = payment_backend
|
|
40 | 45 |
regie.save() |
41 | 46 |
return regie |
42 | 47 | |
43 |
- |