lingo: filter transaction list by regie (#56651)

This commit is contained in:
Lauréline Guérin 2021-10-01 15:30:09 +02:00
parent f765f0be8a
commit 54c277a36e
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
4 changed files with 53 additions and 14 deletions

View File

@ -152,3 +152,12 @@ class TransactionExportForm(forms.Form):
today = datetime.date.today() today = datetime.date.today()
self.initial['start_date'] = today - datetime.timedelta(days=30) self.initial['start_date'] = today - datetime.timedelta(days=30)
self.initial['end_date'] = today self.initial['end_date'] = today
class TransactionSearchForm(forms.Form):
regie = forms.ModelChoiceField(queryset=Regie.objects.none(), empty_label=_('All regies'), required=False)
q = forms.CharField(required=False)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['regie'].queryset = Regie.objects.all()

View File

@ -30,7 +30,7 @@ from django.utils.timezone import make_aware, now
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, DeleteView, ListView, UpdateView, View from django.views.generic import CreateView, DeleteView, ListView, UpdateView, View
from .forms import PaymentBackendForm, RegieForm, TransactionExportForm from .forms import PaymentBackendForm, RegieForm, TransactionExportForm, TransactionSearchForm
from .models import BasketItem, PaymentBackend, Regie, Transaction from .models import BasketItem, PaymentBackend, Regie, Transaction
@ -97,16 +97,23 @@ class TransactionListView(ListView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['query'] = self.request.GET.get('q') or '' context['query'] = self.request.GET.get('q') or ''
context['form'] = self.form
return context return context
def get_queryset(self): def get_queryset(self):
self.form = TransactionSearchForm(data=self.request.GET)
qs = ( qs = (
Transaction.objects.select_related('user') Transaction.objects.select_related('user')
.prefetch_related(Prefetch('items', to_attr='prefetched_items')) .prefetch_related(Prefetch('items', to_attr='prefetched_items'))
.filter(status__in=(eopayment.PAID, eopayment.ACCEPTED)) .filter(status__in=(eopayment.PAID, eopayment.ACCEPTED))
.order_by('-start_date') .order_by('-start_date')
) )
query = self.request.GET.get('q') query, regie = None, None
if self.form.is_valid():
query = self.form.cleaned_data['q']
regie = self.form.cleaned_data['regie']
if regie:
qs = qs.filter(regie=regie)
if query: if query:
try: try:
date = date_parser.parse(query, dayfirst=True) date = date_parser.parse(query, dayfirst=True)

View File

@ -14,7 +14,8 @@
{% block content %} {% block content %}
<form> <form>
<p><input name="q" type="search" value="{{query}}"> <button>{% trans 'Search' %}</button> <p>
{{ form.regie }} <input name="q" type="search" value="{{ form.cleaned_data.q }}"> <button>{% trans 'Search' %}</button>
<span class="help_text">{% trans "(supports order identifiers, transaction identifiers, and dates)" %}</span> <span class="help_text">{% trans "(supports order identifiers, transaction identifiers, and dates)" %}</span>
</p> </p>
</form> </form>
@ -55,14 +56,10 @@
{% else %} {% else %}
<div class="big-msg-info"> <div class="big-msg-info">
{% if query %} {% if form.cleaned_data.q or form.cleaned_data.regie %}
{% blocktrans %} {% trans "No transactions found matching the current search." %}
No transactions found matching "{{query}}".
{% endblocktrans %}
{% else %} {% else %}
{% blocktrans %} {% trans "This site doesn't have any transaction yet." %}
This site doesn't have any transaction yet.
{% endblocktrans %}
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}

View File

@ -233,20 +233,26 @@ def test_download_transaction(app, admin_user, regie):
assert Decimal(row[6]) == b_item.amount assert Decimal(row[6]) == b_item.amount
def test_transactions_search(app, admin_user): def test_transactions_search(app, admin_user, payment_backend, regie):
regie2 = Regie.objects.create(label='Test-2', slug='regie-2', payment_backend=payment_backend)
for i in range(50): for i in range(50):
Transaction( transaction = Transaction(
status=eopayment.PAID, status=eopayment.PAID,
order_id='order id %s' % (i + 1), order_id='order id %s' % (i + 1),
bank_transaction_id='bank id %s' % (i + 1), bank_transaction_id='bank id %s' % (i + 1),
amount=1 + i, amount=1 + i,
).save() )
if i % 3 == 0:
transaction.regie = regie
elif i % 3 == 1:
transaction.regie = regie2
transaction.save()
app = login(app) app = login(app)
with CaptureQueriesContext(connection) as ctx: with CaptureQueriesContext(connection) as ctx:
resp = app.get('/manage/lingo/', status=200) resp = app.get('/manage/lingo/', status=200)
assert resp.text.count('<tr') == 11 assert resp.text.count('<tr') == 11
assert len(ctx.captured_queries) == 5 assert len(ctx.captured_queries) == 6
resp.form['q'] = 'order id 16' resp.form['q'] = 'order id 16'
resp = resp.form.submit() resp = resp.form.submit()
@ -261,6 +267,26 @@ def test_transactions_search(app, admin_user):
assert resp.text.count('<tr') == 0 assert resp.text.count('<tr') == 0
assert 'No transactions found matching' in resp.text assert 'No transactions found matching' in resp.text
resp.form['q'] = ''
resp.form['regie'] = regie.pk
resp = resp.form.submit()
assert resp.text.count('<tr') == 11
resp.form['q'] = ''
resp.form['regie'] = regie2.pk
resp = resp.form.submit()
assert resp.text.count('<tr') == 11
resp.form['q'] = 'order id 5'
resp.form['regie'] = regie.pk
resp = resp.form.submit()
assert resp.text.count('<tr') == 0
resp.form['q'] = 'order id 5'
resp.form['regie'] = regie2.pk
resp = resp.form.submit()
assert resp.text.count('<tr') == 2
def test_basketitem_error_list(app, admin_user, payment_backend): def test_basketitem_error_list(app, admin_user, payment_backend):
regie = Regie.objects.create(label='test-regie', slug='test-regie', payment_backend=payment_backend) regie = Regie.objects.create(label='test-regie', slug='test-regie', payment_backend=payment_backend)