CSV-export improvements (include voucher, allow semicolon)

This commit is contained in:
Raphael Michel
2018-11-14 10:02:28 +01:00
parent 8ffc6550da
commit 138ddcdcd7
2 changed files with 16 additions and 11 deletions
+7 -2
View File
@@ -101,7 +101,7 @@ class BaseCheckinList(BaseExporter):
last_checked_in=Subquery(cqs) last_checked_in=Subquery(cqs)
).prefetch_related( ).prefetch_related(
'answers', 'answers__question', 'addon_to__answers', 'addon_to__answers__question' 'answers', 'answers__question', 'addon_to__answers', 'addon_to__answers__question'
).select_related('order', 'item', 'variation', 'addon_to', 'order__invoice_address') ).select_related('order', 'item', 'variation', 'addon_to', 'order__invoice_address', 'voucher')
if not cl.all_products: if not cl.all_products:
qs = qs.filter(item__in=cl.limit_products.values_list('id', flat=True)) qs = qs.filter(item__in=cl.limit_products.values_list('id', flat=True))
@@ -288,7 +288,8 @@ class CSVCheckinList(BaseCheckinList):
label=_('CSV dialect'), label=_('CSV dialect'),
choices=( choices=(
('default', 'Default'), ('default', 'Default'),
('excel', 'Excel') ('excel', 'Excel'),
('semicolon', 'Semicolon'),
) )
) )
return d return d
@@ -297,6 +298,8 @@ class CSVCheckinList(BaseCheckinList):
output = io.StringIO() output = io.StringIO()
if form_data.get('dialect', '-') in csv.list_dialects(): if form_data.get('dialect', '-') in csv.list_dialects():
writer = csv.writer(output, dialect=form_data.get('dialect')) writer = csv.writer(output, dialect=form_data.get('dialect'))
elif form_data.get('dialect', '-') == "semicolon":
writer = csv.writer(output, dialect='excel', delimiter=';')
else: else:
writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC, delimiter=",") writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC, delimiter=",")
@@ -335,6 +338,7 @@ class CSVCheckinList(BaseCheckinList):
headers.append(str(q.question)) headers.append(str(q.question))
headers.append(_('Company')) headers.append(_('Company'))
headers.append(_('Voucher code'))
writer.writerow(headers) writer.writerow(headers)
for op in qs: for op in qs:
@@ -386,6 +390,7 @@ class CSVCheckinList(BaseCheckinList):
row.append(acache.get(q.pk, '')) row.append(acache.get(q.pk, ''))
row.append(ia.company) row.append(ia.company)
row.append(op.voucher.code if op.voucher else "")
writer.writerow(row) writer.writerow(row)
return '{}_checkin.csv'.format(self.event.slug), 'text/csv', output.getvalue().encode("utf-8") return '{}_checkin.csv'.format(self.event.slug), 'text/csv', output.getvalue().encode("utf-8")
+9 -9
View File
@@ -63,11 +63,11 @@ def test_csv_simple(event):
}) })
assert clean(content.decode()) == clean(""""Order code","Attendee name","Attendee name: Title","Attendee name: assert clean(content.decode()) == clean(""""Order code","Attendee name","Attendee name: Title","Attendee name:
First name","Attendee name: Middle name","Attendee name: Family name","Product","Price","Checked in","Secret", First name","Attendee name: Middle name","Attendee name: Family name","Product","Price","Checked in","Secret",
"E-mail","Company" "E-mail","Company","Voucher code"
"FOO","Mr Peter A Jones","Mr","Peter","A","Jones","Ticket","23.00","","hutjztuxhkbtwnesv2suqv26k6ttytxx", "FOO","Mr Peter A Jones","Mr","Peter","A","Jones","Ticket","23.00","","hutjztuxhkbtwnesv2suqv26k6ttytxx",
"dummy@dummy.test","" "dummy@dummy.test","",""
"FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","ggsngqtnmhx74jswjngw3fk8pfwz2a7k", "FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","ggsngqtnmhx74jswjngw3fk8pfwz2a7k",
"dummy@dummy.test","" "dummy@dummy.test","",""
""") """)
@@ -85,11 +85,11 @@ def test_csv_order_by_name_parts(event): # noqa
}) })
assert clean(content.decode()) == clean(""""Order code","Attendee name","Attendee name: Title", assert clean(content.decode()) == clean(""""Order code","Attendee name","Attendee name: Title",
"Attendee name: First name","Attendee name: Middle name","Attendee name: Family name","Product","Price", "Attendee name: First name","Attendee name: Middle name","Attendee name: Family name","Product","Price",
"Checked in","Secret","E-mail","Company" "Checked in","Secret","E-mail","Company","Voucher code"
"FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","ggsngqtnmhx74jswjngw3fk8pfwz2a7k", "FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","ggsngqtnmhx74jswjngw3fk8pfwz2a7k",
"dummy@dummy.test","" "dummy@dummy.test","",""
"FOO","Mr Peter A Jones","Mr","Peter","A","Jones","Ticket","23.00","","hutjztuxhkbtwnesv2suqv26k6ttytxx", "FOO","Mr Peter A Jones","Mr","Peter","A","Jones","Ticket","23.00","","hutjztuxhkbtwnesv2suqv26k6ttytxx",
"dummy@dummy.test","" "dummy@dummy.test","",""
""") """)
c = CSVCheckinList(event) c = CSVCheckinList(event)
_, _, content = c.render({ _, _, content = c.render({
@@ -100,9 +100,9 @@ def test_csv_order_by_name_parts(event): # noqa
}) })
assert clean(content.decode()) == clean(""""Order code","Attendee name","Attendee name: Title", assert clean(content.decode()) == clean(""""Order code","Attendee name","Attendee name: Title",
"Attendee name: First name","Attendee name: Middle name","Attendee name: Family name","Product","Price", "Attendee name: First name","Attendee name: Middle name","Attendee name: Family name","Product","Price",
"Checked in","Secret","E-mail","Company" "Checked in","Secret","E-mail","Company","Voucher code"
"FOO","Mr Peter A Jones","Mr","Peter","A","Jones","Ticket","23.00","","hutjztuxhkbtwnesv2suqv26k6ttytxx", "FOO","Mr Peter A Jones","Mr","Peter","A","Jones","Ticket","23.00","","hutjztuxhkbtwnesv2suqv26k6ttytxx",
"dummy@dummy.test","" "dummy@dummy.test","",""
"FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","ggsngqtnmhx74jswjngw3fk8pfwz2a7k", "FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","ggsngqtnmhx74jswjngw3fk8pfwz2a7k",
"dummy@dummy.test","" "dummy@dummy.test","",""
""") """)