Projet

Général

Profil

0001-lingo-export-transactions-between-2-dates-35988.patch

Lauréline Guérin, 23 octobre 2019 10:40

Télécharger (9,53 ko)

Voir les différences:

Subject: [PATCH] lingo: export transactions between 2 dates (#35988)

 combo/apps/lingo/forms.py                     | 20 ++++++++
 combo/apps/lingo/manager_views.py             | 50 +++++++++++-------
 .../templates/lingo/transaction_export.html   | 17 +++++++
 .../templates/lingo/transaction_list.html     |  2 +-
 tests/test_lingo_manager.py                   | 51 +++++++++++++------
 5 files changed, 105 insertions(+), 35 deletions(-)
 create mode 100644 combo/apps/lingo/templates/lingo/transaction_export.html
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
-