Commit a3b049b3 authored by Cate S's avatar Cate S

Adding customization options for export columns

This is based on what is done by
`get_details_columns`/`column_details_list`/`column_details_exclude_list`
with the added complication that `get_export_columns` also checks
`column_list` before attempting to invoke `scaffold_list_columns`.
parent d73ef0e2
...@@ -168,6 +168,17 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -168,6 +168,17 @@ class BaseModelView(BaseView, ActionsMixin):
Collection of fields excluded from the details view. 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()) column_formatters = ObsoleteAttr('column_formatters', 'list_formatters', dict())
""" """
Dictionary of list view column formatters. Dictionary of list view column formatters.
...@@ -748,6 +759,10 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -748,6 +759,10 @@ class BaseModelView(BaseView, ActionsMixin):
if self.can_view_details: if self.can_view_details:
self._details_columns = self.get_details_columns() self._details_columns = self.get_details_columns()
# Export view
if self.can_export:
self._export_columns = self.get_export_columns()
# Labels # Labels
if self.column_labels is None: if self.column_labels is None:
self.column_labels = {} self.column_labels = {}
...@@ -858,6 +873,28 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -858,6 +873,28 @@ class BaseModelView(BaseView, ActionsMixin):
return [(c, self.get_column_name(c)) for c in columns] 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): def scaffold_sortable_columns(self):
""" """
Returns dictionary of sortable columns. Must be implemented in Returns dictionary of sortable columns. Must be implemented in
...@@ -1963,12 +2000,12 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1963,12 +2000,12 @@ class BaseModelView(BaseView, ActionsMixin):
def generate(): def generate():
# Append the column titles at the beginning # 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) yield writer.writerow(titles)
for row in data: for row in data:
vals = [csv_encode(self.get_export_value(row, c[0])) 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) yield writer.writerow(vals)
filename = '%s_%s.csv' % (self.name, filename = '%s_%s.csv' % (self.name,
......
...@@ -579,6 +579,36 @@ def test_export_csv(): ...@@ -579,6 +579,36 @@ def test_export_csv():
"col1_2,col2_2\r\n" "col1_2,col2_2\r\n"
"col1_3,col2_3\r\n" == data) "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'])
admin.add_view(view)
rv = client.get('/admin/model/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'])
admin.add_view(view)
rv = client.get('/admin/model/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 # test utf8 characters in csv export
view_data[4] = Model(1, u'\u2013ut8_1\u2013', u'\u2013utf8_2\u2013') view_data[4] = Model(1, u'\u2013ut8_1\u2013', u'\u2013utf8_2\u2013')
view = MockModelView(Model, view_data, can_export=True, 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