fix: preserve docnames matching scientific notation in get_safe_filters

This commit is contained in:
Kaushal Shriwas 2026-04-30 13:15:04 +05:30
parent 4093ecc409
commit ff83bb1473
3 changed files with 29 additions and 4 deletions

View file

@ -291,3 +291,12 @@ class TestClient(IntegrationTestCase):
# cleanup
for doc in docs:
frappe.delete_doc("Note", doc)
def test_get_value_with_scientific_notation_docname(self):
from frappe.client import get_value
tag = frappe.get_doc({"doctype": "Tag", "name": "3E002"}).insert(ignore_if_duplicate=True)
try:
self.assertEqual(get_value("Tag", ["name"], "3E002"), {"name": "3E002"})
finally:
tag.delete()

View file

@ -32,6 +32,7 @@ from frappe.utils import (
get_file_timestamp,
get_gravatar,
get_link_to_report,
get_safe_filters,
get_site_info,
get_sites,
get_url,
@ -352,6 +353,23 @@ class TestFilters(IntegrationTestCase):
link = get_link_to_report(name="ToDo", filters=filters)
self.assertIn('creation=["between",["2024-01-01","2024-12-31"]]', link)
def test_get_safe_filters_preserves_scientific_notation_docnames(self):
self.assertEqual(get_safe_filters("3E002"), "3E002")
self.assertEqual(get_safe_filters("1E5"), "1E5")
self.assertEqual(get_safe_filters("2e10"), "2e10")
self.assertEqual(get_safe_filters("1.5"), "1.5")
self.assertEqual(get_safe_filters("Infinity"), "Infinity")
self.assertEqual(get_safe_filters("NaN"), "NaN")
def test_get_safe_filters_still_parses_json(self):
self.assertEqual(get_safe_filters('{"name": "ABC"}'), {"name": "ABC"})
self.assertEqual(get_safe_filters('[["name", "=", "ABC"]]'), [["name", "=", "ABC"]])
def test_get_safe_filters_passes_through_non_strings(self):
self.assertEqual(get_safe_filters({"name": "ABC"}), {"name": "ABC"})
self.assertEqual(get_safe_filters([["name", "=", "ABC"]]), [["name", "=", "ABC"]])
self.assertIsNone(get_safe_filters(None))
class TestMoney(IntegrationTestCase):
def test_money_in_words(self):

View file

@ -904,12 +904,10 @@ def call(fn, *args, **kwargs):
def get_safe_filters(filters):
if not isinstance(filters, str) or not filters or filters[0] not in "{[":
return filters
try:
filters = orjson.loads(filters)
if isinstance(filters, int | float):
filters = frappe.as_unicode(filters)
except (TypeError, ValueError):
# filters are not passed, not json
pass