Commit 57c595f5 authored by Serge S. Koval's avatar Serge S. Koval

Merge pull request #1054 from pawl/improve_export

Change export_max_rows default to unlimited
parents fb9dcb94 79eb7765
...@@ -620,9 +620,11 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -620,9 +620,11 @@ class BaseModelView(BaseView, ActionsMixin):
""" """
# Export settings # Export settings
export_max_rows = None export_max_rows = 0
""" """
Maximum number of rows allowed for export. Maximum number of rows allowed for export.
Unlimited by default. Uses `page_size` if set to `None`.
""" """
# Various settings # Various settings
......
...@@ -1080,3 +1080,37 @@ def test_simple_list_pager(): ...@@ -1080,3 +1080,37 @@ def test_simple_list_pager():
count, data = view.get_list(0, None, None, None, None) count, data = view.get_list(0, None, None, None, None)
ok_(count is None) ok_(count is None)
def test_export_csv():
app, db, admin = setup()
Model1, Model2 = create_models(db)
view = CustomModelView(Model1, can_export=True,
column_list=['test1', 'test2'], export_max_rows=2,
endpoint='row_limit_2')
admin.add_view(view)
for x in range(5):
fill_db(Model1, Model2)
client = app.test_client()
# test export_max_rows
rv = client.get('/admin/row_limit_2/export/csv/')
data = rv.data.decode('utf-8')
eq_(rv.status_code, 200)
ok_("Test1,Test2\r\n"
"test1_val_1,test2_val_1\r\n"
"test1_val_2,test2_val_2\r\n" == data)
view = CustomModelView(Model1, can_export=True,
column_list=['test1', 'test2'],
endpoint='no_row_limit')
admin.add_view(view)
# test row limit without export_max_rows
rv = client.get('/admin/no_row_limit/export/csv/')
data = rv.data.decode('utf-8')
eq_(rv.status_code, 200)
ok_(len(data.splitlines()) > 21)
...@@ -987,3 +987,38 @@ def test_ajax_fk(): ...@@ -987,3 +987,38 @@ def test_ajax_fk():
ok_(mdl.model1 is not None) ok_(mdl.model1 is not None)
eq_(mdl.model1.id, model.id) eq_(mdl.model1.id, model.id)
eq_(mdl.model1.test1, u'first') eq_(mdl.model1.test1, u'first')
def test_export_csv():
app, db, admin = setup()
Model1, Model2 = create_models(db)
view = CustomModelView(Model1, can_export=True,
column_list=['test1', 'test2'], export_max_rows=2,
endpoint='row_limit_2')
admin.add_view(view)
for x in range(5):
fill_db(Model1, Model2)
client = app.test_client()
# test export_max_rows
rv = client.get('/admin/row_limit_2/export/csv/')
data = rv.data.decode('utf-8')
eq_(rv.status_code, 200)
ok_("Test1,Test2\r\n"
"test1_val_1,test2_val_1\r\n"
"test1_val_2,test2_val_2\r\n" == data)
view = CustomModelView(Model1, can_export=True,
column_list=['test1', 'test2'],
endpoint='no_row_limit')
admin.add_view(view)
# test row limit without export_max_rows
rv = client.get('/admin/no_row_limit/export/csv/')
data = rv.data.decode('utf-8')
eq_(rv.status_code, 200)
ok_(len(data.splitlines()) > 21)
...@@ -2024,3 +2024,37 @@ def test_model_default(): ...@@ -2024,3 +2024,37 @@ def test_model_default():
client = app.test_client() client = app.test_client()
rv = client.post('/admin/model2/new/', data=dict()) rv = client.post('/admin/model2/new/', data=dict())
assert_true(b'This field is required' not in rv.data) assert_true(b'This field is required' not in rv.data)
def test_export_csv():
app, db, admin = setup()
Model1, Model2 = create_models(db)
for x in range(5):
fill_db(db, Model1, Model2)
view = CustomModelView(Model1, db.session, can_export=True,
column_list=['test1', 'test2'], export_max_rows=2,
endpoint='row_limit_2')
admin.add_view(view)
client = app.test_client()
# test export_max_rows
rv = client.get('/admin/row_limit_2/export/csv/')
data = rv.data.decode('utf-8')
eq_(rv.status_code, 200)
ok_("Test1,Test2\r\n"
"test1_val_1,test2_val_1\r\n"
"test1_val_2,test2_val_2\r\n" == data)
view = CustomModelView(Model1, db.session, can_export=True,
column_list=['test1', 'test2'],
endpoint='no_row_limit')
admin.add_view(view)
# test row limit without export_max_rows
rv = client.get('/admin/no_row_limit/export/csv/')
data = rv.data.decode('utf-8')
eq_(rv.status_code, 200)
ok_(len(data.splitlines()) > 21)
...@@ -13,7 +13,6 @@ from flask_admin import Admin, form ...@@ -13,7 +13,6 @@ from flask_admin import Admin, form
from flask_admin._compat import iteritems, itervalues from flask_admin._compat import iteritems, itervalues
from flask_admin.model import base, filters from flask_admin.model import base, filters
from flask_admin.model.template import macro from flask_admin.model.template import macro
from itertools import islice
def wtforms2_and_up(func): def wtforms2_and_up(func):
...@@ -97,9 +96,7 @@ class MockModelView(base.BaseModelView): ...@@ -97,9 +96,7 @@ class MockModelView(base.BaseModelView):
def get_list(self, page, sort_field, sort_desc, search, filters, def get_list(self, page, sort_field, sort_desc, search, filters,
page_size=None): page_size=None):
self.search_arguments.append((page, sort_field, sort_desc, search, filters)) self.search_arguments.append((page, sort_field, sort_desc, search, filters))
count = len(self.all_models) return len(self.all_models), itervalues(self.all_models)
data = islice(itervalues(self.all_models), 0, page_size)
return count, data
def get_one(self, id): def get_one(self, id):
return self.all_models.get(int(id)) return self.all_models.get(int(id))
...@@ -605,25 +602,6 @@ def test_export_csv(): ...@@ -605,25 +602,6 @@ def test_export_csv():
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
ok_(u'\u2013ut8_1\u2013,\u2013utf8_2\u2013\r\n' in data) ok_(u'\u2013ut8_1\u2013,\u2013utf8_2\u2013\r\n' in data)
# test row limit
view_data = {
1: Model(1, "col1_1", "col2_1"),
2: Model(2, "col1_2", "col2_2"),
3: Model(3, "col1_3", "col2_3"),
}
view = MockModelView(Model, view_data, can_export=True,
column_list=['col1', 'col2'], export_max_rows=2,
endpoint='row_limit_2')
admin.add_view(view)
rv = client.get('/admin/row_limit_2/export/csv/')
data = rv.data.decode('utf-8')
eq_(rv.status_code, 200)
ok_("Col1,Col2\r\n"
"col1_1,col2_1\r\n"
"col1_2,col2_2\r\n" == data)
# test None type, integer type, column_labels, and column_formatters # test None type, integer type, column_labels, and column_formatters
view_data = { view_data = {
1: Model(1, "col1_1", 1), 1: Model(1, "col1_1", 1),
......
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