From 76c04fef274f83dfd26cca659e32aeb6ca36b528 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Wed, 10 Sep 2025 08:07:51 +0200 Subject: [PATCH] refactor: move virtual child table check into get_table_fields --- frappe/model/document.py | 6 ++---- frappe/model/meta.py | 9 +++++++-- frappe/model/rename_doc.py | 4 +--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 0ccc5742bb..36cd1f509f 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -1983,10 +1983,8 @@ def get_lazy_controller(doctype): # Dynamically construct a class that subclasses LazyDocument and original controller. lazy_controller = type(f"Lazy{original_controller.__name__}", (LazyDocument, original_controller), {}) - for fieldname, child_doctype in meta._table_doctypes.items(): - if meta.get_field(fieldname).is_virtual: - continue - setattr(lazy_controller, fieldname, LazyChildTable(fieldname, child_doctype)) + for df in meta.get_table_fields(include_virtual=False): + setattr(lazy_controller, df.fieldname, LazyChildTable(df.fieldname, df.options)) lazy_controllers[doctype] = lazy_controller return lazy_controllers[doctype] diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 5d45b1ef2e..2be3bee9d3 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -221,8 +221,8 @@ class Meta(Document): return set_only_once_fields - def get_table_fields(self): - return self._table_fields + def get_table_fields(self, include_virtual=True): + return self._table_fields if include_virtual else self._non_virtual_table_fields def get_global_search_fields(self): """Return list of fields with `in_global_search` set and `name` if set.""" @@ -491,6 +491,11 @@ class Meta(Document): self._table_fields = DOCTYPE_TABLE_FIELDS else: self._table_fields = self.get("fields", {"fieldtype": ["in", table_fields]}) + self._non_virtual_table_fields = ( + [] + if self.is_virtual + else self.get("fields", {"fieldtype": ["in", table_fields], "is_virtual": 0}) + ) # table fieldname: doctype map self._table_doctypes = {field.fieldname: field.options for field in self._table_fields} diff --git a/frappe/model/rename_doc.py b/frappe/model/rename_doc.py index 18bb3ecfb4..a75552d0a3 100644 --- a/frappe/model/rename_doc.py +++ b/frappe/model/rename_doc.py @@ -416,9 +416,7 @@ def rename_doctype(doctype: str, old: str, new: str) -> None: def update_child_docs(old: str, new: str, meta: "Meta") -> None: # update "parent" - for df in meta.get_table_fields(): - if df.is_virtual or is_virtual_doctype(df.options): - continue + for df in meta.get_table_fields(include_virtual=False): ( frappe.qb.update(df.options) .set("parent", new)