0003-lingo-action-mark_as_notified-21626.patch
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 |
- |