Commit 128d5e00 authored by Serge S. Koval's avatar Serge S. Koval

Merge pull request #1052 from radioprotector/customizable-export-columns

Add customization options for export columns
parents d73ef0e2 d4100d5f
......@@ -168,6 +168,17 @@ class BaseModelView(BaseView, ActionsMixin):
Collection of fields excluded from the details view.
"""
column_export_list = None
"""
Collection of the field names included in the export.
If set to `None`, will get them from the model.
"""
column_export_exclude_list = None
"""
Collection of fields excluded from the export.
"""
column_formatters = ObsoleteAttr('column_formatters', 'list_formatters', dict())
"""
Dictionary of list view column formatters.
......@@ -748,6 +759,10 @@ class BaseModelView(BaseView, ActionsMixin):
if self.can_view_details:
self._details_columns = self.get_details_columns()
# Export view
if self.can_export:
self._export_columns = self.get_export_columns()
# Labels
if self.column_labels is None:
self.column_labels = {}
......@@ -858,6 +873,28 @@ class BaseModelView(BaseView, ActionsMixin):
return [(c, self.get_column_name(c)) for c in columns]
def get_export_columns(self):
"""
Returns a list of the model field names in the export view. If
`column_export_list` was set, returns it. Otherwise, if
`column_list` was set, returns it. Otherwise calls
`scaffold_list_columns` to generate the list from the model.
"""
columns = self.column_export_list
if columns is None:
columns = self.column_list
if columns is None:
columns = self.scaffold_list_columns()
# Filter excluded columns
if self.column_export_exclude_list:
columns = [c for c in columns
if c not in self.column_export_exclude_list]
return [(c, self.get_column_name(c)) for c in columns]
def scaffold_sortable_columns(self):
"""
Returns dictionary of sortable columns. Must be implemented in
......@@ -1963,12 +2000,12 @@ class BaseModelView(BaseView, ActionsMixin):
def generate():
# Append the column titles at the beginning
titles = [csv_encode(c[1]) for c in self._list_columns]
titles = [csv_encode(c[1]) for c in self._export_columns]
yield writer.writerow(titles)
for row in data:
vals = [csv_encode(self.get_export_value(row, c[0]))
for c in self._list_columns]
for c in self._export_columns]
yield writer.writerow(vals)
filename = '%s_%s.csv' % (self.name,
......
......@@ -579,6 +579,38 @@ def test_export_csv():
"col1_2,col2_2\r\n"
"col1_3,col2_3\r\n" == data)
# test explicit use of column_export_list
view = MockModelView(Model, view_data, can_export=True,
column_list=['col1', 'col2'],
column_export_list=['id','col1','col2'],
endpoint='exportinclusion')
admin.add_view(view)
rv = client.get('/admin/exportinclusion/export/csv/')
data = rv.data.decode('utf-8')
eq_(rv.mimetype, 'text/csv')
eq_(rv.status_code, 200)
ok_("Id,Col1,Col2\r\n"
"1,col1_1,col2_1\r\n"
"2,col1_2,col2_2\r\n"
"3,col1_3,col2_3\r\n" == data)
# test explicit use of column_export_exclude_list
view = MockModelView(Model, view_data, can_export=True,
column_list=['col1', 'col2'],
column_export_exclude_list=['col2'],
endpoint='exportexclusion')
admin.add_view(view)
rv = client.get('/admin/exportexclusion/export/csv/')
data = rv.data.decode('utf-8')
eq_(rv.mimetype, 'text/csv')
eq_(rv.status_code, 200)
ok_("Col1\r\n"
"col1_1\r\n"
"col1_2\r\n"
"col1_3\r\n" == data)
# test utf8 characters in csv export
view_data[4] = Model(1, u'\u2013ut8_1\u2013', u'\u2013utf8_2\u2013')
view = MockModelView(Model, view_data, can_export=True,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment