lingo: add support for filtering transaction list (#11297)

This commit is contained in:
Frédéric Péters 2017-11-15 12:04:55 +04:00
parent 029271b2a6
commit b4a7305ba9
3 changed files with 60 additions and 3 deletions

View File

@ -15,8 +15,12 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import csv
import datetime
from dateutil import parser as date_parser
from django.core.urlresolvers import reverse_lazy
from django.db.models import Q
from django.utils.timezone import make_aware
from django.views.generic import (CreateView, UpdateView, ListView,
DeleteView, TemplateView)
from django.http import HttpResponse
@ -55,9 +59,23 @@ class TransactionListView(ListView):
model = Transaction
paginate_by = 10
def get_context_data(self, **kwargs):
context = super(TransactionListView, self).get_context_data(**kwargs)
context['query'] = self.request.GET.get('q') or ''
return context
def get_queryset(self):
return Transaction.objects.filter(
qs = Transaction.objects.filter(
status__in=(eopayment.PAID, eopayment.ACCEPTED)).order_by('-start_date')
query = self.request.GET.get('q')
if query:
try:
date = date_parser.parse(query)
date = make_aware(date)
qs = qs.filter(start_date__gte=date, start_date__lt=date + datetime.timedelta(days=1))
except ValueError:
qs = qs.filter(Q(order_id=query) | Q(bank_transaction_id=query))
return qs
def download_transactions_csv(request):

View File

@ -13,6 +13,12 @@
{% block content %}
<form>
<p><input name="q" type="search" value="{{query}}"> <button>{% trans 'Search' %}</button>
<span class="help_text">{% trans "(supports order identifiers, transaction identifiers, and dates)" %}</span>
</p>
</form>
{% if object_list %}
<table class="main">
<thead>
@ -45,7 +51,7 @@
{% if is_paginated %}
<p class="paginator">
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}">&lt;&lt;</a>
<a href="?page={{ page_obj.previous_page_number }}&q={{ query|iriencode }}">&lt;&lt;</a>
{% else %}
<span>&lt;&lt;</span>
{% endif %}
@ -57,7 +63,7 @@
&nbsp;
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">&gt;&gt;</a>
<a href="?page={{ page_obj.next_page_number }}&q={{ query|iriencode }}">&gt;&gt;</a>
{% else %}
<span>&gt;&gt;</span>
{% endif %}
@ -68,9 +74,15 @@
</div>
{% else %}
<div class="big-msg-info">
{% if query %}
{% blocktrans %}
No transactions found matching "{{query}}".
{% endblocktrans %}
{% else %}
{% blocktrans %}
This site doesn't have any transaction yet.
{% endblocktrans %}
{% endif %}
</div>
{% endif %}

View File

@ -1,7 +1,10 @@
# -*- coding: utf-8 -*-
import datetime
from django.contrib.auth.models import User
from django.core.wsgi import get_wsgi_application
from django.utils.timezone import now
from webtest import TestApp
import pytest
@ -128,6 +131,30 @@ def test_download_transaction(app, admin_user):
assert row[5] == b_item.subject
assert Decimal(row[6]) == b_item.amount
def test_transactions_search(app, admin_user):
for i in range(50):
Transaction(status=eopayment.PAID,
order_id='order id %s' % (i+1),
bank_transaction_id='bank id %s' % (i+1),
amount=1+i).save()
app = login(app)
resp = app.get('/manage/lingo/transactions/', status=200)
assert resp.body.count('<tr') == 11
resp.form['q'] = 'order id 16'
resp = resp.form.submit()
assert resp.body.count('<tr') == 2
resp.form['q'] = now().strftime('%d/%m/%Y')
resp = resp.form.submit()
assert resp.body.count('<tr') == 11
resp.form['q'] = (now() + datetime.timedelta(days=2)).strftime('%d/%m%/Y')
resp = resp.form.submit()
assert resp.body.count('<tr') == 0
assert 'No transactions found matching' in resp.body
def test_configure_invoices_cell(app, admin_user):
page = Page(title='xxx', slug='test', template_name='standard')
page.save()