From e6bad301b80901c23438bba3043dfa45cbad5b43 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 16 Jan 2025 19:03:13 +0530 Subject: [PATCH] refactor: Use @cached_property instead of implmenting it --- frappe/core/doctype/doctype/test_doctype.py | 4 +- frappe/model/meta.py | 73 ++++++++++++--------- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/frappe/core/doctype/doctype/test_doctype.py b/frappe/core/doctype/doctype/test_doctype.py index bfead2aabc..5915487070 100644 --- a/frappe/core/doctype/doctype/test_doctype.py +++ b/frappe/core/doctype/doctype/test_doctype.py @@ -798,10 +798,12 @@ class TestDocType(IntegrationTestCase): def test_meta_serialization(self): doctype = new_doctype( - fields=[{"fieldname": "some_fieldname", "fieldtype": "Data", "set_only_once": 1}] + fields=[{"fieldname": "some_fieldname", "fieldtype": "Data", "set_only_once": 1}], + is_submittable=1, ).insert() doc = frappe.new_doc(doctype.name, some_fieldname="something").insert() doc.save() + doc.submit() frappe.get_meta(doctype.name).as_dict() diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 5725dcf2bd..8fadb05738 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -19,7 +19,7 @@ import json import os import typing from datetime import datetime -from functools import singledispatchmethod +from functools import cached_property, singledispatchmethod from types import NoneType import click @@ -238,16 +238,19 @@ class Meta(Document): def get_set_only_once_fields(self): """Return fields with `set_only_once` set""" - if not hasattr(self, "_set_only_once_fields"): - self._set_only_once_fields = self.get("fields", {"set_only_once": 1}) - fieldnames = [d.fieldname for d in self._set_only_once_fields] - - for df in self.standard_set_once_fields: - if df.fieldname not in fieldnames: - self._set_only_once_fields.append(df) - return self._set_only_once_fields + @cached_property + def _set_only_once_fields(self): + set_only_once_fields = self.get("fields", {"set_only_once": 1}) + fieldnames = [d.fieldname for d in set_only_once_fields] + + for df in self.standard_set_once_fields: + if df.fieldname not in fieldnames: + set_only_once_fields.append(df) + + return set_only_once_fields + def get_table_fields(self): return self._table_fields @@ -260,34 +263,40 @@ class Meta(Document): return fields def get_valid_columns(self) -> list[str]: - if not hasattr(self, "_valid_columns"): - table_exists = frappe.db.table_exists(self.name) - if self.name in self.special_doctypes and table_exists: - self._valid_columns = get_table_columns(self.name) - else: - self._valid_columns = self.default_fields + [ - df.fieldname - for df in self.get("fields") - if not df.get("is_virtual") and df.fieldtype in data_fieldtypes - ] - if self.istable: - self._valid_columns += list(child_table_fields) - return self._valid_columns - def get_valid_fields(self) -> list[str]: - if not hasattr(self, "_valid_fields"): - if (frappe.flags.in_install or frappe.flags.in_migrate) 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) + @cached_property + def _valid_columns(self): + table_exists = frappe.db.table_exists(self.name) + if self.name in self.special_doctypes and table_exists: + valid_columns = get_table_columns(self.name) + else: + valid_columns = self.default_fields + [ + df.fieldname + for df in self.get("fields") + if not df.get("is_virtual") and df.fieldtype in data_fieldtypes + ] + if self.istable: + valid_columns += list(child_table_fields) + return valid_columns + + def get_valid_fields(self) -> list[str]: return self._valid_fields + @cached_property + def _valid_fields(self): + if (frappe.flags.in_install or frappe.flags.in_migrate) and self.name in self.special_doctypes: + valid_fields = get_table_columns(self.name) + else: + valid_fields = self.default_fields + [ + df.fieldname for df in self.get("fields") if df.fieldtype in data_fieldtypes + ] + if self.istable: + valid_fields += list(child_table_fields) + + return valid_fields + def get_table_field_doctype(self, fieldname): return TABLE_DOCTYPES_FOR_DOCTYPE.get(fieldname)