fix: filter Implementation is set operator (#25182)

* Implementation is set operator. fix issue #25180

* Refactored filtrer operator `is`,
Add tests

* fix: Correct implementation for `is set`

---------

Co-authored-by: Ankush Menat <ankush@frappe.io>
This commit is contained in:
Maxim Sysoev 2024-03-02 15:59:30 +02:00 committed by GitHub
parent daf43cff79
commit eff50e1cd3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 29 additions and 2 deletions

View file

@ -186,12 +186,14 @@ class TestFilters(FrappeTestCase):
)
)
def test_like_not_like(self):
def test_filter_evaluation(self):
doc = {
"doctype": "User",
"username": "test_abc",
"prefix": "startswith",
"suffix": "endswith",
"empty": None,
"number": 0,
}
test_cases = [
@ -203,10 +205,15 @@ class TestFilters(FrappeTestCase):
([["prefix", "not like", "end%"]], True),
([["suffix", "like", "%with"]], True),
([["suffix", "not like", "%end"]], True),
([["suffix", "is", "set"]], True),
([["suffix", "is", "not set"]], False),
([["empty", "is", "set"]], False),
([["empty", "is", "not set"]], True),
([["number", "is", "set"]], True),
]
for filter, expected_result in test_cases:
self.assertEqual(evaluate_filters(doc, filter), expected_result)
self.assertEqual(evaluate_filters(doc, filter), expected_result, msg=f"{filter}")
class TestMoney(FrappeTestCase):

View file

@ -1930,6 +1930,25 @@ def sql_like(value: str, pattern: str) -> bool:
return pattern in value
def filter_operator_is(value: str, pattern: str) -> bool:
"""Operator `is` can have two values: 'set' or 'not set'."""
pattern = pattern.lower()
def is_set():
if value is None:
return False
elif isinstance(value, str) and not value:
return False
return True
if pattern == "set":
return is_set()
elif pattern == "not set":
return not is_set()
else:
frappe.throw(frappe._(f"Invalid argument for operator 'IS': {pattern}"))
operator_map = {
# startswith
"^": lambda a, b: (a or "").startswith(b),
@ -1947,6 +1966,7 @@ operator_map = {
"None": lambda a, b: a is None,
"like": sql_like,
"not like": lambda a, b: not sql_like(a, b),
"is": filter_operator_is,
}