From 8a198f363bd0a62b74b62f36f1418d17940c0036 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 29 Sep 2020 23:27:00 +0530 Subject: [PATCH] fix(default): cast as string as required --- frappe/core/doctype/doctype/doctype.py | 4 ++-- frappe/database/schema.py | 2 +- frappe/model/create_new.py | 6 +++--- frappe/tests/test_db_update.py | 3 ++- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 1aa6beb6a6..92b27e410d 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -752,8 +752,8 @@ def validate_fields(meta): def check_illegal_default(d): if d.fieldtype == "Check" and not d.default: d.default = '0' - if d.fieldtype == "Check" and d.default not in ('0', '1'): - frappe.throw(_("Default for 'Check' type of field must be either '0' or '1'")) + if d.fieldtype == "Check" and cint(d.default) not in (0, 1): + frappe.throw(_("Default for 'Check' type of field {0} must be either '0' or '1'".format(frappe.bold(d.fieldname)))) if d.fieldtype == "Select" and d.default: if not d.options: frappe.throw(_("Options for {0} must be set before setting the default value.").format(frappe.bold(d.fieldname))) diff --git a/frappe/database/schema.py b/frappe/database/schema.py index 52dc2ba917..daabbaa61c 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -186,7 +186,7 @@ class DbColumn: column_def += ' not null default {0}'.format(default_value) elif self.default and (self.default not in frappe.db.DEFAULT_SHORTCUTS) \ - and not self.default.startswith(":") and column_def not in ('text', 'longtext'): + and not cstr(self.default).startswith(":") and column_def not in ('text', 'longtext'): column_def += " default {}".format(frappe.db.escape(self.default)) if self.unique and (column_def not in ('text', 'longtext')): diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py index fcf648e718..e0087a9e40 100644 --- a/frappe/model/create_new.py +++ b/frappe/model/create_new.py @@ -10,7 +10,7 @@ import copy import frappe import frappe.defaults from frappe.model import data_fieldtypes -from frappe.utils import nowdate, nowtime, now_datetime +from frappe.utils import nowdate, nowtime, now_datetime, cstr from frappe.core.doctype.user_permission.user_permission import get_user_permissions from frappe.permissions import filter_allowed_docs_for_doctype @@ -99,7 +99,7 @@ def get_static_default_value(df, doctype_user_permissions, allowed_records): elif df.default == "Today": return nowdate() - elif not df.default.startswith(":"): + elif not cstr(df.default).startswith(":"): # a simple default value is_allowed_default_value = (not user_permissions_exist(df, doctype_user_permissions) or (df.default in allowed_records)) @@ -116,7 +116,7 @@ def set_dynamic_default_values(doc, parent_doc, parentfield): for df in frappe.get_meta(doc["doctype"]).get("fields"): if df.get("default"): - if df.default.startswith(":"): + if cstr(df.default).startswith(":"): default_value = get_default_based_on_another_field(df, user_permissions, parent_doc) if default_value is not None and not doc.get(df.fieldname): doc[df.fieldname] = default_value diff --git a/frappe/tests/test_db_update.py b/frappe/tests/test_db_update.py index f243aa268f..4ae33a2fab 100644 --- a/frappe/tests/test_db_update.py +++ b/frappe/tests/test_db_update.py @@ -1,6 +1,7 @@ import unittest import frappe +from frappe.utils import cstr from frappe.core.utils import find from frappe.custom.doctype.property_setter.property_setter import make_property_setter @@ -31,7 +32,7 @@ class TestDBUpdate(unittest.TestCase): default = field_def.default if field_def.default is not None else fallback_default self.assertEqual(fieldtype, table_column.type) - self.assertIn(table_column.default or 'NULL', [default, "'{}'".format(default)]) + self.assertIn(cstr(table_column.default) or 'NULL', [cstr(default), "'{}'".format(default)]) def get_fieldtype_from_def(field_def): fieldtuple = frappe.db.type_map.get(field_def.fieldtype, ('', 0))