diff --git a/bt5/erp5_data_notebook/ExtensionTemplateItem/portal_components/extension.erp5.JupyterCompile.py b/bt5/erp5_data_notebook/ExtensionTemplateItem/portal_components/extension.erp5.JupyterCompile.py index 3477124df67ac113df19c46a723366f9fe5babf5..a1c92c966bd7f1b805d7017456ac87c236587119 100644 --- a/bt5/erp5_data_notebook/ExtensionTemplateItem/portal_components/extension.erp5.JupyterCompile.py +++ b/bt5/erp5_data_notebook/ExtensionTemplateItem/portal_components/extension.erp5.JupyterCompile.py @@ -119,6 +119,15 @@ def Base_executeJupyter(self, python_expression=None, reference=None, \ return serialized_result +def mergeTracebackListIntoResultDict(result_dict, error_result_dict_list): + if error_result_dict_list: + if result_dict['traceback'] is None: + result_dict['traceback'] = [] + for error_result_dict in error_result_dict_list: + result_dict['traceback'].append(error_result_dict['traceback']) + result_dict['status'] = error_result_dict['status'] + return result_dict + def Base_runJupyterCode(self, jupyter_code, old_notebook_context): """ Function to execute jupyter code and update the context dictionary. @@ -178,7 +187,8 @@ def Base_runJupyterCode(self, jupyter_code, old_notebook_context): inject_variable_dict = {} current_var_dict = {} current_setup_dict = {} - + setup_error_return_dict_list = [] + # Execute only if jupyter_code is not empty if jupyter_code: # Create ast parse tree @@ -305,14 +315,11 @@ def Base_runJupyterCode(self, jupyter_code, old_notebook_context): except Exception as e: if value['func_name'] in user_context: del user_context[value['func_name']] - error_return_dict = getErrorMessageForException(self, e, notebook_context) + error_return_dict = getErrorMessageForException(self, e, notebook_context) additional_information = "An error happened when trying to run the one of your setup functions:" error_return_dict['traceback'].insert(0, additional_information) - # As in any other user's code execution, transaction needs to be - # aborted. - transaction.abort() - return error_return_dict - + setup_error_return_dict_list.append(error_return_dict) + # Iterating over envinronment.define calls captured by the environment collector # that are functions and saving them as setup functions. for func_name, data in current_setup_dict.iteritems(): @@ -350,7 +357,8 @@ def Base_runJupyterCode(self, jupyter_code, old_notebook_context): # Abort the current transaction. As a consequence, the notebook lines # are not added if an exception occurs. transaction.abort() - return getErrorMessageForException(self, e, notebook_context) + return mergeTracebackListIntoResultDict(getErrorMessageForException(self, e, notebook_context), + setup_error_return_dict_list) # Execute the interactive nodes with 'single' mode for node in to_run_interactive: @@ -362,7 +370,8 @@ def Base_runJupyterCode(self, jupyter_code, old_notebook_context): # Abort the current transaction. As a consequence, the notebook lines # are not added if an exception occurs. transaction.abort() - return getErrorMessageForException(self, e, notebook_context) + return mergeTracebackListIntoResultDict(getErrorMessageForException(self, e, notebook_context), + setup_error_return_dict_list) mime_type = display_data['mime_type'] or mime_type inject_variable_dict['_print'].write("\n".join(removed_setup_message_list) + display_data['result']) @@ -403,7 +412,7 @@ def Base_runJupyterCode(self, jupyter_code, old_notebook_context): 'evalue': evalue, 'ename': ename, 'traceback': tb_list} - return result + return mergeTracebackListIntoResultDict(result, setup_error_return_dict_list) class EnvironmentUndefineError(TypeError): diff --git a/bt5/erp5_data_notebook/ExtensionTemplateItem/portal_components/extension.erp5.JupyterCompile.xml b/bt5/erp5_data_notebook/ExtensionTemplateItem/portal_components/extension.erp5.JupyterCompile.xml index d7c5cb056e5483a14b778c863b2b75fdb2deba21..c0c115ddc15c1845ebb33733d4e2cbd7a3f93c25 100644 --- a/bt5/erp5_data_notebook/ExtensionTemplateItem/portal_components/extension.erp5.JupyterCompile.xml +++ b/bt5/erp5_data_notebook/ExtensionTemplateItem/portal_components/extension.erp5.JupyterCompile.xml @@ -46,12 +46,12 @@ <key> <string>text_content_warning_message</string> </key> <value> <tuple> - <string>W:302, 10: Use of exec (exec-used)</string> - <string>W:348, 10: Use of exec (exec-used)</string> - <string>W:360, 10: Use of exec (exec-used)</string> - <string>W:444, 6: No exception type(s) specified (bare-except)</string> - <string>W:697, 6: Use of exec (exec-used)</string> - <string>W:923, 2: Redefining name \'IFrame\' from outer scope (line 4) (redefined-outer-name)</string> + <string>W:312, 10: Use of exec (exec-used)</string> + <string>W:355, 10: Use of exec (exec-used)</string> + <string>W:368, 10: Use of exec (exec-used)</string> + <string>W:453, 6: No exception type(s) specified (bare-except)</string> + <string>W:706, 6: Use of exec (exec-used)</string> + <string>W:932, 2: Redefining name \'IFrame\' from outer scope (line 4) (redefined-outer-name)</string> <string>W: 18, 0: Unused log imported from Products.ERP5Type.Log (unused-import)</string> </tuple> </value>