From 9b7c36f3d983f903f34c454afb59f2972a8cbe65 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 23 Jul 2026 12:51:30 +0530 Subject: [PATCH] fix: do not translate default record lookup keys Company.create_default_departments named and looked up the root Department via _("All Departments"), which resolves in the session language. A site set up in a non-English language stores the root translated, and a company created later from a session in another language misses it and inserts a second root, corrupting the tree. Resolve the root once with get_root_of (falling back to the canonical English name on fresh installs) and reuse it for the root record, the exists-guard and the child departments' parent. Also stop translating lookups of records install_fixtures stores under English names: Price List "Standard Selling" and Print Headings "Credit Note" / "Debit Note". Same class as the root Item Group fix (#57386, issue #57345). --- .../controllers/sales_and_purchase_return.py | 4 +-- erpnext/setup/doctype/company/company.py | 33 ++++++++++--------- erpnext/setup/doctype/company/test_company.py | 27 +++++++++++++++ erpnext/stock/doctype/item/item.py | 2 +- 4 files changed, 47 insertions(+), 19 deletions(-) diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index 69579b5b8e6..85af0df6321 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -459,11 +459,11 @@ def make_return_doc(doctype: str, source_name: str, target_doc=None, return_agai # look for Print Heading "Credit Note" if not doc.select_print_heading: - doc.select_print_heading = frappe.get_cached_value("Print Heading", _("Credit Note")) + doc.select_print_heading = frappe.get_cached_value("Print Heading", "Credit Note") elif doctype == "Purchase Invoice": # look for Print Heading "Debit Note" - doc.select_print_heading = frappe.get_cached_value("Print Heading", _("Debit Note")) + doc.select_print_heading = frappe.get_cached_value("Print Heading", "Debit Note") elif doctype == "Delivery Note": # manual additions to the return should hit the return warehous, too doc.set_warehouse = default_warehouse_for_sales_return diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 99179fc27b3..e0546122344 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -23,7 +23,7 @@ from frappe.utils import ( nowdate, today, ) -from frappe.utils.nestedset import NestedSet, rebuild_tree +from frappe.utils.nestedset import NestedSet, get_root_of, rebuild_tree from erpnext.accounts.doctype.account.account import get_account_currency from erpnext.accounts.doctype.financial_report_template.financial_report_template import ( @@ -501,91 +501,92 @@ class Company(NestedSet): ) def create_default_departments(self): + root = get_root_of("Department") or "All Departments" records = [ # Department { "doctype": "Department", - "department_name": _("All Departments"), + "department_name": root, "is_group": 1, "parent_department": "", - "__condition": lambda: not frappe.db.exists("Department", _("All Departments")), + "__condition": lambda: not frappe.db.exists("Department", root), }, { "doctype": "Department", "department_name": _("Accounts"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Marketing"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Sales"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Purchase"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Operations"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Production"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Dispatch"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Customer Service"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Human Resources"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Management"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Quality Management"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Research & Development"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, { "doctype": "Department", "department_name": _("Legal"), - "parent_department": _("All Departments"), + "parent_department": root, "company": self.name, }, ] diff --git a/erpnext/setup/doctype/company/test_company.py b/erpnext/setup/doctype/company/test_company.py index 7ec5bee5d0e..ea43ff9c373 100644 --- a/erpnext/setup/doctype/company/test_company.py +++ b/erpnext/setup/doctype/company/test_company.py @@ -1,11 +1,13 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: GNU General Public License v3. See license.txt import json +from unittest.mock import patch import frappe from frappe import _ from frappe.query_builder.functions import IfNull from frappe.utils import random_string +from frappe.utils.nestedset import get_root_of from erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts import ( get_charts_for_country, @@ -187,6 +189,31 @@ class TestCompany(ERPNextTestSuite): return get_no_of_children([company], 0) + def test_default_departments_ignore_session_translations(self): + self.assertEqual(get_root_of("Department"), "All Departments") + + translations = {"All Departments": "Alle Abteilungen", "Accounts": "Buchhaltung"} + with patch("frappe.translate.get_all_translations", return_value=translations): + company = frappe.new_doc("Company") + company.company_name = "Dept Translation Test Co" + company.abbr = "DTTC" + company.default_currency = "INR" + company.country = "India" + company.insert() + + self.assertFalse(frappe.db.exists("Department", "Alle Abteilungen")) + self.assertEqual( + frappe.get_all("Department", filters={"parent_department": ("is", "not set")}, pluck="name"), + ["All Departments"], + ) + + departments = frappe.get_all( + "Department", filters={"company": company.name}, fields=["name", "parent_department"] + ) + self.assertTrue(departments) + self.assertEqual({d.parent_department for d in departments}, {"All Departments"}) + self.assertIn("Buchhaltung - DTTC", [d.name for d in departments]) + def test_change_parent_company(self): child_company = frappe.get_doc("Company", "_Test Company 5") diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 8da6652d1bb..d369e7f3e68 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -291,7 +291,7 @@ class Item(Document): if not price_list: price_list = frappe.get_single_value( "Selling Settings", "selling_price_list" - ) or frappe.db.get_value("Price List", _("Standard Selling")) + ) or frappe.db.get_value("Price List", "Standard Selling") if price_list: item_price = frappe.get_doc( {