From caf415f13e529dd714115bef5f5698e00d60ded5 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Fri, 6 Jun 2025 18:34:17 +0530 Subject: [PATCH] feat: `get_settings` (#32821) * feat: get_settings get_cached_value doesn't work well with singles because you either need to pass `None` or repeat doctype name... both are awekward and easy to shoot yourself in foot with. * refactor: Use cached settings --- frappe/__init__.py | 13 +++++++++++++ frappe/core/doctype/user/user.py | 2 +- frappe/model/naming.py | 4 +--- .../doctype/print_settings/print_settings.py | 7 +------ frappe/tests/test_test_utils.py | 4 ++-- .../website/doctype/blog_settings/blog_settings.py | 4 ++-- frappe/www/sitemap.py | 2 +- 7 files changed, 21 insertions(+), 15 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index d4f335f052..46cc2d6a02 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -1017,6 +1017,19 @@ def get_cached_value( return values +def get_settings(setting: str, fieldname: str, /, *, as_dict: bool = False, cache=True): + """Return the value associated with the given fieldname from settings DocType. + + Usage: + telemetry_enabled = frappe.get_settings("System Settings", "telemetry_enabled") + """ + + if cache: + return get_cached_value(setting, setting, fieldname=fieldname, as_dict=as_dict) + else: + return frappe.db.get_single_value(setting, fieldname=fieldname, cache=False) + + def get_last_doc( doctype, filters: FilterSignature | None = None, diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 04d7daf970..c19d0ae6f4 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -1048,7 +1048,7 @@ def sign_up(email: str, full_name: str, redirect_to: str) -> tuple[int, str]: user.insert() # set default signup role as per Portal Settings - default_role = frappe.db.get_single_value("Portal Settings", "default_role") + default_role = frappe.get_settings("Portal Settings", "default_role") if default_role: user.add_roles(default_role) diff --git a/frappe/model/naming.py b/frappe/model/naming.py index ff64d10b0d..8ead03117e 100644 --- a/frappe/model/naming.py +++ b/frappe/model/naming.py @@ -538,9 +538,7 @@ def _set_amended_name(doc): "Amended Document Naming Settings", {"document_type": doc.doctype}, "action", cache=True ) if not amend_naming_rule: - amend_naming_rule = frappe.db.get_single_value( - "Document Naming Settings", "default_amend_naming", cache=True - ) + amend_naming_rule = frappe.get_settings("Document Naming Settings", "default_amend_naming") if amend_naming_rule == "Default Naming": return diff --git a/frappe/printing/doctype/print_settings/print_settings.py b/frappe/printing/doctype/print_settings/print_settings.py index 4ca4b3736e..bfda52c82d 100644 --- a/frappe/printing/doctype/print_settings/print_settings.py +++ b/frappe/printing/doctype/print_settings/print_settings.py @@ -75,9 +75,4 @@ class PrintSettings(Document): @frappe.whitelist() def is_print_server_enabled(): - if not hasattr(frappe.local, "enable_print_server"): - frappe.local.enable_print_server = cint( - frappe.db.get_single_value("Print Settings", "enable_print_server") - ) - - return frappe.local.enable_print_server + return frappe.get_settings("Print Settings", "enable_print_server") diff --git a/frappe/tests/test_test_utils.py b/frappe/tests/test_test_utils.py index cba28377d6..c0c497ca8a 100644 --- a/frappe/tests/test_test_utils.py +++ b/frappe/tests/test_test_utils.py @@ -25,10 +25,10 @@ class TestTestUtils(IntegrationTestCase): with IntegrationTestCase.change_settings( "System Settings", {"logout_on_password_reset": int(not current_setting)} ): - updated_settings = frappe.get_system_settings("logout_on_password_reset") + updated_settings = frappe.get_settings("System Settings", "logout_on_password_reset") self.assertNotEqual(current_setting, updated_settings) - restored_settings = frappe.get_system_settings("logout_on_password_reset") + restored_settings = frappe.get_settings("System Settings", "logout_on_password_reset") self.assertEqual(current_setting, restored_settings) def test_time_freezing(self): diff --git a/frappe/website/doctype/blog_settings/blog_settings.py b/frappe/website/doctype/blog_settings/blog_settings.py index 57401fcf6b..3741b67103 100644 --- a/frappe/website/doctype/blog_settings/blog_settings.py +++ b/frappe/website/doctype/blog_settings/blog_settings.py @@ -39,8 +39,8 @@ class BlogSettings(Document): def get_like_limit(): - return frappe.db.get_single_value("Blog Settings", "like_limit") or 5 + return frappe.get_settings("Blog Settings", "like_limit") or 5 def get_comment_limit(): - return frappe.db.get_single_value("Blog Settings", "comment_limit") or 5 + return frappe.get_settings("Blog Settings", "comment_limit") or 5 diff --git a/frappe/www/sitemap.py b/frappe/www/sitemap.py index 3493b235d5..21ea54e36f 100644 --- a/frappe/www/sitemap.py +++ b/frappe/www/sitemap.py @@ -41,7 +41,7 @@ def get_public_pages_from_doctypes(): doctypes_with_web_view = get_doctypes_with_web_view() robot_parser_instance = None - if robots_txt := frappe.db.get_single_value("Website Settings", "robots_txt"): + if robots_txt := frappe.get_settings("Website Settings", "robots_txt"): robot_parser_instance = robotparser.RobotFileParser() robot_parser_instance.parse(robots_txt.splitlines())