From 0192bcf45fe5c204416c5058233cd23b9e759bbc Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 17 Aug 2020 22:19:44 +0530 Subject: [PATCH] fix(minor): frappe.db.set_value to allow multiple values --- frappe/database/database.py | 15 ++++++--------- frappe/tests/test_db.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index 2b8564481a..d9755abd33 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -660,20 +660,17 @@ class Database(object): if dn and dt!=dn: # with table - values = dict( - name=self.get_value(dt, dn, 'name', for_update=for_update) - ) - - values.update(to_update) - set_values = [] for key in to_update: set_values.append('`{0}`=%({0})s'.format(key)) - self.sql("""update `tab{0}` - set {1} where name=%(name)s""".format(dt, ', '.join(set_values)), - values, debug=debug) + for name in self.get_values(dt, dn, 'name', for_update=for_update): + values = dict(name=name[0]) + values.update(to_update) + self.sql("""update `tab{0}` + set {1} where name=%(name)s""".format(dt, ', '.join(set_values)), + values, debug=debug) else: # for singles keys = list(to_update) diff --git a/frappe/tests/test_db.py b/frappe/tests/test_db.py index bb479d67c7..d1f608f48d 100644 --- a/frappe/tests/test_db.py +++ b/frappe/tests/test_db.py @@ -22,6 +22,21 @@ class TestDB(unittest.TestCase): self.assertEqual(frappe.db.sql("""SELECT name FROM `tabUser` WHERE name >= 't' ORDER BY MODIFIED DESC""")[0][0], frappe.db.get_value("User", {"name": [">=", "t"]})) + def test_set_value(self): + todo1 = frappe.get_doc(dict(doctype='ToDo', description = 'test_set_value 1')).insert() + todo2 = frappe.get_doc(dict(doctype='ToDo', description = 'test_set_value 2')).insert() + + frappe.db.set_value('ToDo', todo1.name, 'description', 'test_set_value change 1') + self.assertEqual(frappe.db.get_value('ToDo', todo1.name, 'description'), 'test_set_value change 1') + + # multiple set-value + frappe.db.set_value('ToDo', dict(description=('like', '%test_set_value%')), + 'description', 'change 2') + + self.assertEqual(frappe.db.get_value('ToDo', todo1.name, 'description'), 'change 2') + self.assertEqual(frappe.db.get_value('ToDo', todo2.name, 'description'), 'change 2') + + def test_escape(self): frappe.db.escape("香港濟生堂製藥有限公司 - IT".encode("utf-8"))