From bbc90e6578097ede9bff42849150a8fdc8a4bb03 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 15 Jun 2022 10:33:06 +0530 Subject: [PATCH 1/3] refactor!: frappe.db.get_singles_dict * Don't cast values by default - only if cast kwarg is set * Reverts breaking behaviour added via https://github.com/frappe/frappe/commit/f74dc5023d5ab1598e80a586b656b34e18a5ec0c --- frappe/database/database.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index 39ca846904..44256f58b0 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -619,23 +619,19 @@ class Database(object): else: return r and [[i[1] for i in r]] or [] - def get_singles_dict(self, doctype, debug=False, *, for_update=False): + def get_singles_dict(self, doctype, debug=False, *, for_update=False, cast=False): """Get Single DocType as dict. :param doctype: DocType of the single object whose value is requested + :param debug: Execute query in debug mode - print to STDOUT + :param for_update: Take `FOR UPDATE` lock on the records + :param cast: Cast values to Python data types based on field type Example: # Get coulmn and value of the single doctype Accounts Settings account_settings = frappe.db.get_singles_dict("Accounts Settings") """ - return_value = frappe._dict() - - try: - meta = frappe.get_meta(doctype) - except DoesNotExistError: - return return_value - queried_result = self.query.get_sql( "Singles", filters={"doctype": doctype}, @@ -643,6 +639,16 @@ class Database(object): for_update=for_update, ).run(debug=debug) + if not cast: + return frappe._dict(queried_result) + + try: + meta = frappe.get_meta(doctype) + except DoesNotExistError: + return frappe._dict(queried_result) + + return_value = frappe._dict() + for fieldname, value in queried_result: if df := meta.get_field(fieldname): casted_value = cast(df.fieldtype, value) From 80b19a6031f94a83961dbdf15fb58a747fd85b23 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 15 Jun 2022 10:40:26 +0530 Subject: [PATCH 2/3] fix: Cast singles_dict' values This is to adapt with the changes made in frappe.db.get_singles_dict in the previous commit --- frappe/__init__.py | 4 ++-- frappe/integrations/doctype/google_drive/google_drive.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index c4f4b2a690..054643903d 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -2221,14 +2221,14 @@ def safe_eval(code, eval_globals=None, eval_locals=None): def get_website_settings(key): if not hasattr(local, "website_settings"): - local.website_settings = db.get_singles_dict("Website Settings") + local.website_settings = db.get_singles_dict("Website Settings", cast=True) return local.website_settings[key] def get_system_settings(key): if not hasattr(local, "system_settings"): - local.system_settings = db.get_singles_dict("System Settings") + local.system_settings = db.get_singles_dict("System Settings", cast=True) return local.system_settings[key] diff --git a/frappe/integrations/doctype/google_drive/google_drive.py b/frappe/integrations/doctype/google_drive/google_drive.py index bbb1e8485e..347488ee44 100644 --- a/frappe/integrations/doctype/google_drive/google_drive.py +++ b/frappe/integrations/doctype/google_drive/google_drive.py @@ -259,13 +259,13 @@ def upload_system_backup_to_google_drive(): def daily_backup(): - drive_settings = frappe.db.get_singles_dict("Google Drive") + drive_settings = frappe.db.get_singles_dict("Google Drive", cast=True) if drive_settings.enable and drive_settings.frequency == "Daily": upload_system_backup_to_google_drive() def weekly_backup(): - drive_settings = frappe.db.get_singles_dict("Google Drive") + drive_settings = frappe.db.get_singles_dict("Google Drive", cast=True) if drive_settings.enable and drive_settings.frequency == "Weekly": upload_system_backup_to_google_drive() From 57bd1b6031980085c3bdca9a66586471b2a82715 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 15 Jun 2022 10:54:48 +0530 Subject: [PATCH 3/3] fix(db): Import cast as cast_fieldtype to manevour ambiguity --- frappe/database/database.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index 44256f58b0..c68368ba38 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -22,7 +22,8 @@ from frappe.exceptions import DoesNotExistError from frappe.model.utils.link_count import flush_local_link_count from frappe.query_builder.functions import Count from frappe.query_builder.utils import DocType -from frappe.utils import cast, get_datetime, get_table_name, getdate, now, sbool +from frappe.utils import cast as cast_fieldtype +from frappe.utils import get_datetime, get_table_name, getdate, now, sbool IFNULL_PATTERN = re.compile(r"ifnull\(", flags=re.IGNORECASE) INDEX_PATTERN = re.compile(r"\s*\([^)]+\)\s*") @@ -651,7 +652,7 @@ class Database(object): for fieldname, value in queried_result: if df := meta.get_field(fieldname): - casted_value = cast(df.fieldtype, value) + casted_value = cast_fieldtype(df.fieldtype, value) else: casted_value = value return_value[fieldname] = casted_value @@ -719,7 +720,7 @@ class Database(object): _("Invalid field name: {0}").format(frappe.bold(fieldname)), self.InvalidColumnName ) - val = cast(df.fieldtype, val) + val = cast_fieldtype(df.fieldtype, val) self.value_cache[doctype][fieldname] = val