fix: Dont load preview for more than 500 rows

This commit is contained in:
Faris Ansari 2019-09-17 18:22:19 +05:30
parent 2b42838917
commit 5b193f5672
2 changed files with 40 additions and 9 deletions

View file

@ -15,6 +15,7 @@ from frappe.exceptions import ValidationError, MandatoryError
from frappe.model import display_fieldtypes, no_value_fields, table_fields
INVALID_VALUES = ["", None]
MAX_ROWS_IN_PREVIEW = 500
class Importer:
@ -106,6 +107,13 @@ class Importer:
self.header_row = header_row
def get_data_for_import_preview(self):
out = self.get_parsed_data_from_template()
if len(out.data) > MAX_ROWS_IN_PREVIEW:
out.data = []
out.max_rows_exceeded = True
return out
def get_parsed_data_from_template(self):
fields, fields_warnings = self.parse_fields_from_header_row()
formats, formats_warnings = self.parse_formats_from_first_10_rows()
fields, data = self.add_serial_no_column(fields, self.data)
@ -115,7 +123,9 @@ class Importer:
warnings = fields_warnings + formats_warnings
return dict(header_row=self.header_row, fields=fields, data=data, warnings=warnings)
return frappe._dict(
header_row=self.header_row, fields=fields, data=data, warnings=warnings
)
def parse_fields_from_header_row(self):
remap_column = self.template_options.remap_column
@ -321,7 +331,7 @@ class Importer:
# set flag
frappe.flags.in_import = True
out = self.get_data_for_import_preview()
out = self.get_parsed_data_from_template()
fields = out["fields"]
data = out["data"]
warnings = []
@ -619,12 +629,12 @@ class Importer:
row_indexes = list(set(row_indexes))
row_indexes.sort()
out = self.get_data_for_import_preview()
out = self.get_parsed_data_from_template()
header_row = out["header_row"]
data = out["data"]
rows = [header_row]
rows += [row[1: ] for row in data if row[0] in row_indexes]
rows += [row[1:] for row in data if row[0] in row_indexes]
build_csv_response(rows, self.doctype)

View file

@ -32,12 +32,14 @@ frappe.data_import.ImportPreview = class ImportPreview {
this.header_row = this.preview_data.header_row;
this.fields = this.preview_data.fields;
this.data = this.preview_data.data;
this.max_rows_exceeded = this.preview_data.max_rows_exceeded;
this.make_wrapper();
this.prepare_columns();
this.prepare_data();
this.render_warnings(this.warnings);
this.render_datatable();
this.setup_styles();
this.add_actions();
}
make_wrapper() {
@ -45,11 +47,7 @@ frappe.data_import.ImportPreview = class ImportPreview {
<div>
<div class="warnings text-muted"></div>
<div class="table-preview"></div>
<div class="table-actions margin-top">
<button class="btn btn-xs btn-default" data-action="export_errored_rows">
${__('Export rows which are not imported')}
</button>
</div>
<div class="table-actions margin-top"></div>
</div>
`);
frappe.utils.bind_actions_with_class(this.wrapper, this);
@ -135,6 +133,11 @@ frappe.data_import.ImportPreview = class ImportPreview {
this.datatable.destroy();
}
let no_data_message = this.max_rows_exceeded
? __('Cannot load preview for more than 500 rows. You can still remap or skip columns.')
: __('No Data');
no_data_message = `<span class="text-muted">${no_data_message}</span>`;
this.datatable = new DataTable(this.$table_preview.get(0), {
data: this.data,
columns: this.columns,
@ -143,6 +146,7 @@ frappe.data_import.ImportPreview = class ImportPreview {
serialNoColumn: false,
checkboxColumn: false,
pasteFromClipboard: true,
noDataMessage: no_data_message,
headerDropdown: [
{
label: __('Remap Column'),
@ -158,6 +162,12 @@ frappe.data_import.ImportPreview = class ImportPreview {
}
});
if (this.data.length === 0) {
this.datatable.style.setStyle('.dt-scrollable', {
height: 'auto'
});
}
this.datatable.style.setStyle('.dt-dropdown__list-item:nth-child(-n+4)', {
display: 'none'
});
@ -218,6 +228,17 @@ frappe.data_import.ImportPreview = class ImportPreview {
});
}
add_actions() {
let failures = this.import_log.filter(log => !log.success);
if (failures.length > 0) {
this.wrapper.find('.table-actions').append(
`<button class="btn btn-xs btn-default" data-action="export_errored_rows">
${__('Export rows which are not imported')}
</button>
`);
}
}
export_errored_rows() {
this.events.export_errored_rows();
}