lingo: add csv export link for transactions (#14040)
This commit is contained in:
parent
578c763a83
commit
48595b466e
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue