From b3859d9fa3a1be115afa87cb7947df0d3575790e Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 16 Jan 2025 17:03:42 +0530 Subject: [PATCH] fix: Don't assume homogeneous data in meta tables Steps to reproduce: - enable developer mode (doesn't happen in prod) - Save a document with set only once fields - Reload the page (requests meta again which is now polluted) This is new category of bug surfaced because meta objects now live longer than request and all kinds of weird `self._cached_property` starts getting serialized. Co-Authored-By: ruthra kumar --- frappe/core/doctype/doctype/test_doctype.py | 8 ++++++++ frappe/model/meta.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/frappe/core/doctype/doctype/test_doctype.py b/frappe/core/doctype/doctype/test_doctype.py index 93505b393a..bfead2aabc 100644 --- a/frappe/core/doctype/doctype/test_doctype.py +++ b/frappe/core/doctype/doctype/test_doctype.py @@ -796,6 +796,14 @@ class TestDocType(IntegrationTestCase): ) self.assertRaises(frappe.ValidationError, recursive_dt.insert) + def test_meta_serialization(self): + doctype = new_doctype( + fields=[{"fieldname": "some_fieldname", "fieldtype": "Data", "set_only_once": 1}] + ).insert() + doc = frappe.new_doc(doctype.name, some_fieldname="something").insert() + doc.save() + frappe.get_meta(doctype.name).as_dict() + def new_doctype( name: str | None = None, diff --git a/frappe/model/meta.py b/frappe/model/meta.py index da688b52fd..5725dcf2bd 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -188,6 +188,8 @@ class Meta(Document): def as_dict(self, no_nulls=False): def serialize(doc): + if isinstance(doc, dict): + return doc.copy() out = {} for key, value in doc.__dict__.items(): if isinstance(value, list | tuple):