From 7239e6ed8cf391e0d296d0f29a45452d49c8cfcb Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 23 Jul 2026 12:50:08 +0530 Subject: [PATCH 1/2] fix: do not translate root Item Group lookup key _("All Item Groups") resolves in the session language, so for non-English users the db.exists lookup missed the root (stored in English) and new groups were saved parentless, becoming uneditable second roots. Closes #57345 --- erpnext/setup/doctype/item_group/item_group.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index 920e98cf528..0ff0088a8d2 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -32,8 +32,8 @@ class ItemGroup(NestedSet): def validate(self): if not self.parent_item_group and not frappe.in_test: - if frappe.db.exists("Item Group", _("All Item Groups")): - self.parent_item_group = _("All Item Groups") + if frappe.db.exists("Item Group", "All Item Groups"): + self.parent_item_group = "All Item Groups" self.validate_item_group_defaults() self.check_item_tax() From d197d5685eb5c11f45c0dd7d498d989192d0e604 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 23 Jul 2026 14:03:54 +0530 Subject: [PATCH 2/2] fix: resolve Item Group tree root structurally A name lookup misses roots created under a translated name (pre-#49875 setups) or renamed roots. Resolve the first parentless group by lft and guard against self-parenting when the root itself is saved. --- erpnext/setup/doctype/item_group/item_group.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index 0ff0088a8d2..8e1b7ec73f2 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -32,8 +32,11 @@ class ItemGroup(NestedSet): def validate(self): if not self.parent_item_group and not frappe.in_test: - if frappe.db.exists("Item Group", "All Item Groups"): - self.parent_item_group = "All Item Groups" + root = frappe.db.get_value( + "Item Group", {"parent_item_group": ("is", "not set"), "is_group": 1}, order_by="lft asc" + ) + if root and root != self.name: + self.parent_item_group = root self.validate_item_group_defaults() self.check_item_tax()