From 12e3cee4a68468fcc17f4b9c67f33c503572d2f0 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 28 Aug 2024 11:37:56 +0200 Subject: [PATCH 1/3] fix!: Skip virtual fields in meta.get_valid_columns --- frappe/model/meta.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 8464282058..e2677bc458 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -221,7 +221,9 @@ class Meta(Document): self._valid_columns = get_table_columns(self.name) else: self._valid_columns = self.default_fields + [ - df.fieldname for df in self.get("fields") if df.fieldtype in data_fieldtypes + df.fieldname + for df in self.get("fields") + if not df.is_virtual and df.fieldtype in data_fieldtypes ] if self.istable: self._valid_columns += list(child_table_fields) From 151de897f1aa46b2b4072baf9065f0fd1d89be2d Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 28 Aug 2024 11:59:25 +0200 Subject: [PATCH 2/3] fix: Use doc.get to safely check for attr This bypasses the bungle during site creations when meta isn't present in the database yet --- frappe/model/meta.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/model/meta.py b/frappe/model/meta.py index e2677bc458..83283b6089 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -223,7 +223,7 @@ class Meta(Document): self._valid_columns = self.default_fields + [ df.fieldname for df in self.get("fields") - if not df.is_virtual and df.fieldtype in data_fieldtypes + if not df.get("is_virtual") and df.fieldtype in data_fieldtypes ] if self.istable: self._valid_columns += list(child_table_fields) From 074da5c5530632ae0507bc6dabeb97b27dde0268 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 28 Aug 2024 18:08:38 +0200 Subject: [PATCH 3/3] fix: Separate meta.get_valid_fields from *columns --- frappe/model/base_document.py | 2 +- frappe/model/meta.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 43e88ffced..1b4b0090fc 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -364,7 +364,7 @@ class BaseDocument: d = _dict() field_values = self.__dict__ - for fieldname in self.meta.get_valid_columns(): + for fieldname in self.meta.get_valid_fields(): value = field_values.get(fieldname) # if no need for sanitization and value is None, continue diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 83283b6089..01f3c91cc8 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -230,6 +230,19 @@ class Meta(Document): return self._valid_columns + def get_valid_fields(self) -> list[str]: + if not hasattr(self, "_valid_fields"): + if frappe.flags.in_install and self.name in self.special_doctypes: + self._valid_fields = get_table_columns(self.name) + else: + self._valid_fields = self.default_fields + [ + df.fieldname for df in self.get("fields") if df.fieldtype in data_fieldtypes + ] + if self.istable: + self._valid_fields += list(child_table_fields) + + return self._valid_fields + def get_table_field_doctype(self, fieldname): return TABLE_DOCTYPES_FOR_DOCTYPE.get(fieldname)