lingo: add csv export link for transactions (#14040)

This commit is contained in:
Jean-Baptiste Jaillet 2016-12-01 11:48:38 +01:00
parent 578c763a83
commit 48595b466e
5 changed files with 67 additions and 3 deletions

View File

@ -14,9 +14,12 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import csv
from django.core.urlresolvers import reverse_lazy
from django.views.generic import (CreateView, UpdateView, ListView,
DeleteView, TemplateView)
from django.http import HttpResponse
import eopayment
@ -56,5 +59,22 @@ class TransactionListView(ListView):
return Transaction.objects.filter(status=eopayment.PAID).order_by('-start_date')
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=eopayment.PAID).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)])
writer.writerow(row)
return response
class ManagerHomeView(TemplateView):
template_name = 'lingo/manager_home.html'

View File

@ -263,6 +263,11 @@ class Transaction(models.Model):
def is_remote(self):
return self.remote_items != ''
def get_user_name(self):
if self.user:
return self.user.get_full_name()
return _('Anonymous User')
def is_paid(self):
return self.status == eopayment.PAID

View File

@ -3,6 +3,7 @@
{% block appbar %}
<h2>{% trans 'Transactions' %}</h2>
<a href="{% url 'lingo-manager-transactions-download' %}">{% trans 'download CSV' %}</a>
{% endblock %}
{% block breadcrumb %}
@ -30,7 +31,7 @@
<td rowspan="{{object.items.all.count|default:1}}">{{object.order_id}}</td>
<td rowspan="{{object.items.all.count|default:1}}">{{object.bank_transaction_id}}</td>
<td rowspan="{{object.items.all.count|default:1}}">{{object.start_date}}</td>
<td rowspan="{{object.items.all.count|default:1}}">{{object.user.first_name}} {{object.user.last_name}}</td>
<td rowspan="{{object.items.all.count|default:1}}">{{object.get_user_name}}</td>
<td rowspan="{{object.items.all.count|default:1}}">{{object.amount}} €</td>
{% for item in object.items.all %}
{% if not forloop.first %}<tr>{% endif %}

View File

@ -23,11 +23,12 @@ from .views import (RegiesApiView, AddBasketItemApiView, PayView, CallbackView,
RemoveBasketItemApiView, ValidateTransactionApiView,
CancelTransactionApiView, SelfInvoiceView)
from .manager_views import (RegieListView, RegieCreateView, RegieUpdateView,
RegieDeleteView, TransactionListView, ManagerHomeView)
RegieDeleteView, TransactionListView, ManagerHomeView, download_transactions_csv)
lingo_manager_urls = patterns('lingo.manager_views',
url('^$', ManagerHomeView.as_view(), name='lingo-manager-homepage'),
url('^transactions/$', TransactionListView.as_view(), name='lingo-manager-transactions-list'),
url('^transactions/download-csv/$', download_transactions_csv, name='lingo-manager-transactions-download'),
url('^regies/$', RegieListView.as_view(), name='lingo-manager-regie-list'),
url('^regies/add/$', RegieCreateView.as_view(), name='lingo-manager-regie-add'),
url('^regies/(?P<pk>\w+)/edit$', RegieUpdateView.as_view(),

View File

@ -3,7 +3,9 @@ from django.core.wsgi import get_wsgi_application
from webtest import TestApp
import pytest
from combo.apps.lingo.models import Regie
import eopayment
from combo.apps.lingo.models import Regie, BasketItem, Transaction
from decimal import Decimal
pytestmark = pytest.mark.django_db
@ -87,3 +89,38 @@ def test_add_second_regie(app, admin_user):
assert Regie.objects.count() == 2
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):
test_add_regie(app, admin_user)
regie = Regie.objects.filter(slug='test')[0]
user = User.objects.create_user('dimebag', 'dime@bag.pan', 'pwd')
user.last_name = 'Darell'
user.first_name = 'Dimebag'
user.save()
b_item = BasketItem.objects.create(user=user, regie=regie, subject='it\'s a subject',
source_url='http://example.net', amount=18.5)
trans1 = Transaction.objects.create(regie=regie, remote_items='remote items lol', order_id='1', user=user,
bank_transaction_id='567', status=eopayment.PAID)
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 = [b_item,]
trans1.save()
trans2.items = [b_item,]
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.content.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