0001-lingo-export-transactions-between-2-dates-35988.patch
combo/apps/lingo/forms.py | ||
---|---|---|
14 | 14 |
# You should have received a copy of the GNU Affero General Public License |
15 | 15 |
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | 16 | |
17 |
import datetime |
|
18 | ||
17 | 19 | |
18 | 20 |
from django import forms |
21 |
from django.utils.translation import ugettext_lazy as _ |
|
19 | 22 | |
20 | 23 |
from .models import Regie |
21 | 24 | |
... | ... | |
67 | 70 |
) |
68 | 71 |
instance.save() |
69 | 72 |
return instance |
73 | ||
74 | ||
75 |
class TransactionExportForm(forms.Form): |
|
76 |
start_date = forms.DateField( |
|
77 |
label=_('Start date'), |
|
78 |
widget=forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d') |
|
79 |
) |
|
80 |
end_date = forms.DateField( |
|
81 |
label=_('End date'), |
|
82 |
widget=forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d') |
|
83 |
) |
|
84 | ||
85 |
def __init__(self, *args, **kwargs): |
|
86 |
super(TransactionExportForm, self).__init__(*args, **kwargs) |
|
87 |
today = datetime.date.today() |
|
88 |
self.initial['start_date'] = today - datetime.timedelta(days=30) |
|
89 |
self.initial['end_date'] = today |
combo/apps/lingo/manager_views.py | ||
---|---|---|
24 | 24 |
from django.utils.timezone import make_aware |
25 | 25 |
from django.views.generic import CreateView, UpdateView, ListView, DeleteView |
26 | 26 |
from django.http import HttpResponse |
27 |
from django.template.response import TemplateResponse |
|
27 | 28 | |
28 | 29 |
import eopayment |
29 | 30 | |
30 | 31 |
from .forms import RegieForm |
32 |
from .forms import TransactionExportForm |
|
31 | 33 |
from .models import PaymentBackend, Regie, Transaction |
32 | 34 | |
33 | 35 | |
... | ... | |
102 | 104 | |
103 | 105 | |
104 | 106 |
def download_transactions_csv(request): |
105 |
response = HttpResponse(content_type='text/csv') |
|
106 |
response['Content-Disposition'] = 'attachment; filename="transactions.csv"' |
|
107 |
writer = csv.writer(response) |
|
108 |
transactions = Transaction.objects.filter( |
|
109 |
status__in=(eopayment.PAID, eopayment.ACCEPTED)).order_by('-start_date') |
|
110 |
for transaction in transactions: |
|
111 |
row = [transaction.order_id, |
|
112 |
transaction.bank_transaction_id, |
|
113 |
transaction.start_date.strftime('%Y-%m-%d %H:%M:%S'), |
|
114 |
transaction.get_user_name(), |
|
115 |
str(transaction.amount)] |
|
116 |
for item in transaction.items.all(): |
|
117 |
row.extend([item.subject, str(item.amount)]) |
|
118 |
if six.PY3: |
|
119 |
writer.writerow([x for x in row]) |
|
120 |
else: |
|
121 |
writer.writerow([unicode(x).encode('utf-8') for x in row]) |
|
122 |
return response |
|
107 |
if request.method == 'POST': |
|
108 |
form = TransactionExportForm(data=request.POST) |
|
109 |
if form.is_valid(): |
|
110 |
response = HttpResponse(content_type='text/csv') |
|
111 |
response['Content-Disposition'] = 'attachment; filename="transactions.csv"' |
|
112 |
writer = csv.writer(response) |
|
113 |
transactions = ( |
|
114 |
Transaction.objects |
|
115 |
.filter( |
|
116 |
status__in=(eopayment.PAID, eopayment.ACCEPTED), |
|
117 |
start_date__gte=form.cleaned_data['start_date'], |
|
118 |
start_date__lte=form.cleaned_data['end_date'], |
|
119 |
).order_by('-start_date')) |
|
120 |
for transaction in transactions: |
|
121 |
row = [transaction.order_id, |
|
122 |
transaction.bank_transaction_id, |
|
123 |
transaction.start_date.strftime('%Y-%m-%d %H:%M:%S'), |
|
124 |
transaction.get_user_name(), |
|
125 |
str(transaction.amount)] |
|
126 |
for item in transaction.items.all(): |
|
127 |
row.extend([item.subject, str(item.amount)]) |
|
128 |
if six.PY3: |
|
129 |
writer.writerow([x for x in row]) |
|
130 |
else: |
|
131 |
writer.writerow([unicode(x).encode('utf-8') for x in row]) |
|
132 |
return response |
|
133 |
else: |
|
134 |
form = TransactionExportForm() |
|
135 | ||
136 |
return TemplateResponse(request, 'lingo/transaction_export.html', {'form': form}) |
combo/apps/lingo/templates/lingo/transaction_export.html | ||
---|---|---|
1 |
{% extends "combo/manager_base.html" %} |
|
2 |
{% load i18n %} |
|
3 | ||
4 |
{% block appbar %} |
|
5 |
<h2>{% trans "download CSV" %}</h2> |
|
6 |
{% endblock %} |
|
7 | ||
8 |
{% block content %} |
|
9 |
<form method="post"> |
|
10 |
{% csrf_token %} |
|
11 |
{{ form.as_p }} |
|
12 |
<div class="buttons"> |
|
13 |
<button class="submit-button">{% trans 'Download' %}</button> |
|
14 |
<a class="cancel" href="{% url 'lingo-manager-homepage' %}">{% trans 'Cancel' %}</a> |
|
15 |
</div> |
|
16 |
</form> |
|
17 |
{% endblock %} |
combo/apps/lingo/templates/lingo/transaction_list.html | ||
---|---|---|
6 | 6 |
<span class="actions"> |
7 | 7 |
<a href="{% url 'lingo-manager-paymentbackend-list' %}">{% trans 'Payment backends' %}</a> |
8 | 8 |
<a href="{% url 'lingo-manager-regie-list' %}">{% trans 'Regies' %}</a> |
9 |
<a href="{% url 'lingo-manager-transactions-download' %}">{% trans 'download CSV' %}</a> |
|
9 |
<a rel="popup" href="{% url 'lingo-manager-transactions-download' %}">{% trans 'download CSV' %}</a>
|
|
10 | 10 |
</span> |
11 | 11 |
{% endblock %} |
12 | 12 |
tests/test_lingo_manager.py | ||
---|---|---|
149 | 149 |
assert Regie.objects.get(id=regie.id).is_default is True |
150 | 150 |
assert Regie.objects.exclude(id=regie.id)[0].is_default is False |
151 | 151 | |
152 | ||
152 | 153 |
def test_download_transaction(app, admin_user, payment_backend): |
153 | 154 |
test_add_regie(app, admin_user, payment_backend) |
154 | 155 |
regie = Regie.objects.filter(slug='test')[0] |
... | ... | |
163 | 164 |
bank_transaction_id='567', status=eopayment.PAID) |
164 | 165 |
trans2 = Transaction.objects.create(regie=regie, remote_items='remote items omg', order_id='2', user=user, |
165 | 166 |
bank_transaction_id='136', status=eopayment.PAID) |
166 |
trans1.items = [b_item,]
|
|
167 |
trans1.start_date = datetime.date(2019, 7, 29)
|
|
167 | 168 |
trans1.save() |
168 |
trans2.items = [b_item,] |
|
169 |
trans1.items.set([b_item]) |
|
170 |
trans2.start_date = datetime.date(2019, 10, 1) |
|
169 | 171 |
trans2.save() |
172 |
trans2.items.set([b_item]) |
|
170 | 173 |
app = login(app) |
174 | ||
171 | 175 |
resp = app.get('/manage/lingo/transactions/download-csv/', status=200) |
172 |
content = [i for i in [item.split(',') for item in resp.text.split('\r\n')]] |
|
173 |
for row in content[:-1]: |
|
174 |
if row[0] == '2': |
|
175 |
assert row[1] == trans2.bank_transaction_id |
|
176 |
assert row[3] == '%s %s' % (user.first_name, user.last_name) |
|
177 |
assert Decimal(row[4]) == Decimal(trans2.amount) |
|
178 |
assert row[5] == b_item.subject |
|
179 |
assert Decimal(row[6]) == b_item.amount |
|
180 |
else: |
|
181 |
assert row[1] == trans1.bank_transaction_id |
|
182 |
assert row[3] == '%s %s' % (user.first_name, user.last_name) |
|
183 |
assert Decimal(row[4]) == Decimal(trans1.amount) |
|
184 |
assert row[5] == b_item.subject |
|
185 |
assert Decimal(row[6]) == b_item.amount |
|
176 |
resp.forms[0]['start_date'] = datetime.date(2019, 10, 1) |
|
177 |
resp.forms[0]['end_date'] = datetime.date(2019, 11, 1) |
|
178 |
resp = resp.forms[0].submit() |
|
179 |
content = [i for i in [item.split(',') for item in resp.text.split('\r\n')] if len(i) > 1] |
|
180 |
assert len(content) == 1 |
|
181 |
row = content[0] |
|
182 |
assert row[0] == '2' |
|
183 |
assert row[1] == trans2.bank_transaction_id |
|
184 |
assert row[3] == '%s %s' % (user.first_name, user.last_name) |
|
185 |
assert Decimal(row[4]) == Decimal(trans2.amount) |
|
186 |
assert row[5] == b_item.subject |
|
187 |
assert Decimal(row[6]) == b_item.amount |
|
188 | ||
189 |
resp = app.get('/manage/lingo/transactions/download-csv/', status=200) |
|
190 |
resp.forms[0]['start_date'] = datetime.date(2019, 7, 1) |
|
191 |
resp.forms[0]['end_date'] = datetime.date(2019, 11, 1) |
|
192 |
resp = resp.forms[0].submit() |
|
193 |
content = [i for i in [item.split(',') for item in resp.text.split('\r\n')] if len(i) > 1] |
|
194 |
assert len(content) == 2 |
|
195 |
row = content[0] |
|
196 |
assert row[0] == '2' |
|
197 |
row = content[1] |
|
198 |
assert row[0] == '1' |
|
199 |
assert row[1] == trans1.bank_transaction_id |
|
200 |
assert row[3] == '%s %s' % (user.first_name, user.last_name) |
|
201 |
assert Decimal(row[4]) == Decimal(trans1.amount) |
|
202 |
assert row[5] == b_item.subject |
|
203 |
assert Decimal(row[6]) == b_item.amount |
|
204 | ||
186 | 205 | |
187 | 206 |
def test_transactions_search(app, admin_user): |
188 | 207 |
for i in range(50): |
189 |
- |