diff --git a/frappe/database/query.py b/frappe/database/query.py index f7393bfa54..b107759af0 100644 --- a/frappe/database/query.py +++ b/frappe/database/query.py @@ -85,6 +85,11 @@ def func_between(key: Field, value: Union[List, Tuple]) -> frappe.qb: return key[slice(*value)] +def func_is(key, value): + "Wrapper for IS" + return Field(key).isnotnull() if value.lower() == "set" else Field(key).isnull() + + def make_function(key: Any, value: Union[int, str]): """returns fucntion query @@ -135,6 +140,7 @@ OPERATOR_MAP = { "not like": not_like, "regex": func_regex, "between": func_between, + "is": func_is, } diff --git a/frappe/tests/test_db.py b/frappe/tests/test_db.py index 338bde7502..86e54cb866 100644 --- a/frappe/tests/test_db.py +++ b/frappe/tests/test_db.py @@ -858,3 +858,12 @@ class TestDDLCommandsPost(unittest.TestCase): ) dt.delete(ignore_permissions=True) + + def test_is(self): + user = frappe.qb.DocType("User") + self.assertIn( + "is not null", frappe.db.get_values(user, filters={user.name: ("is", "set")}, run=False).lower() + ) + self.assertIn( + "is null", frappe.db.get_values(user, filters={user.name: ("is", "not set")}, run=False).lower() + )