diff --git a/frappe/client.py b/frappe/client.py index 045e28dd8f..a813e3ec55 100644 --- a/frappe/client.py +++ b/frappe/client.py @@ -75,17 +75,23 @@ def get_value(doctype, fieldname, filters=None, as_dict=True, debug=False, paren filters = get_safe_filters(filters) try: - fieldname = json.loads(fieldname) + fields = json.loads(fieldname) except (TypeError, ValueError): # name passed, not json - pass + fields = [fieldname] # check whether the used filters were really parseable and usable # and did not just result in an empty string or dict if not filters: filters = None - return frappe.db.get_value(doctype, filters, fieldname, as_dict=as_dict, debug=debug) + value = frappe.get_list(doctype, filters=filters, fields=fields, debug=debug, limit=1) + if as_dict: + value = value[0] if value else {} + else: + value = value[0].fieldname + + return value @frappe.whitelist() def get_single_value(doctype, field): diff --git a/frappe/tests/test_api.py b/frappe/tests/test_api.py index 2472f3191d..3e559ac0f3 100644 --- a/frappe/tests/test_api.py +++ b/frappe/tests/test_api.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import unittest, frappe, os from frappe.core.doctype.user.user import generate_keys -from frappe.frappeclient import FrappeClient +from frappe.frappeclient import FrappeClient, FrappeException from frappe.utils.data import get_url import requests @@ -56,6 +56,21 @@ class TestAPI(unittest.TestCase): doc = server.get_doc("Note", "get_this") self.assertTrue(doc) + def test_get_value(self): + server = FrappeClient(get_url(), "Administrator", "admin", verify=False) + frappe.db.sql("delete from `tabNote` where title = 'get_value'") + frappe.db.commit() + + test_content = "test get value" + + server.insert_many([ + {"doctype": "Note", "public": True, "title": "get_value", "content": test_content}, + ]) + self.assertEqual(server.get_value("Note", "content", {"title": "get_value"}).get('content'), test_content) + + self.assertRaises(FrappeException, server.get_value, "Note", "(select (password) from(__Auth) order by name desc limit 1)", {"title": "get_value"}) + + def test_update_doc(self): server = FrappeClient(get_url(), "Administrator", "admin", verify=False) frappe.db.sql("delete from `tabNote` where title in ('Sing','sing')")