From e32e74f2f19dfc107a93da1acd30bf81a918ec17 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 16 Jul 2023 12:57:40 +0530 Subject: [PATCH] feat: Custom naming series parser via hooks (#21690) * feat: Custom naming series parser via hooks * chore: use assignment operatot Co-authored-by: Ankush Menat * test: Unit test for custom parser * test: Unit test for custom parser --------- Co-authored-by: Ankush Menat --- frappe/hooks.py | 4 ++++ frappe/model/naming.py | 9 +++++++-- frappe/tests/test_naming.py | 13 +++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index fe430918d0..8863712b06 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -428,3 +428,7 @@ after_job = [ extend_bootinfo = [ "frappe.utils.telemetry.add_bootinfo", ] + +naming_series_variables = { + "PM": "frappe.tests.test_naming.parse_naming_series_variable", +} diff --git a/frappe/model/naming.py b/frappe/model/naming.py index 2acb8254a2..3d8845382b 100644 --- a/frappe/model/naming.py +++ b/frappe/model/naming.py @@ -339,11 +339,11 @@ def parse_naming_series( part = determine_consecutive_week_number(today) elif e == "timestamp": part = str(today) - elif e == "FY": - part = frappe.defaults.get_user_default("fiscal_year") elif doc and (e.startswith("{") or doc.get(e, _sentinel) is not _sentinel): e = e.replace("{", "").replace("}", "") part = doc.get(e) + elif method := has_custom_parser(e): + part = frappe.get_attr(method[0])(doc, e) else: part = e @@ -355,6 +355,11 @@ def parse_naming_series( return name +def has_custom_parser(e): + """Returns true if the naming series part has a custom parser""" + return frappe.get_hooks("naming_series_variables", {}).get(e) + + def determine_consecutive_week_number(datetime): """Determines the consecutive calendar week""" m = datetime.month diff --git a/frappe/tests/test_naming.py b/frappe/tests/test_naming.py index 407d07d3ea..25265eca1f 100644 --- a/frappe/tests/test_naming.py +++ b/frappe/tests/test_naming.py @@ -375,6 +375,19 @@ class TestNaming(FrappeTestCase): name = parse_naming_series(series, doc=webhook) self.assertTrue(name.startswith("KOOH---"), f"incorrect name generated {name}") + def test_custom_parser(self): + # check naming with custom parser + todo = frappe.new_doc("ToDo") + series = "TODO-.PM.-.####" + name = parse_naming_series(series, doc=todo) + expected_name = "TODO-" + nowdate().split("-")[1] + "-" + "0001" + self.assertEqual(name, expected_name) + + +def parse_naming_series_variable(doc, variable): + if variable == "PM": + return nowdate().split("-")[1] + def make_invalid_todo(): frappe.get_doc({"doctype": "ToDo", "description": "Test"}).insert(set_name="ToDo")