diff --git a/frappe/model/document.py b/frappe/model/document.py index db4b7703ba..e482be0056 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -5,7 +5,7 @@ import time from frappe import _, msgprint, is_whitelisted from frappe.utils import flt, cstr, now, get_datetime_str, file_lock, date_diff from frappe.model.base_document import BaseDocument, get_controller -from frappe.model.naming import set_new_name, gen_new_name_for_cancelled_doc +from frappe.model.naming import set_new_name, gen_new_name_for_cancelled_doc, validate_name from werkzeug.exceptions import NotFound, Forbidden import hashlib, json from frappe.model import optional_fields, table_fields @@ -415,12 +415,12 @@ class Document(BaseDocument): # If autoname has set as Prompt (name) if self.get("__newname"): - self.name = self.get("__newname") + self.name = validate_name(self.doctype, self.get("__newname")) self.flags.name_set = True return if set_name: - self.name = set_name + self.name = validate_name(self.doctype, set_name) else: set_new_name(self) diff --git a/frappe/tests/test_naming.py b/frappe/tests/test_naming.py index 3031d3e344..c1aba4e88e 100644 --- a/frappe/tests/test_naming.py +++ b/frappe/tests/test_naming.py @@ -10,12 +10,18 @@ from frappe.model.naming import append_number_if_name_exists, revert_series_if_l from frappe.model.naming import determine_consecutive_week_number, parse_naming_series class TestNaming(unittest.TestCase): + def setUp(self): + frappe.db.sql('delete from `tabNote`') + frappe.db.sql('delete from `tabToDo`') + def tearDown(self): # Reset ToDo autoname to hash todo_doctype = frappe.get_doc('DocType', 'ToDo') todo_doctype.autoname = 'hash' todo_doctype.save() + frappe.db.rollback() + def test_append_number_if_name_exists(self): ''' Append number to name based on existing values @@ -208,3 +214,43 @@ class TestNaming(unittest.TestCase): dt = datetime.fromisoformat("2021-12-31") w = determine_consecutive_week_number(dt) self.assertEqual(w, "52") + + def test_naming_validations(self): + # case 1: check same name as doctype + # set name via prompt + tag = frappe.get_doc({ + 'doctype': 'Tag', + '__newname': 'Tag' + }) + self.assertRaises(frappe.NameError, tag.insert) + + # set by passing set_name as ToDo + self.assertRaises(frappe.NameError, make_invalid_todo) + + # set new name - Note + note = frappe.get_doc({ + 'doctype': 'Note', + 'title': 'Note' + }) + self.assertRaises(frappe.NameError, note.insert) + + # case 2: set name with "New ---" + tag = frappe.get_doc({ + 'doctype': 'Tag', + '__newname': 'New Tag' + }) + self.assertRaises(frappe.NameError, tag.insert) + + # case 3: set name with special characters + tag = frappe.get_doc({ + 'doctype': 'Tag', + '__newname': 'Tag<>' + }) + self.assertRaises(frappe.NameError, tag.insert) + + +def make_invalid_todo(): + frappe.get_doc({ + 'doctype': 'ToDo', + 'description': 'Test' + }).insert(set_name='ToDo') \ No newline at end of file