From e26475512c3d547e7521c336346afebfc951c022 Mon Sep 17 00:00:00 2001 From: hasnain2808 Date: Wed, 4 Aug 2021 16:08:34 +0530 Subject: [PATCH 1/5] feat: wrappable code editor --- frappe/public/js/frappe/form/controls/code.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/public/js/frappe/form/controls/code.js b/frappe/public/js/frappe/form/controls/code.js index 9155333ee3..5af7cf2863 100644 --- a/frappe/public/js/frappe/form/controls/code.js +++ b/frappe/public/js/frappe/form/controls/code.js @@ -24,6 +24,7 @@ frappe.ui.form.ControlCode = class ControlCode extends frappe.ui.form.ControlTex this.editor = ace.edit(this.ace_editor_target.get(0)); this.editor.setTheme('ace/theme/tomorrow'); this.editor.setOption("showPrintMargin", false); + this.editor.setOption("wrap", this.df.wrap); this.set_language(); // events From 1ffb0b1d7ccaf48e22ceb450384322ec6b002dc4 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Fri, 6 Aug 2021 12:52:12 +0530 Subject: [PATCH 2/5] fix: validate code fields of children too --- frappe/model/document.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/model/document.py b/frappe/model/document.py index 7443c92ab4..9a1fb775f7 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -507,6 +507,7 @@ class Document(BaseDocument): d._validate_selects() d._validate_non_negative() d._validate_length() + d._validate_code_fields() d._extract_images_from_text_editor() d._sanitize_content() d._save_passwords() From a85744be271836b49f6883edb84942b373f7e2da Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Fri, 6 Aug 2021 15:01:06 +0530 Subject: [PATCH 3/5] test: Python syntax validation "integration" test --- .../core/doctype/server_script/test_server_script.py | 10 ++++++++++ frappe/workflow/doctype/workflow/test_workflow.py | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/frappe/core/doctype/server_script/test_server_script.py b/frappe/core/doctype/server_script/test_server_script.py index c39fcfa0d0..ed6b5539c5 100644 --- a/frappe/core/doctype/server_script/test_server_script.py +++ b/frappe/core/doctype/server_script/test_server_script.py @@ -109,3 +109,13 @@ class TestServerScript(unittest.TestCase): """Raise AttributeError if method not found in Namespace""" note = frappe.get_doc({"doctype": "Note", "title": "Test Note: Server Script"}) self.assertRaises(AttributeError, note.insert) + + def test_syntax_validation(self): + server_script = scripts[0] + server_script["script"] = "js || code.?" + + with self.assertRaises(frappe.ValidationError) as se: + frappe.get_doc(doctype="Server Script", **server_script).insert() + + self.assertTrue("invalid python code" in str(se.exception).lower(), + msg="Python code validation not working") diff --git a/frappe/workflow/doctype/workflow/test_workflow.py b/frappe/workflow/doctype/workflow/test_workflow.py index 9bafd377fc..cd36fd2d0b 100644 --- a/frappe/workflow/doctype/workflow/test_workflow.py +++ b/frappe/workflow/doctype/workflow/test_workflow.py @@ -121,6 +121,16 @@ class TestWorkflow(unittest.TestCase): self.workflow.states[1].doc_status = 0 self.workflow.save() + def test_syntax_error_in_transition_rule(self): + self.workflow.transitions[0].condition = 'doc.status =! "Closed"' + + with self.assertRaises(frappe.ValidationError) as se: + self.workflow.save() + + self.assertTrue("invalid python code" in str(se.exception).lower(), + msg="Python code validation not working") + + def create_todo_workflow(): if frappe.db.exists('Workflow', 'Test ToDo'): frappe.delete_doc('Workflow', 'Test ToDo') From 7400d7ca37a6a57ecf9aa6ad725c1c33c04dc8a1 Mon Sep 17 00:00:00 2001 From: Saif Date: Sat, 7 Aug 2021 13:09:28 +0500 Subject: [PATCH 4/5] fix: do not reset doc_before_save on db_set --- frappe/model/document.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 7443c92ab4..c2ac4d7404 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -1064,7 +1064,10 @@ class Document(BaseDocument): self.set("modified", now()) self.set("modified_by", frappe.session.user) - self.load_doc_before_save() + # load but do not reload doc_before_save because before_change or on_change might expect it + if not self.get_doc_before_save(): + self.load_doc_before_save() + # to trigger notification on value change self.run_method('before_change') From 703edfed73441b80cdc735438fea685eeef9c614 Mon Sep 17 00:00:00 2001 From: ChillarAnand Date: Mon, 9 Aug 2021 11:02:40 +0530 Subject: [PATCH 5/5] fix: Show command and error message when an exception is raised --- frappe/handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/handler.py b/frappe/handler.py index 8d0c18a00b..9d32b0acee 100755 --- a/frappe/handler.py +++ b/frappe/handler.py @@ -53,7 +53,7 @@ def execute_cmd(cmd, from_async=False): try: method = get_attr(cmd) except Exception as e: - frappe.throw(_('Invalid Method')) + frappe.throw(_('Failed to get method for command {0} with {1}').format(cmd, e)) if from_async: method = method.queue