From 4165baa29f57254d9406e7c9f403c552a915616d Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Wed, 8 Sep 2021 16:28:05 +0530 Subject: [PATCH] fix: General Ledger translation issues (#27298) * fix: remove translations from GL report options Options need not be translated, their display label gets translated client side. * fix: make group by options translatable * ci: semgrep rule for translated options in report Co-authored-by: Ankush Menat (cherry picked from commit fa819f2fb0523276f64ed80c885088ac0596933d) # Conflicts: # .github/helper/semgrep_rules/report.yml # erpnext/accounts/report/general_ledger/general_ledger.py --- .github/helper/semgrep_rules/report.yml | 34 +++++++++++++++++++ .../report/general_ledger/general_ledger.py | 34 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 .github/helper/semgrep_rules/report.yml diff --git a/.github/helper/semgrep_rules/report.yml b/.github/helper/semgrep_rules/report.yml new file mode 100644 index 00000000000..f2a9b167399 --- /dev/null +++ b/.github/helper/semgrep_rules/report.yml @@ -0,0 +1,34 @@ +rules: +- id: frappe-missing-translate-function-in-report-python + paths: + include: + - "**/report" + exclude: + - "**/regional" + pattern-either: + - patterns: + - pattern: | + {..., "label": "...", ...} + - pattern-not: | + {..., "label": _("..."), ...} + - patterns: + - pattern: dict(..., label="...", ...) + - pattern-not: dict(..., label=_("..."), ...) + message: | + All user facing text must be wrapped in translate function. Please refer to translation documentation. https://frappeframework.com/docs/user/en/guides/basics/translations + languages: [python] + severity: ERROR + +- id: frappe-translated-values-in-business-logic + paths: + include: + - "**/report" + patterns: + - pattern-inside: | + {..., filters: [...], ...} + - pattern: | + {..., options: [..., __("..."), ...], ...} + message: | + Using translated values in options field will require you to translate the values while comparing in business logic. Instead of passing translated labels provide objects that contain both label and value. e.g. { label: __("Option value"), value: "Option value"} + languages: [javascript] + severity: ERROR diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index 41088370897..8d5ad0461ec 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -73,13 +73,23 @@ def validate_filters(filters, account_details): if not account_details.get(account): frappe.throw(_("Account {0} does not exists").format(account)) +<<<<<<< HEAD if filters.get("account") and filters.get("group_by") == "Group by Account": filters.account = frappe.parse_json(filters.get("account")) +======= + if (filters.get("account") and filters.get("group_by") == 'Group by Account'): + filters.account = frappe.parse_json(filters.get('account')) +>>>>>>> fa819f2fb0 (fix: General Ledger translation issues (#27298)) for account in filters.account: if account_details[account].is_group == 0: frappe.throw(_("Can not filter based on Child Account, if grouped by Account")) +<<<<<<< HEAD if filters.get("voucher_no") and filters.get("group_by") in ["Group by Voucher"]: +======= + if (filters.get("voucher_no") + and filters.get("group_by") in ['Group by Voucher']): +>>>>>>> fa819f2fb0 (fix: General Ledger translation issues (#27298)) frappe.throw(_("Can not filter based on Voucher No, if grouped by Voucher")) if filters.from_date > filters.to_date: @@ -359,7 +369,11 @@ def get_data_with_opening_closing(filters, account_details, accounting_dimension # Opening for filtered account data.append(totals.opening) +<<<<<<< HEAD if filters.get("group_by") != "Group by Voucher (Consolidated)": +======= + if filters.get("group_by") != 'Group by Voucher (Consolidated)': +>>>>>>> fa819f2fb0 (fix: General Ledger translation issues (#27298)) for acc, acc_dict in iteritems(gle_map): # acc if acc_dict.entries: @@ -407,10 +421,17 @@ def get_totals_dict(): def group_by_field(group_by): +<<<<<<< HEAD if group_by == "Group by Party": return "party" elif group_by in ["Group by Voucher (Consolidated)", "Group by Account"]: return "account" +======= + if group_by == 'Group by Party': + return 'party' + elif group_by in ['Group by Voucher (Consolidated)', 'Group by Account']: + return 'account' +>>>>>>> fa819f2fb0 (fix: General Ledger translation issues (#27298)) else: return "voucher_no" @@ -500,6 +521,19 @@ def get_accountwise_gle(filters, accounting_dimensions, gl_entries, gle_map): keylist.append(gle.get(dim)) keylist.append(gle.get("cost_center")) +<<<<<<< HEAD +======= + elif gle.posting_date <= to_date: + update_value_in_dict(gle_map[gle.get(group_by)].totals, 'total', gle) + update_value_in_dict(totals, 'total', gle) + if filters.get("group_by") != 'Group by Voucher (Consolidated)': + gle_map[gle.get(group_by)].entries.append(gle) + elif filters.get("group_by") == 'Group by Voucher (Consolidated)': + keylist = [gle.get("voucher_type"), gle.get("voucher_no"), gle.get("account")] + for dim in accounting_dimensions: + keylist.append(gle.get(dim)) + keylist.append(gle.get("cost_center")) +>>>>>>> fa819f2fb0 (fix: General Ledger translation issues (#27298)) key = tuple(keylist) if key not in consolidated_gle: consolidated_gle.setdefault(key, gle)