diff --git a/frappe/core/doctype/data_import/importer_new.py b/frappe/core/doctype/data_import/importer_new.py index d5c634bf2b..911d6a2501 100644 --- a/frappe/core/doctype/data_import/importer_new.py +++ b/frappe/core/doctype/data_import/importer_new.py @@ -5,6 +5,7 @@ import io import csv import json +import timeit import frappe from datetime import datetime from frappe import _ @@ -42,6 +43,7 @@ class Importer: self.data = None # used to store date formats guessed from data rows per column self._guessed_date_formats = {} + self.last_eta = 0 self.meta = frappe.get_meta(doctype) self.prepare_content(file_path, content) @@ -359,7 +361,10 @@ class Importer: try: print("Importing", doc) + start = timeit.default_timer() doc = self.process_doc(doc) + processing_time = timeit.default_timer() - start + eta = self.get_eta(current_index, total_payload_count, processing_time) frappe.publish_realtime( "data_import_progress", { @@ -368,6 +373,7 @@ class Importer: "docname": doc.name, "success": True, "row_indexes": row_indexes, + "eta": eta }, ) import_log.append( @@ -570,6 +576,13 @@ class Importer: return autoname_field.fieldname return 'name' + def get_eta(self, current, total, processing_time): + remaining = total - current + eta = processing_time * remaining + if not self.last_eta or eta < self.last_eta: + self.last_eta = eta + return self.last_eta + DATE_FORMATS = [ r"%d-%m-%Y", diff --git a/frappe/core/doctype/data_import_beta/data_import_beta.js b/frappe/core/doctype/data_import_beta/data_import_beta.js index 3fb3f2e6ec..a3b4b40133 100644 --- a/frappe/core/doctype/data_import_beta/data_import_beta.js +++ b/frappe/core/doctype/data_import_beta/data_import_beta.js @@ -11,6 +11,10 @@ frappe.ui.form.on('Data Import Beta', { }); frappe.realtime.on('data_import_progress', data => { let percent = Math.floor((data.current * 100) / data.total); + let eta_message = + data.eta < 60 + ? __('ETA {0} seconds', [Math.floor(data.eta)]) + : __('ETA {0} minutes', [Math.floor(data.eta / 60)]); let message; if (data.success) { let message_args = [data.docname, data.current, data.total]; @@ -23,6 +27,7 @@ frappe.ui.form.on('Data Import Beta', { message = __('Skipping ({1} of {2})', [data.current, data.total]); } frm.dashboard.show_progress(__('Import Progress'), percent, message); + frm.page.set_indicator(eta_message, 'orange'); // hide progress when complete if (data.current === data.total) { @@ -68,6 +73,7 @@ frappe.ui.form.on('Data Import Beta', { frm.page.set_primary_action(__('Save'), () => frm.save()); } } + frm.page.set_indicator(__(frm.doc.status), frm.doc.status === 'Success' ? 'green' : 'grey'); }, show_success_message(frm) {