From efd5c197cbec0a483eccf2e2def7f33e4876ea08 Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Tue, 25 Jan 2022 03:07:34 +0530 Subject: [PATCH 1/3] fix: sbool converting int stored as string --- frappe/utils/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 8148d194c6..b13044b2e6 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -750,7 +750,7 @@ def sbool(x: str) -> Union[bool, Any]: return True elif val in ('false', '0'): return False - return bool(x) + return x except Exception: return x From 97d6a9641911de8e895ea7e02c8e41edec4a83ae Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Tue, 25 Jan 2022 13:28:11 +0530 Subject: [PATCH 2/3] fix: timedelta parsing in pypika --- frappe/query_builder/terms.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frappe/query_builder/terms.py b/frappe/query_builder/terms.py index 71f60af656..f9751612b6 100644 --- a/frappe/query_builder/terms.py +++ b/frappe/query_builder/terms.py @@ -1,3 +1,4 @@ +from datetime import timedelta from typing import Any, Dict, Optional from pypika.terms import Function, ValueWrapper @@ -51,6 +52,9 @@ class ParameterizedValueWrapper(ValueWrapper): value_sql = self.get_value_sql(quote_char=quote_char, **kwargs) sql = param_wrapper.get_sql(param_value=value_sql, **kwargs) else: + # * BUG: pypika doesen't parse timedeltas + if isinstance(self.value, timedelta): + self.value = str(self.value) sql = self.get_value_sql( quote_char=quote_char, secondary_quote_char=secondary_quote_char, From 1741c478261f6ecc39d8b7adb976c35e243fe147 Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Tue, 25 Jan 2022 15:26:16 +0530 Subject: [PATCH 3/3] test: avoid parameterization of qb objects --- frappe/tests/test_query_builder.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/frappe/tests/test_query_builder.py b/frappe/tests/test_query_builder.py index bc98e166ea..bb7a883b5b 100644 --- a/frappe/tests/test_query_builder.py +++ b/frappe/tests/test_query_builder.py @@ -5,7 +5,7 @@ import frappe from frappe.query_builder.custom import ConstantColumn from frappe.query_builder.functions import Coalesce, GroupConcat, Match from frappe.query_builder.utils import db_type_is - +from frappe.query_builder import Case def run_only_if(dbtype: db_type_is) -> Callable: return unittest.skipIf( @@ -108,6 +108,27 @@ class TestParameterization(unittest.TestCase): self.assertIn("param1", params) self.assertEqual(params["param1"], "subject") + def test_case(self): + DocType = frappe.qb.DocType("DocType") + query = ( + frappe.qb.from_(DocType) + .select( + Case() + .when(DocType.search_fields == "value", "other_value") + .when(Coalesce(DocType.search_fields == "subject_in_function"), "true_value") + ) + ) + + self.assertTrue("walk" in dir(query)) + query, params = query.walk() + + self.assertIn("%(param1)s", query) + self.assertIn("param1", params) + self.assertEqual(params["param1"], "value") + self.assertEqual(params["param2"], "other_value") + self.assertEqual(params["param3"], "subject_in_function") + self.assertEqual(params["param4"], "true_value") + @run_only_if(db_type_is.MARIADB) class TestBuilderMaria(unittest.TestCase, TestBuilderBase):