backoffice: add option to skip header line in ods/csv exports (#52969)

This commit is contained in:
Frédéric Péters 2021-04-18 22:13:24 +02:00
parent 71fb98d24a
commit b9cbbe9893
2 changed files with 59 additions and 4 deletions

View File

@ -585,3 +585,43 @@ def test_backoffice_ods(pub):
]
== 'string'
)
def test_backoffice_header_line(pub):
create_superuser(pub)
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [
fields.StringField(
id='1', label='1st field', type='string', display_locations=['validation', 'summary', 'listings']
),
]
formdef.workflow_roles = {'_receiver': 1}
formdef.store()
formdef.data_class().wipe()
for i in range(3):
formdata = formdef.data_class()()
formdata.receipt_time = datetime.datetime(2015, 1, 1).timetuple()
formdata.data = {'1': 'FOO BAR %d' % i}
formdata.jump_status('new')
formdata.store()
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/')
resp = resp.click('Export a Spreadsheet')
resp.form['format'] = 'csv'
assert resp.form['include_header_line'].checked is True
resp = resp.form.submit('submit')
assert resp.headers['content-type'].startswith('text/')
assert len(resp.text.splitlines()) == 4
resp = app.get('/backoffice/management/form-title/')
resp = resp.click('Export a Spreadsheet')
resp.form['format'] = 'csv'
resp.form['include_header_line'].checked = False
resp = resp.form.submit('submit')
assert resp.headers['content-type'].startswith('text/')
assert len(resp.text.splitlines()) == 3

View File

@ -2110,6 +2110,12 @@ class FormPage(Directory):
required=True,
extra_css_class='widget-inline-radio',
)
form.add(
CheckboxWidget,
'include_header_line',
title=_('Include header line'),
value=True,
)
form.add_submit('submit', _('Export'))
form.add_submit('cancel', _('Cancel'))
@ -2120,6 +2126,7 @@ class FormPage(Directory):
return r.getvalue()
get_request().form = parse_query(form.get_widget('query_string').parse() or '', 'utf-8')
get_request().form['skip_header_line'] = not (form.get_widget('include_header_line').parse())
file_format = form.get_widget('format').parse()
if file_format == 'csv':
return self.csv()
@ -2134,6 +2141,7 @@ class FormPage(Directory):
query = get_request().form.get('q')
criterias = self.get_criterias_from_query()
order_by = misc.get_order_by_or_400(get_request().form.get('order_by', None))
skip_header_line = bool(get_request().form.get('skip_header_line'))
get_logger().info('backoffice - form %s - listing csv' % self.formdef.name)
@ -2146,6 +2154,7 @@ class FormPage(Directory):
query=query,
criterias=criterias,
order_by=order_by,
skip_header_line=skip_header_line,
)
if count > self.WCS_SYNC_EXPORT_LIMIT:
job = get_response().add_after_job(job)
@ -2184,6 +2193,7 @@ class FormPage(Directory):
query = get_request().form.get('q')
criterias = self.get_criterias_from_query()
order_by = misc.get_order_by_or_400(get_request().form.get('order_by', None))
skip_header_line = bool(get_request().form.get('skip_header_line'))
count = self.formdef.data_class().count()
job = OdsExportAfterJob(
@ -2194,6 +2204,7 @@ class FormPage(Directory):
query=query,
criterias=criterias,
order_by=order_by,
skip_header_line=skip_header_line,
)
if count > self.WCS_SYNC_EXPORT_LIMIT and not get_request().is_api_url():
job = get_response().add_after_job(job)
@ -3735,7 +3746,8 @@ class CsvExportAfterJob(AfterJob):
output = io.StringIO()
csv_output = csv.writer(output)
csv_output.writerow(self.csv_tuple_heading(fields))
if not self.kwargs.get('skip_header_line'):
csv_output.writerow(self.csv_tuple_heading(fields))
for filled in items:
csv_output.writerow(tuple(x['value'] for x in self.get_spreadsheet_line(fields, filled)))
@ -3764,13 +3776,16 @@ class OdsExportAfterJob(CsvExportAfterJob):
workbook = ods.Workbook(encoding='utf-8')
ws = workbook.add_sheet(formdef.name)
for i, field in enumerate(self.csv_tuple_heading(fields)):
ws.write(0, i, field)
header_line_counter = 0
if not self.kwargs.get('skip_header_line'):
header_line_counter = 1
for i, field in enumerate(self.csv_tuple_heading(fields)):
ws.write(0, i, field)
for i, formdata in enumerate(items):
for j, item in enumerate(self.get_spreadsheet_line(fields, formdata)):
ws.write(
i + 1,
i + header_line_counter,
j,
item['value'],
formdata=formdata,