diff --git a/frappe/model/naming.py b/frappe/model/naming.py index d3b6fc7293..28b98987ea 100644 --- a/frappe/model/naming.py +++ b/frappe/model/naming.py @@ -336,11 +336,9 @@ def parse_naming_series( part = str(today) elif e == "FY": part = frappe.defaults.get_user_default("fiscal_year") - elif e.startswith("{") and doc: + elif doc and (e.startswith("{") or hasattr(doc, e)): e = e.replace("{", "").replace("}", "") part = doc.get(e) - elif doc and doc.get(e): - part = doc.get(e) else: part = e @@ -550,9 +548,7 @@ def _format_autoname(autoname, doc): def get_param_value_for_match(match): param = match.group() - # trim braces - trimmed_param = param[1:-1] - return parse_naming_series([trimmed_param], doc=doc) + return parse_naming_series([param[1:-1]], doc=doc) # Replace braced params with their parsed value name = BRACED_PARAMS_PATTERN.sub(get_param_value_for_match, autoname_value) diff --git a/frappe/tests/test_naming.py b/frappe/tests/test_naming.py index 9f5b46a4d1..15a76d5f53 100644 --- a/frappe/tests/test_naming.py +++ b/frappe/tests/test_naming.py @@ -369,6 +369,15 @@ class TestNaming(FrappeTestCase): name.startswith("KOOH-"), f"incorrect name generated {name}, missing field value" ) + def test_naming_with_empty_field(self): + # check naming with empty field value + + webhook = frappe.new_doc("Webhook") + series = "KOOH-.{request_structure}.-.request_structure.-.####" + + name = parse_naming_series(series, doc=webhook) + self.assertTrue(name.startswith("KOOH---"), f"incorrect name generated {name}") + def make_invalid_todo(): frappe.get_doc({"doctype": "ToDo", "description": "Test"}).insert(set_name="ToDo")