diff --git a/frappe/database/query.py b/frappe/database/query.py index 587378b32f..15ab85ff56 100644 --- a/frappe/database/query.py +++ b/frappe/database/query.py @@ -244,7 +244,13 @@ class Query: _operator = OPERATOR_MAP[value[0]] conditions = conditions.where(_operator(Field(key), value[1])) else: - conditions = conditions.where(_operator(Field(key), value)) + if value is not None: + conditions = conditions.where(_operator(Field(key), value)) + else: + _table = conditions._from[0] + field = getattr(_table, key) + conditions = conditions.where(field.isnull()) + conditions = self.add_conditions(conditions, **kwargs) return conditions diff --git a/frappe/tests/test_db_query.py b/frappe/tests/test_db_query.py index 5cd6690209..a53134064e 100644 --- a/frappe/tests/test_db_query.py +++ b/frappe/tests/test_db_query.py @@ -97,6 +97,12 @@ class TestReportview(unittest.TestCase): self.assertFalse(result in DatabaseQuery("DocType").execute(filters={"name": ["not in", 'DocType,DocField']})) + def test_none_filter(self): + query = frappe.db.query.get_sql("DocType", fields="name", filters={"restrict_to_domain": None}) + sql = str(query).replace('`', '').replace('"', '') + condition = 'restrict_to_domain IS NULL' + self.assertIn(condition, sql) + def test_or_filters(self): data = DatabaseQuery("DocField").execute( filters={"parent": "DocType"}, fields=["fieldname", "fieldtype"], @@ -149,7 +155,6 @@ class TestReportview(unittest.TestCase): filters={"creation": ["between", ["2016-07-06", "2016-07-07"]]}, fields=["name"]) - def test_ignore_permissions_for_get_filters_cond(self): frappe.set_user('test2@example.com') self.assertRaises(frappe.PermissionError, get_filters_cond, 'DocType', dict(istable=1), []) @@ -351,7 +356,6 @@ class TestReportview(unittest.TestCase): self.assertTrue(len(data) == 0) self.assertTrue(len(frappe.get_all('Nested DocType', {'name': ('not ancestors of', 'Root')})) == len(frappe.get_all('Nested DocType'))) - def test_is_set_is_not_set(self): res = DatabaseQuery('DocType').execute(filters={'autoname': ['is', 'not set']}) self.assertTrue({'name': 'Integration Request'} in res)