fix: Persistent template warnings

This commit is contained in:
Faris Ansari 2019-09-16 01:35:55 +05:30
parent 6f2fdbf106
commit dca054aa0c
4 changed files with 49 additions and 14 deletions

View file

@ -305,21 +305,26 @@ class Importer:
out = self.get_data_for_import_preview()
fields = out["fields"]
data = out["data"]
warnings = []
# validate link field values
missing_link_values = self.get_missing_link_field_values(fields, data)
if missing_link_values:
return {"missing_link_values": missing_link_values}
for d in missing_link_values:
msg = _('The following linked values are missing for the Document Type {0}:').format(frappe.bold(_(d.doctype)))
msg += ' ' + ', '.join(d.missing_values)
warnings.append(msg)
# parse import data
payloads = self.get_payloads_for_import(fields, data)
# collect warnings
warnings = []
for payload in payloads:
warnings += payload.warnings
if warnings:
return {"warnings": warnings}
self.data_import.db_set("template_warnings", json.dumps(warnings))
frappe.publish_realtime("data_import_refresh")
return
# setup import log
if self.data_import.import_log:
@ -424,6 +429,7 @@ class Importer:
"""
doc = {}
warnings = []
mandatory_fields = []
doctypes = set([df.parent for df in fields if df.parent])
# first row is included by default
@ -458,14 +464,12 @@ class Importer:
if value in INVALID_VALUES:
if df.reqd:
warnings.append(
_("Row {0}: {1} is a mandatory field").format(row_index, frappe.bold(df.label))
)
mandatory_fields.append(frappe._dict(row_number=row_number, df=df))
continue
else:
value = None
doc[df.fieldname] = value = self.parse_value(value, df)
doc[df.fieldname] = self.parse_value(value, df)
return doc
parsed_docs = {}
@ -476,6 +480,7 @@ class Importer:
# then skip
continue
row_number = row[0]
column_indexes = get_column_indexes(doctype)
values = [row[i] for i in column_indexes]
@ -484,7 +489,7 @@ class Importer:
continue
docfields = [fields[i] for i in column_indexes]
doc = parse_doc(doctype, docfields, values, row_index)
doc = parse_doc(doctype, docfields, values, row_number)
parsed_docs[doctype] = parsed_docs.get(doctype, [])
parsed_docs[doctype].append(doc)
@ -499,6 +504,23 @@ class Importer:
table_field = table_dfs[0]
doc[table_field.fieldname] = docs
if mandatory_fields:
df_by_row_number = {}
for d in mandatory_fields:
df_by_row_number.setdefault(d.row_number, [])
df_by_row_number[d.row_number].append(d.df)
for row_number, fields in df_by_row_number.items():
if len(fields) == 1:
warnings.append(
_("Row {0}: {1} is a mandatory field").format(row_number, fields[0].label)
)
else:
fields_string = ', '.join([df.label for df in fields])
warnings.append(
_("Row {0}: {1} are mandatory fields").format(row_number, fields_string)
)
return doc, rows, data[len(rows) :], warnings
def get_first_parent_column_index(self, fields):

View file

@ -157,11 +157,14 @@ frappe.ui.form.on('Data Import Beta', {
show_import_preview(frm, preview_data) {
let import_log = JSON.parse(frm.doc.import_log || '[]');
let warnings = JSON.parse(frm.doc.template_warnings || '[]');
warnings = warnings.concat(preview_data.warnings || []);
if (frm.import_preview) {
frm.import_preview.preview_data = preview_data;
frm.import_preview.import_log = import_log;
frm.import_preview.refresh();
frm.import_preview.render_warnings(warnings);
return;
}
@ -171,6 +174,7 @@ frappe.ui.form.on('Data Import Beta', {
doctype: frm.doc.reference_doctype,
preview_data,
import_log,
warnings,
events: {
remap_column(header_row_index, fieldname) {
let template_options = JSON.parse(frm.doc.template_options || '{}');

View file

@ -15,6 +15,7 @@
"section_break_7",
"date_format",
"template_options",
"template_warnings",
"section_import_preview",
"import_preview",
"import_log_section",
@ -107,9 +108,17 @@
"default": "Pending",
"fieldname": "status",
"fieldtype": "Select",
"hidden": 1,
"label": "Status",
"options": "Pending\nSuccess\nPartial Success",
"read_only": 1
},
{
"fieldname": "template_warnings",
"fieldtype": "Code",
"label": "Template Warnings",
"options": "JSON"
},
}
],
"hide_toolbar": 1,

View file

@ -14,12 +14,13 @@ const SVG_ICONS = {
};
frappe.data_import.ImportPreview = class ImportPreview {
constructor({ wrapper, doctype, preview_data, import_log, events = {} }) {
constructor({ wrapper, doctype, preview_data, import_log, warnings, events = {} }) {
frappe.import_preview = this;
this.wrapper = wrapper;
this.doctype = doctype;
this.preview_data = preview_data;
this.events = events;
this.warnings = warnings;
this.import_log = import_log;
frappe.model.with_doctype(doctype, () => {
@ -31,7 +32,6 @@ 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.warnings = this.preview_data.warnings;
this.make_wrapper();
this.prepare_columns();
this.prepare_data();
@ -73,7 +73,7 @@ frappe.data_import.ImportPreview = class ImportPreview {
focusable: false,
align: 'left',
header_row_index,
width: column_width,
width: df.label === 'Sr. No' ? 60 : column_width,
format: (value, row, column, data) => {
let html = `<div class="text-muted">${value}</div>`;
if (df.label === 'Sr. No' && this.is_row_imported(row)) {
@ -123,11 +123,11 @@ frappe.data_import.ImportPreview = class ImportPreview {
if (warnings.length > 0) {
let warning_html = warnings
.map(warning => {
return `<div style="line-height: 2">${warning}</div>`;
return `<li>${warning}</li>`;
})
.join('');
html = `<div class="border text-muted padding rounded margin-bottom">${warning_html}</div>`;
html = `<ul>${warning_html}</ul>`;
}
this.$warnings.html(html);
}