Projet

Général

Profil

0003-lingo-action-mark_as_notified-21626.patch

Lauréline Guérin, 02 décembre 2019 10:26

Télécharger (7,7 ko)

Voir les différences:

Subject: [PATCH 3/3] lingo: action mark_as_notified (#21626)

 combo/apps/lingo/manager_views.py             | 18 ++++++-
 combo/apps/lingo/models.py                    |  5 +-
 .../lingo/basketitem_error_list.html          |  2 +
 combo/apps/lingo/urls.py                      |  4 +-
 tests/test_lingo_manager.py                   | 50 ++++++++++++++++++-
 5 files changed, 73 insertions(+), 6 deletions(-)
combo/apps/lingo/manager_views.py
18 18
import datetime
19 19
from dateutil import parser as date_parser
20 20

  
21
from django.core.urlresolvers import reverse
21 22
from django.core.urlresolvers import reverse_lazy
22 23
from django.db.models import Q
23 24
from django.db.models.expressions import RawSQL
24 25
from django.utils import six
25 26
from django.utils.timezone import make_aware, now
26
from django.views.generic import CreateView, UpdateView, ListView, DeleteView
27
from django.views.generic import CreateView, UpdateView, ListView, DeleteView, View
27 28
from django.http import HttpResponse
29
from django.http import HttpResponseRedirect
30
from django.shortcuts import get_object_or_404
28 31
from django.template.response import TemplateResponse
29 32

  
30 33
import eopayment
......
141 144
        return queryset1.union(queryset2).order_by('-creation_date')
142 145

  
143 146

  
147
class BasketItemMarkAsNotifiedView(View):
148
    def get(self, request, *args, **kwargs):
149
        item = get_object_or_404(
150
            BasketItem,
151
            pk=kwargs['item_id'],
152
            notification_date__isnull=True,
153
            cancellation_date__isnull=True,
154
            payment_date__lt=now() - datetime.timedelta(minutes=300))
155
        item.notify_payment(notify_origin=False)
156

  
157
        return HttpResponseRedirect(reverse('lingo-manager-payment-error-list'))
158

  
159

  
144 160
def download_transactions_csv(request):
145 161
    if request.method == 'POST':
146 162
        form = TransactionExportForm(data=request.POST)
combo/apps/lingo/models.py
373 373
                          data=json.dumps(message), headers=headers, timeout=15)
374 374
        r.raise_for_status()
375 375

  
376
    def notify_payment(self):
377
        self.notify('paid')
376
    def notify_payment(self, notify_origin=True):
377
        if notify_origin:
378
            self.notify('paid')
378 379
        self.notification_date = timezone.now()
379 380
        self.save()
380 381
        self.regie.compute_extra_fees(user=self.user)
combo/apps/lingo/templates/lingo/basketitem_error_list.html
34 34
  <td>
35 35
    {% if object.transaction_status != 99 %}
36 36
      <a href="{% url 'lingo-manager-homepage' %}?q={{ object.bank_transaction_id }}">{% trans "See transaction" %}</a>
37
      <br />
38
      <a href="{% url 'lingo-manager-basket-item-mark-as-notified' object.pk %}">{% trans "Mark as notified" %}</a>
37 39
    {% endif %}
38 40
  </td>
39 41
</tr>
combo/apps/lingo/urls.py
26 26
                            RegieDeleteView, TransactionListView, BasketItemErrorListView,
27 27
                            download_transactions_csv, PaymentBackendListView,
28 28
                            PaymentBackendCreateView, PaymentBackendUpdateView,
29
                            PaymentBackendDeleteView)
29
                            PaymentBackendDeleteView, BasketItemMarkAsNotifiedView)
30 30

  
31 31
lingo_manager_urls = [
32 32
    url('^$', TransactionListView.as_view(), name='lingo-manager-homepage'),
33 33
    url('^payments/error/$', BasketItemErrorListView.as_view(), name='lingo-manager-payment-error-list'),
34
    url(r'^item/(?P<item_id>\d+)/mark-as-notified/$',
35
        BasketItemMarkAsNotifiedView.as_view(), name='lingo-manager-basket-item-mark-as-notified'),
34 36
    url('^transactions/download-csv/$', download_transactions_csv, name='lingo-manager-transactions-download'),
35 37
    url('^regies/$', RegieListView.as_view(), name='lingo-manager-regie-list'),
36 38
    url('^regies/add/$', RegieCreateView.as_view(), name='lingo-manager-regie-add'),
tests/test_lingo_manager.py
3 3
import datetime
4 4

  
5 5
from django.contrib.auth.models import User
6
from django.core.wsgi import get_wsgi_application
7 6
from django.utils.timezone import now
8
from webtest import TestApp
7

  
8
import mock
9 9
import pytest
10 10

  
11 11
import eopayment
......
355 355
    assert '/manage/lingo/?q=%s' % transaction5.bank_transaction_id in resp.text
356 356
    assert '/manage/lingo/?q=%s' % transaction3.bank_transaction_id not in resp.text
357 357
    assert '/manage/lingo/?q=%s' % transaction22.bank_transaction_id not in resp.text
358
    assert '/manage/lingo/item/%s/mark-as-notified/' % item5.pk in resp.text
359
    assert '/manage/lingo/item/%s/mark-as-notified/' % item3.pk not in resp.text
360
    assert '/manage/lingo/item/%s/mark-as-notified/' % item2.pk not in resp.text
358 361

  
359 362

  
360 363
def test_basketitem_error_list_search(app, admin_user, payment_backend):
......
392 395
    assert list(resp.context['object_list']) == [item]
393 396

  
394 397

  
398
def test_basketitem_mark_as_notified(app, admin_user, payment_backend):
399
    regie = Regie.objects.create(
400
        label='test-regie', slug='test-regie', payment_backend=payment_backend)
401
    user = User.objects.create_user('dimebag', 'dime@bag.pan', 'pwd')
402

  
403
    date_now = now()
404
    date_in_past = date_now - datetime.timedelta(minutes=300)
405

  
406
    item = BasketItem.objects.create(
407
        user=user,
408
        regie=regie,
409
        subject='item',
410
        source_url='http://example.net/',
411
        amount=42,
412
        payment_date=date_in_past,
413
        notification_date=date_in_past)
414

  
415
    app = login(app)
416

  
417
    # notification_date is not None
418
    resp = app.get('/manage/lingo/item/%s/mark-as-notified/' % item.pk, status=404)
419
    # payment_date is not old enough
420
    item.notification_date = None
421
    item.payment_date = date_now
422
    item.save()
423
    resp = app.get('/manage/lingo/item/%s/mark-as-notified/' % item.pk, status=404)
424
    # cancellation_date is not None
425
    item.payment_date = date_in_past
426
    item.cancellation_date = date_now
427
    item.save()
428
    resp = app.get('/manage/lingo/item/%s/mark-as-notified/' % item.pk, status=404)
429

  
430
    # notification_date and cancellation_date are None, payment_date is old enough
431
    item.cancellation_date = None
432
    item.save()
433
    with mock.patch('combo.apps.lingo.models.BasketItem.notify') as mock_notify:
434
        resp = app.get('/manage/lingo/item/%s/mark-as-notified/' % item.pk, status=302)
435
    assert mock_notify.call_args_list == []
436
    assert resp.location.endswith('/manage/lingo/payments/error/')
437
    item.refresh_from_db()
438
    assert item.notification_date is not None
439

  
440

  
395 441
def test_configure_tipi_cell(app, admin_user):
396 442
    page = Page(title='tipi', slug='tipi', template_name='standard')
397 443
    page.save()
398
-