feat: translations in Data Import

This commit is contained in:
Sagar Vora 2021-12-15 18:16:51 +05:30
parent 5389e7eebd
commit 5df970013e
5 changed files with 95 additions and 58 deletions

View file

@ -369,7 +369,7 @@ class DataExporter:
self.append_field_column(frappe._dict({
"fieldname": "name" if dt else self.name_field,
"parent": dt or "",
"label": "ID",
"label": _("ID"),
"fieldtype": "Data",
"reqd": 1,
}), True)

View file

@ -5,6 +5,7 @@
import typing
import frappe
from frappe import _
from frappe.model import (
display_fieldtypes,
no_value_fields,
@ -215,9 +216,9 @@ class Exporter:
for df in self.fields:
is_parent = not df.is_child_table_field
if is_parent:
label = df.label
label = _(df.label)
else:
label = "{0} ({1})".format(df.label, df.child_table_df.label)
label = "{0} ({1})".format(_(df.label), _(df.child_table_df.label))
if label in header:
# this label is already in the header,
@ -227,6 +228,7 @@ class Exporter:
label = "{0}".format(df.fieldname)
else:
label = "{0}.{1}".format(df.child_table_df.fieldname, df.fieldname)
header.append(label)
self.csv_array.append(header)
@ -253,10 +255,10 @@ class Exporter:
self.build_xlsx_response()
def build_csv_response(self):
build_csv_response(self.get_csv_array_for_export(), self.doctype)
build_csv_response(self.get_csv_array_for_export(), _(self.doctype))
def build_xlsx_response(self):
build_xlsx_response(self.get_csv_array_for_export(), self.doctype)
build_xlsx_response(self.get_csv_array_for_export(), _(self.doctype))
def group_children_data_by_parent(self, children_data: typing.Dict[str, list]):
return groupby_metric(children_data, key='parent')

View file

@ -262,7 +262,7 @@ class Importer:
rows = [header_row]
rows += [row.data for row in self.import_file.data if row.row_number in row_indexes]
build_csv_response(rows, self.doctype)
build_csv_response(rows, _(self.doctype))
def print_import_log(self, import_log):
failed_records = [log for log in import_log if not log.success]
@ -1009,18 +1009,12 @@ def build_fields_dict_for_column_matching(parent_doctype):
out = {}
# doctypes and fieldname if it is a child doctype
doctypes = [[parent_doctype, None]] + [
[df.options, df] for df in parent_meta.get_table_fields()
doctypes = [(parent_doctype, None)] + [
(df.options, df) for df in parent_meta.get_table_fields()
]
for doctype, table_df in doctypes:
# name field
name_by_label = (
"ID" if doctype == parent_doctype else "ID ({0})".format(table_df.label)
)
name_by_fieldname = (
"name" if doctype == parent_doctype else "{0}.name".format(table_df.fieldname)
)
name_df = frappe._dict(
{
"fieldtype": "Data",
@ -1031,63 +1025,104 @@ def build_fields_dict_for_column_matching(parent_doctype):
}
)
if doctype != parent_doctype:
if doctype == parent_doctype:
name_headers = (
"name", # fieldname
"ID", # label
_("ID"), # translated label
)
else:
name_headers = (
"{0}.name".format(table_df.fieldname), # fieldname
"ID ({0})".format(table_df.label), # label
"{0} ({1})".format(_("ID"), _(table_df.label)), # translated label
)
name_df.is_child_table_field = True
name_df.child_table_df = table_df
out[name_by_label] = name_df
out[name_by_fieldname] = name_df
for header in name_headers:
out[header] = name_df
# other fields
table_fields = parent_meta.get(
"fields", {"fieldtype": ["in", table_fieldtypes]}
)
for table_field in table_fields:
table_field.translated_label = _(table_field.label)
fields = get_standard_fields(doctype) + frappe.get_meta(doctype).fields
for df in fields:
label = (df.label or "").strip()
fieldtype = df.fieldtype or "Data"
if fieldtype in no_value_fields:
continue
label = (df.label or "").strip()
translated_label = _(label)
parent = df.parent or parent_doctype
if fieldtype not in no_value_fields:
if parent_doctype == doctype:
# for parent doctypes keys will be
# Label
# label
# Label (label)
if not out.get(label):
# if Label is already set, don't set it again
# in case of duplicate column headers
out[label] = df
out[df.fieldname] = df
label_with_fieldname = "{0} ({1})".format(label, df.fieldname)
out[label_with_fieldname] = df
else:
# in case there are multiple table fields with the same doctype
# for child doctypes keys will be
# Label (Table Field Label)
# table_field.fieldname
table_fields = parent_meta.get(
"fields", {"fieldtype": ["in", table_fieldtypes], "options": parent}
)
for table_field in table_fields:
by_label = "{0} ({1})".format(label, table_field.label)
by_fieldname = "{0}.{1}".format(table_field.fieldname, df.fieldname)
# create a new df object to avoid mutation problems
if isinstance(df, dict):
new_df = frappe._dict(df.copy())
else:
new_df = df.as_dict()
if parent_doctype == doctype:
# for parent doctypes keys will be
# Label, fielname, Label (fieldname)
new_df.is_child_table_field = True
new_df.child_table_df = table_field
out[by_label] = new_df
out[by_fieldname] = new_df
for header in (label, translated_label):
# if Label is already set, don't set it again
# in case of duplicate column headers
if header not in out:
out[header] = df
for header in (
df.fieldname,
f"{label} ({df.fieldname})",
f"{translated_label} ({df.fieldname})"
):
out[header] = df
else:
# in case there are multiple table fields with the same doctype
# for child doctypes keys will be
# Label (Table Field Label)
# table_field.fieldname
for table_field in table_fields:
if table_field.options != parent:
continue
# create a new df object to avoid mutation problems
if isinstance(df, dict):
new_df = frappe._dict(df.copy())
else:
new_df = df.as_dict()
new_df.is_child_table_field = True
new_df.child_table_df = table_field
for header in (
# fieldname
"{0}.{1}".format(table_field.fieldname, df.fieldname),
# label
"{0} ({1})".format(label, table_field.label),
# translated label
"{0} ({1})".format(translated_label, table_field.translated_label),
):
out[header] = new_df
# if autoname is based on field
# add an entry for "ID (Autoname Field)"
autoname_field = get_autoname_field(parent_doctype)
if autoname_field:
out["ID ({})".format(autoname_field.label)] = autoname_field
# ID field should also map to the autoname field
out["ID"] = autoname_field
out["name"] = autoname_field
for header in (
"ID ({})".format(autoname_field.label), # label
"{0} ({1})".format(_("ID"), _(autoname_field.label)), # translated label
# ID field should also map to the autoname field
"ID",
_("ID"),
"name",
):
out[header] = autoname_field
return out

View file

@ -260,7 +260,7 @@ def run_doc_method(method, docs=None, dt=None, dn=None, arg=None, args=None):
# build output as csv
if cint(frappe.form_dict.get('as_csv')):
build_csv_response(response, doc.doctype.replace(' ', ''))
build_csv_response(response, _(doc.doctype).replace(' ', ''))
return
frappe.response['message'] = response

View file

@ -343,11 +343,11 @@ function get_fields_as_options(doctype, column_map) {
return [].concat(
...keys.map(key => {
return column_map[key].map(df => {
let label = df.label;
let label = __(df.label);
let value = df.fieldname;
if (doctype !== key) {
let table_field = frappe.meta.get_docfield(doctype, key);
label = `${df.label} (${table_field.label})`;
label = `${__(df.label)} (${__(table_field.label)})`;
value = `${table_field.fieldname}.${df.fieldname}`;
}
return {