From ca8f3e0f0ba77587d9dad906328f309b40f0a6be Mon Sep 17 00:00:00 2001 From: sokumon Date: Sun, 2 Mar 2025 21:28:54 +0530 Subject: [PATCH 1/9] feat: translate report data --- frappe/desk/query_report.py | 13 +++++++++++++ .../public/js/frappe/views/reports/query_report.js | 12 +++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 98cd6e1e53..cfd2d7dba1 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -111,6 +111,10 @@ def generate_report_result( if cint(report.add_total_row) and result and not skip_total_row: result = add_total_row(result, columns, is_tree=is_tree, parent_field=parent_field) + translate_data = filters.get("translate_data") + if translate_data: + result = translate_report_data(result) + return { "result": result, "columns": columns, @@ -809,3 +813,12 @@ def validate_filters_permissions(report_name, filters=None, user=None): linked_doctype, filters[field.fieldname] ) ) + + +def translate_report_data(data): + # remove total row + data = data[:-1] + for d in data: + for field, value in d.items(): + d[field] = _(value) + return data diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 5a89bdabfe..da3561d578 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -173,6 +173,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { frappe.run_serially([ () => this.get_report_doc(), () => this.get_report_settings(), + () => this.add_standard_checkbox(), () => this.setup_progress_bar(), () => this.setup_page_head(), () => this.refresh_report(route_options), @@ -529,7 +530,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { const { filters = [] } = this.report_settings; let filter_area = this.page.page_form; - this.filters = filters .map((df) => { if (df.fieldtype === "Break") return; @@ -2113,4 +2113,14 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { get get_values() { return this.get_filter_values; } + + add_standard_checkbox() { + if (frappe.boot.lang == "en") return; + let filter_config = { + fieldname: "translate_data", + fieldtype: "Check", + label: __("Translate Data"), + }; + this.report_settings.filters.push(filter_config); + } }; From 684f7715e7244ffe9eea161e7ad015328ff64eb8 Mon Sep 17 00:00:00 2001 From: sokumon Date: Sun, 2 Mar 2025 21:38:03 +0530 Subject: [PATCH 2/9] fix: total_row is handled properly --- frappe/desk/query_report.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index cfd2d7dba1..1ced18586c 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -817,8 +817,10 @@ def validate_filters_permissions(report_name, filters=None, user=None): def translate_report_data(data): # remove total row + total_row = data[-1] data = data[:-1] for d in data: for field, value in d.items(): d[field] = _(value) + data.append(total_row) return data From 7e5f63da39d0eaa7a62f45a7f2bf590936099fbb Mon Sep 17 00:00:00 2001 From: sokumon Date: Sun, 2 Mar 2025 22:59:58 +0530 Subject: [PATCH 3/9] fix: check if filters are a dict --- frappe/desk/query_report.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 1ced18586c..e246fb2fbd 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -111,7 +111,8 @@ def generate_report_result( if cint(report.add_total_row) and result and not skip_total_row: result = add_total_row(result, columns, is_tree=is_tree, parent_field=parent_field) - translate_data = filters.get("translate_data") + if isinstance(filters, dict): + translate_data = filters.get("translate_data") if translate_data: result = translate_report_data(result) From 86a0482cbc3982a86b5d2090e39ba924f7e5407c Mon Sep 17 00:00:00 2001 From: sokumon Date: Sun, 2 Mar 2025 23:13:03 +0530 Subject: [PATCH 4/9] fix: proper identation --- frappe/desk/query_report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index e246fb2fbd..ee6a986bf9 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -113,8 +113,8 @@ def generate_report_result( if isinstance(filters, dict): translate_data = filters.get("translate_data") - if translate_data: - result = translate_report_data(result) + if translate_data: + result = translate_report_data(result) return { "result": result, From 299d7bfccb97ad880145dd8fc6cfb51a9ff15294 Mon Sep 17 00:00:00 2001 From: sokumon Date: Mon, 3 Mar 2025 18:54:03 +0530 Subject: [PATCH 5/9] fix: simplify function and better naming --- frappe/desk/query_report.py | 15 +++++---------- .../js/frappe/views/reports/query_report.js | 4 ++-- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index ee6a986bf9..507ec4cf73 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -111,10 +111,8 @@ def generate_report_result( if cint(report.add_total_row) and result and not skip_total_row: result = add_total_row(result, columns, is_tree=is_tree, parent_field=parent_field) - if isinstance(filters, dict): - translate_data = filters.get("translate_data") - if translate_data: - result = translate_report_data(result) + if isinstance(filters, dict) and filters.get("translate_data"): + result = translate_report_data(result) return { "result": result, @@ -817,11 +815,8 @@ def validate_filters_permissions(report_name, filters=None, user=None): def translate_report_data(data): - # remove total row - total_row = data[-1] - data = data[:-1] for d in data: - for field, value in d.items(): - d[field] = _(value) - data.append(total_row) + if isinstance(d, dict): + for field, value in d.items(): + d[field] = _(value) return data diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index da3561d578..7fe7677732 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -173,7 +173,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { frappe.run_serially([ () => this.get_report_doc(), () => this.get_report_settings(), - () => this.add_standard_checkbox(), + () => this.add_translate_data_checkbox(), () => this.setup_progress_bar(), () => this.setup_page_head(), () => this.refresh_report(route_options), @@ -2114,7 +2114,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { return this.get_filter_values; } - add_standard_checkbox() { + add_translate_data_checkbox() { if (frappe.boot.lang == "en") return; let filter_config = { fieldname: "translate_data", From c17311fbb06ec1a00654ff693c6bd8d6348dea93 Mon Sep 17 00:00:00 2001 From: sokumon Date: Mon, 3 Mar 2025 19:43:45 +0530 Subject: [PATCH 6/9] fix: translate total word --- frappe/public/js/frappe/views/reports/query_report.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 7fe7677732..6a2da6ea78 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -554,7 +554,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { // filter values have not changed return; } - // clear previous_filters after 10 seconds, to allow refresh for new data this.previous_filters = current_filters; setTimeout(() => (this.previous_filters = null), 10000); @@ -1249,7 +1248,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } if (column.colIndex === index && !value) { - value = "Total"; + value = __("Total"); column = { fieldtype: "Data" }; // avoid type issues for value if Date column } else if (["Currency", "Float"].includes(column.fieldtype)) { // proxy for currency and float From aaa456c2abbe89bc36d09038a31a6a592c43ee77 Mon Sep 17 00:00:00 2001 From: sokumon Date: Tue, 4 Mar 2025 12:06:43 +0530 Subject: [PATCH 7/9] fix: only translate strings --- frappe/desk/query_report.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 507ec4cf73..554539912b 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -818,5 +818,6 @@ def translate_report_data(data): for d in data: if isinstance(d, dict): for field, value in d.items(): - d[field] = _(value) + if isinstance(value, str): + d[field] = _(value) return data From faf0d42e0303082d15bcd77f79dc354bd7160801 Mon Sep 17 00:00:00 2001 From: sokumon Date: Tue, 4 Mar 2025 14:07:08 +0530 Subject: [PATCH 8/9] fix: handle total row properly while translating --- frappe/desk/query_report.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 554539912b..fcdd69576d 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -815,9 +815,8 @@ def validate_filters_permissions(report_name, filters=None, user=None): def translate_report_data(data): - for d in data: - if isinstance(d, dict): - for field, value in d.items(): - if isinstance(value, str): - d[field] = _(value) + for d in data[:-1] if isinstance(data[-1], list) else data: + for field, value in d.items(): + if isinstance(value, str): + d[field] = _(value) return data From a601f9daa5536d32c60a1b648f0f447445499bdb Mon Sep 17 00:00:00 2001 From: sokumon Date: Tue, 4 Mar 2025 14:27:35 +0530 Subject: [PATCH 9/9] fix: use total_row flag to check --- frappe/desk/query_report.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index fcdd69576d..32413f52dd 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -112,7 +112,8 @@ def generate_report_result( result = add_total_row(result, columns, is_tree=is_tree, parent_field=parent_field) if isinstance(filters, dict) and filters.get("translate_data"): - result = translate_report_data(result) + total_row = cint(report.add_total_row) and result and not skip_total_row + result = translate_report_data(result, total_row) return { "result": result, @@ -814,8 +815,8 @@ def validate_filters_permissions(report_name, filters=None, user=None): ) -def translate_report_data(data): - for d in data[:-1] if isinstance(data[-1], list) else data: +def translate_report_data(data, total_row): + for d in data[:-1] if total_row else data: for field, value in d.items(): if isinstance(value, str): d[field] = _(value)