lingo: add active invoices page url in invoice payment form (#22607)

This commit is contained in:
Serghei Mihai 2018-04-03 14:17:24 +02:00
parent 9d896b4188
commit dbd744e3d2
4 changed files with 47 additions and 5 deletions

View File

@ -51,6 +51,7 @@
<input type="hidden" name="regie" value="{{ regie.pk }}"/>
<input type="hidden" name="item" value="{{ item.id }}"/>
<input type="hidden" name="next_url" value="{{ page.get_online_url }}" />
{% if item_url %}
<input type="hidden" name="item_url" value="{{ item_url }}"/>
{% endif %}

View File

@ -27,7 +27,7 @@
</td>
{% if item.regie.is_remote %}
<td>
<a href="{% url 'view-item' regie_id=item.regie.pk item_crypto_id=item.crypto_id %}" rel="popup" class="icon-view">{% trans "View" %}
<a href="{% url 'view-item' regie_id=item.regie.pk item_crypto_id=item.crypto_id %}?page={{ cell.page.pk }}" rel="popup" class="icon-view">{% trans "View" %}
{% if item.online_payment and item.amount >= item.regie.payment_min_amount %}{% trans "and pay" %}{% endif %}
</a>
{% if item.has_pdf %}

View File

@ -38,6 +38,7 @@ from django.utils.encoding import smart_text
import eopayment
from combo.data.models import Page
from combo.utils import check_request_signature, aes_hex_decrypt, DecryptionError
if 'mellon' in settings.INSTALLED_APPS:
@ -603,6 +604,11 @@ class ItemView(TemplateView):
item = regie.get_invoice(self.request.user, item_id)
if not item:
raise Http404(_('No item was found.'))
if self.request.GET.get('page'):
try:
ret['page'] = Page.objects.get(pk=self.request.GET['page'])
except (Page.DoesNotExist, ValueError):
pass
ret.update({'item': item, 'regie': regie})
return ret

View File

@ -105,6 +105,7 @@ def test_remote_regie_active_invoices_cell(mock_request, remote_regie):
assert 'F-2016-One' in content
assert '123.45' in content
assert '?page=%s' % page.pk in content
# check if regie webservice has been correctly called
assert mock_request.call_args[0][0] == 'GET'
url = mock_request.call_args[0][1]
@ -293,19 +294,21 @@ def test_self_declared_invoice(mock_get, app, remote_regie):
@mock.patch('combo.apps.lingo.models.requests.get')
@mock.patch('combo.apps.lingo.models.requests.post')
def test_remote_item_payment_failure(mock_post, mock_get, mock_pay_invoice, app, remote_regie):
page = Page(title='xxx', slug='active-remote-invoices-page', template_name='standard')
page.save()
assert remote_regie.is_remote()
encrypt_id = aes_hex_encrypt(settings.SECRET_KEY, 'F201601')
mock_json = mock.Mock()
mock_json.json.return_value = {'err': 0, 'data': INVOICES[0]}
mock_get.return_value = mock_json
mock_pay_invoice.return_value = mock.Mock(status_code=200)
resp = app.get('/lingo/item/%s/%s/' % (remote_regie.id, encrypt_id))
resp = app.get('/lingo/item/%s/%s/?page=%s' % (remote_regie.id, encrypt_id, page.pk))
form = resp.form
assert 'email' in form.fields
assert form['email'].value == ''
assert 'item_url' in form.fields
assert form['item_url'].value == '/lingo/item/%s/%s/' % (remote_regie.id, encrypt_id)
assert form['item_url'].value == '/lingo/item/%s/%s/?page=%s' % (remote_regie.id, encrypt_id, page.pk)
assert 'item' in form.fields
assert form['item'].value == 'F201601'
assert 'regie' in form.fields
@ -325,11 +328,11 @@ def test_remote_item_payment_failure(mock_post, mock_get, mock_pay_invoice, app,
# make sure return url is the user return URL
assert urlparse.urlparse(qs['return_url'][0]).path.startswith(
reverse('lingo-return', kwargs={'regie_pk': remote_regie.id}))
# simulate successful return URL
# simulate payment failure
mock_get.side_effect = ConnectionError('where is my hostname?')
resp = app.get(qs['return_url'][0], params=args)
assert resp.status_code == 302
assert urlparse.urlparse(resp.url).path == '/'
assert urlparse.urlparse(resp.url).path == '/active-remote-invoices-page/'
# simulate successful call to callback URL
resp = app.get(reverse('lingo-callback', kwargs={'regie_pk': remote_regie.id}), params=args)
trans = Transaction.objects.all()
@ -349,6 +352,38 @@ def test_remote_item_payment_failure(mock_post, mock_get, mock_pay_invoice, app,
call_command('update_transactions')
@mock.patch('combo.apps.lingo.models.Regie.pay_invoice')
@mock.patch('combo.apps.lingo.models.requests.get')
def test_remote_invoice_successfull_payment_redirect(mock_get, mock_pay_invoice, app, remote_regie):
page = Page(title='xxx', slug='active-remote-invoices-page', template_name='standard')
page.save()
assert remote_regie.is_remote()
encrypt_id = aes_hex_encrypt(settings.SECRET_KEY, 'F201601')
mock_json = mock.Mock()
mock_json.json.return_value = {'err': 0, 'data': INVOICES[0]}
mock_get.return_value = mock_json
mock_pay_invoice.return_value = mock.Mock(status_code=200)
resp = app.get('/lingo/item/%s/%s/?page=%s' % (remote_regie.id, encrypt_id, page.pk))
form = resp.form
assert form['next_url'].value == '/active-remote-invoices-page/'
form['email'] = 'test@example.net'
resp = form.submit()
assert resp.status_code == 302
location = resp.location
assert 'dummy-payment' in location
parsed = urlparse.urlparse(location)
# get return_url and transaction id from location
qs = urlparse.parse_qs(parsed.query)
args = {'transaction_id': qs['transaction_id'][0], 'signed': True,
'ok': True, 'reason': 'Paid'}
resp = app.get(qs['return_url'][0], params=args)
assert resp.status_code == 302
assert urlparse.urlparse(resp.location).path == '/active-remote-invoices-page/'
@mock.patch('combo.apps.lingo.models.requests.get')
def test_send_new_remote_invoices_by_email(mock_get, admin, app, remote_regie, mailoutbox):
datetime_format = '%Y-%m-%dT%H:%M:%S'