Merge pull request #17187 from gavindsouza/get_singles_dict-cast

refactor!: Don't cast values of frappe.db.get_singles_dict by default
This commit is contained in:
Ankush Menat 2022-06-15 11:18:09 +05:30 committed by GitHub
commit 6d5aa88e66
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 15 deletions

View file

@ -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]

View file

@ -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*")
@ -619,23 +620,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,9 +640,19 @@ 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)
casted_value = cast_fieldtype(df.fieldtype, value)
else:
casted_value = value
return_value[fieldname] = casted_value
@ -713,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

View file

@ -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()