bug fix: 修复脚本工具单独调试时没有传入project_id的问题

This commit is contained in:
azhengzz 2021-03-28 17:55:49 +08:00
parent 4ebee5353a
commit 60088e41e9
5 changed files with 60 additions and 5 deletions

View File

@ -77,8 +77,9 @@ def register_shell_context(app: Flask):
HTTPCaseFileUpload, Project, Module, Scene, Dispatcher, DispatcherDetail, Report,
ReportCaseData, ReportCaseExpectationData, SubElementInLogicController,
ReportToolData, ReportScriptToolData, ReportTimerToolData, ReportVariableDefinitionToolData,
ReportVariableDefinitionToolListData)
ReportVariableDefinitionToolListData, Tool)
from app.email import send_email
from app.utils.util import get_project_id_from_current_element
@app.shell_context_processor
def make_shell_context():
@ -95,6 +96,7 @@ def register_shell_context(app: Flask):
'Project': Project,
'Module': Module,
'Scene': Scene,
'Tool': Tool,
'Dispatcher': Dispatcher,
'DispatcherDetail': DispatcherDetail,
'SubElementInLogicController': SubElementInLogicController,
@ -103,6 +105,7 @@ def register_shell_context(app: Flask):
'ReportTimerToolData': ReportTimerToolData,
'ReportVariableDefinitionToolData': ReportVariableDefinitionToolData,
'ReportVariableDefinitionToolListData': ReportVariableDefinitionToolListData,
'get_project_id_from_current_element': get_project_id_from_current_element,
}

View File

@ -9,7 +9,7 @@ from app.cores.tool.http_request_header_manager import HTTPRequestHeaderManager
class ScriptToolDispatcher(AbstractToolDispatcher):
def __init__(self, tool, dispatcher_type=DISPATCHER_TYPE.DEBUG, logger=None, dispatcher=None):
def __init__(self, tool, dispatcher_type=DISPATCHER_TYPE.DEBUG, logger=None, dispatcher=None, project_id=None):
"""
:param tool: 单个Script Tool工具组件
:type tool: Tool
@ -19,9 +19,12 @@ class ScriptToolDispatcher(AbstractToolDispatcher):
:type logger: DispatcherLogger
:param dispatcher: 当dispatcher_type为DISPATCHER_TYPE.BUILD时需要传入调度数据
:type dispatcher: Dispatcher
:param project_id: 工具所属的项目id
:type project_id: int
"""
super().__init__(tool=tool, dispatcher_type=dispatcher_type, logger=logger, dispatcher=dispatcher)
self.project_id = project_id
# 脚本执行日志
self.log_text = ''
@ -30,7 +33,7 @@ class ScriptToolDispatcher(AbstractToolDispatcher):
def execute(self):
super().execute()
self.log_text = Script(tool=self.tool, dispatcher_logger=self.dispatcher_logger).exec_tool()
self.log_text = Script(tool=self.tool, dispatcher_logger=self.dispatcher_logger, project_id=self.project_id).exec_tool()
def tear_down(self):
super().tear_down()

View File

@ -578,6 +578,29 @@ class LogicController(db.Model):
cls.copy(original_logic_controller=original_logic_controller,
parent_logic_controller=new_logic_controller, scene_id=scene_id)
@classmethod
def get_project_id_from_current_logic_controller(cls, logic_controller):
"""找到当前逻辑控制器所属的项目id"""
def _recursive_find_scene_controller(logic_controller_id):
"""递归查找SceneController的logic_controller_id"""
sub_element_in_logic_controller = SubElementInLogicController.query.filter_by(
element_id=logic_controller_id,
element_type=ELEMENT_TYPE.LOGIC_CONTROLLER,
).first()
if sub_element_in_logic_controller:
return _recursive_find_scene_controller(sub_element_in_logic_controller.logic_controller_id)
else:
return logic_controller_id
if logic_controller.logic_controller_type == LOGIC_CONTROLLER_TYPE.SCENE_CONTROLLER:
return logic_controller.specific_controller.scene.module.project_id
else:
# 从SubElementInLogicController关系中找到最上层的SceneController
logic_controller_id = _recursive_find_scene_controller(logic_controller.id)
scene_controller = SceneController.query.filter_by(logic_controller_id=logic_controller_id).first()
if scene_controller:
return scene_controller.scene.module.project_id
class SubElementInLogicController(db.Model):
"""
@ -1079,6 +1102,20 @@ class Tool(db.Model):
tool.status = STATUS.NORMAL
db.session.commit()
@classmethod
def get_project_id_from_current_tool(cls, tool):
"""找到当前工具所属的项目id"""
# 找到工具所在的逻辑控制器
sub_element_in_logic_controller = SubElementInLogicController.query.filter_by(
element_id=tool.id,
element_type=ELEMENT_TYPE.TOOL,
).first()
if sub_element_in_logic_controller:
parent_logic_controller_id = sub_element_in_logic_controller.logic_controller_id
logic_controller = LogicController.query.filter_by(id=parent_logic_controller_id).first()
if logic_controller:
return LogicController.get_project_id_from_current_logic_controller(logic_controller=logic_controller)
class TimerTool(db.Model):
"""

View File

@ -16,7 +16,7 @@ from app.cores.case.debug.dispatcher import DebugCaseDispatcher
from app.cores.tool.dispatcher import ScriptToolDispatcher
from app.cores.dispatcher import async_module_run, async_project_run, apscheduler_async_project_run
from app.routes.ajax import bp
from app.utils.util import get_form_from_request, exception_handle
from app.utils.util import get_form_from_request, exception_handle, get_project_id_from_current_element
from app.models import Case, Project, Module, Scene, HTTPCase, SSHCase, SQLCase, Dispatcher, DispatcherDetail, Report, \
SubElementInLogicController, LogicController, IfController, WhileController, LoopController, SimpleController, \
Scheduler, DingTalkRobotSetting, DingTalkRobotSettingAssociationProject, DebugCase, Tool, TimerTool, ScriptTool, \
@ -809,7 +809,8 @@ def run_script_tool():
'error_no': -1,
'error_msg': '错误信息 [脚本工具状态不是正常状态 tool_id=%s, status=%s]' % (form_tool_id, tool.status),
})
result = ScriptToolDispatcher(tool=tool, dispatcher_type=DISPATCHER_TYPE.DEBUG).run() # TODO BUG 未传project_id
project_id = get_project_id_from_current_element(element=tool)
result = ScriptToolDispatcher(tool=tool, dispatcher_type=DISPATCHER_TYPE.DEBUG, project_id=project_id).run()
log_text = result.get('log_text', '')
else:
return jsonify({

View File

@ -64,3 +64,14 @@ def get_form_from_request(req, name):
})
else:
return 1, value
def get_project_id_from_current_element(element):
from app.models import Case, LogicController, Tool
if isinstance(element, Case):
return element.scene.module.project_id
elif isinstance(element, LogicController):
return LogicController.get_project_id_from_current_logic_controller(logic_controller=element)
elif isinstance(element, Tool):
return Tool.get_project_id_from_current_tool(tool=element)