diff --git a/combo/apps/lingo/forms.py b/combo/apps/lingo/forms.py
index f19573ab..224b9e28 100644
--- a/combo/apps/lingo/forms.py
+++ b/combo/apps/lingo/forms.py
@@ -14,8 +14,11 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import datetime
+
from django import forms
+from django.utils.translation import ugettext_lazy as _
from .models import Regie
@@ -67,3 +70,20 @@ class RegieForm(forms.ModelForm):
)
instance.save()
return instance
+
+
+class TransactionExportForm(forms.Form):
+ start_date = forms.DateField(
+ label=_('Start date'),
+ widget=forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d')
+ )
+ end_date = forms.DateField(
+ label=_('End date'),
+ widget=forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d')
+ )
+
+ def __init__(self, *args, **kwargs):
+ super(TransactionExportForm, self).__init__(*args, **kwargs)
+ today = datetime.date.today()
+ self.initial['start_date'] = today - datetime.timedelta(days=30)
+ self.initial['end_date'] = today
diff --git a/combo/apps/lingo/manager_views.py b/combo/apps/lingo/manager_views.py
index d9a8e016..0dc5fd36 100644
--- a/combo/apps/lingo/manager_views.py
+++ b/combo/apps/lingo/manager_views.py
@@ -24,10 +24,12 @@ from django.utils import six
from django.utils.timezone import make_aware
from django.views.generic import CreateView, UpdateView, ListView, DeleteView
from django.http import HttpResponse
+from django.template.response import TemplateResponse
import eopayment
from .forms import RegieForm
+from .forms import TransactionExportForm
from .models import PaymentBackend, Regie, Transaction
@@ -102,21 +104,33 @@ class TransactionListView(ListView):
def download_transactions_csv(request):
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment; filename="transactions.csv"'
- writer = csv.writer(response)
- transactions = Transaction.objects.filter(
- status__in=(eopayment.PAID, eopayment.ACCEPTED)).order_by('-start_date')
- for transaction in transactions:
- row = [transaction.order_id,
- transaction.bank_transaction_id,
- transaction.start_date.strftime('%Y-%m-%d %H:%M:%S'),
- transaction.get_user_name(),
- str(transaction.amount)]
- for item in transaction.items.all():
- row.extend([item.subject, str(item.amount)])
- if six.PY3:
- writer.writerow([x for x in row])
- else:
- writer.writerow([unicode(x).encode('utf-8') for x in row])
- return response
+ if request.method == 'POST':
+ form = TransactionExportForm(data=request.POST)
+ if form.is_valid():
+ response = HttpResponse(content_type='text/csv')
+ response['Content-Disposition'] = 'attachment; filename="transactions.csv"'
+ writer = csv.writer(response)
+ transactions = (
+ Transaction.objects
+ .filter(
+ status__in=(eopayment.PAID, eopayment.ACCEPTED),
+ start_date__gte=form.cleaned_data['start_date'],
+ start_date__lte=form.cleaned_data['end_date'],
+ ).order_by('-start_date'))
+ for transaction in transactions:
+ row = [transaction.order_id,
+ transaction.bank_transaction_id,
+ transaction.start_date.strftime('%Y-%m-%d %H:%M:%S'),
+ transaction.get_user_name(),
+ str(transaction.amount)]
+ for item in transaction.items.all():
+ row.extend([item.subject, str(item.amount)])
+ if six.PY3:
+ writer.writerow([x for x in row])
+ else:
+ writer.writerow([unicode(x).encode('utf-8') for x in row])
+ return response
+ else:
+ form = TransactionExportForm()
+
+ return TemplateResponse(request, 'lingo/transaction_export.html', {'form': form})
diff --git a/combo/apps/lingo/templates/lingo/transaction_export.html b/combo/apps/lingo/templates/lingo/transaction_export.html
new file mode 100644
index 00000000..6724e4df
--- /dev/null
+++ b/combo/apps/lingo/templates/lingo/transaction_export.html
@@ -0,0 +1,17 @@
+{% extends "combo/manager_base.html" %}
+{% load i18n %}
+
+{% block appbar %}
+
{% trans "download CSV" %}
+{% endblock %}
+
+{% block content %}
+
+{% endblock %}
diff --git a/combo/apps/lingo/templates/lingo/transaction_list.html b/combo/apps/lingo/templates/lingo/transaction_list.html
index 67b62645..25300308 100644
--- a/combo/apps/lingo/templates/lingo/transaction_list.html
+++ b/combo/apps/lingo/templates/lingo/transaction_list.html
@@ -6,7 +6,7 @@
{% trans 'Payment backends' %}
{% trans 'Regies' %}
-{% trans 'download CSV' %}
+{% trans 'download CSV' %}
{% endblock %}
diff --git a/tests/test_lingo_manager.py b/tests/test_lingo_manager.py
index 4dccd3aa..34212420 100644
--- a/tests/test_lingo_manager.py
+++ b/tests/test_lingo_manager.py
@@ -149,6 +149,7 @@ def test_add_second_regie(app, admin_user, payment_backend):
assert Regie.objects.get(id=regie.id).is_default is True
assert Regie.objects.exclude(id=regie.id)[0].is_default is False
+
def test_download_transaction(app, admin_user, payment_backend):
test_add_regie(app, admin_user, payment_backend)
regie = Regie.objects.filter(slug='test')[0]
@@ -164,25 +165,43 @@ def test_download_transaction(app, admin_user, payment_backend):
trans2 = Transaction.objects.create(regie=regie, remote_items='remote items omg', order_id='2', user=user,
bank_transaction_id='136', status=eopayment.PAID)
trans1.items.set([b_item])
+ trans1.start_date = datetime.date(2019, 7, 29)
trans1.save()
trans2.items.set([b_item])
+ trans2.start_date = datetime.date(2019, 10, 1)
trans2.save()
app = login(app)
+
resp = app.get('/manage/lingo/transactions/download-csv/', status=200)
- content = [i for i in [item.split(',') for item in resp.text.split('\r\n')]]
- for row in content[:-1]:
- if row[0] == '2':
- assert row[1] == trans2.bank_transaction_id
- assert row[3] == '%s %s' % (user.first_name, user.last_name)
- assert Decimal(row[4]) == Decimal(trans2.amount)
- assert row[5] == b_item.subject
- assert Decimal(row[6]) == b_item.amount
- else:
- assert row[1] == trans1.bank_transaction_id
- assert row[3] == '%s %s' % (user.first_name, user.last_name)
- assert Decimal(row[4]) == Decimal(trans1.amount)
- assert row[5] == b_item.subject
- assert Decimal(row[6]) == b_item.amount
+ resp.forms[0]['start_date'] = datetime.date(2019, 10, 1)
+ resp.forms[0]['end_date'] = datetime.date(2019, 11, 1)
+ resp = resp.forms[0].submit()
+ content = [i for i in [item.split(',') for item in resp.text.split('\r\n')] if len(i) > 1]
+ assert len(content) == 1
+ row = content[0]
+ assert row[0] == '2'
+ assert row[1] == trans2.bank_transaction_id
+ assert row[3] == '%s %s' % (user.first_name, user.last_name)
+ assert Decimal(row[4]) == Decimal(trans2.amount)
+ assert row[5] == b_item.subject
+ assert Decimal(row[6]) == b_item.amount
+
+ resp = app.get('/manage/lingo/transactions/download-csv/', status=200)
+ resp.forms[0]['start_date'] = datetime.date(2019, 7, 1)
+ resp.forms[0]['end_date'] = datetime.date(2019, 11, 1)
+ resp = resp.forms[0].submit()
+ content = [i for i in [item.split(',') for item in resp.text.split('\r\n')] if len(i) > 1]
+ assert len(content) == 2
+ row = content[0]
+ assert row[0] == '2'
+ row = content[1]
+ assert row[0] == '1'
+ assert row[1] == trans1.bank_transaction_id
+ assert row[3] == '%s %s' % (user.first_name, user.last_name)
+ assert Decimal(row[4]) == Decimal(trans1.amount)
+ 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):