bug fix: 修复脚本工具单独调试时没有传入project_id的问题
This commit is contained in:
parent
4ebee5353a
commit
60088e41e9
|
@ -77,8 +77,9 @@ def register_shell_context(app: Flask):
|
||||||
HTTPCaseFileUpload, Project, Module, Scene, Dispatcher, DispatcherDetail, Report,
|
HTTPCaseFileUpload, Project, Module, Scene, Dispatcher, DispatcherDetail, Report,
|
||||||
ReportCaseData, ReportCaseExpectationData, SubElementInLogicController,
|
ReportCaseData, ReportCaseExpectationData, SubElementInLogicController,
|
||||||
ReportToolData, ReportScriptToolData, ReportTimerToolData, ReportVariableDefinitionToolData,
|
ReportToolData, ReportScriptToolData, ReportTimerToolData, ReportVariableDefinitionToolData,
|
||||||
ReportVariableDefinitionToolListData)
|
ReportVariableDefinitionToolListData, Tool)
|
||||||
from app.email import send_email
|
from app.email import send_email
|
||||||
|
from app.utils.util import get_project_id_from_current_element
|
||||||
|
|
||||||
@app.shell_context_processor
|
@app.shell_context_processor
|
||||||
def make_shell_context():
|
def make_shell_context():
|
||||||
|
@ -95,6 +96,7 @@ def register_shell_context(app: Flask):
|
||||||
'Project': Project,
|
'Project': Project,
|
||||||
'Module': Module,
|
'Module': Module,
|
||||||
'Scene': Scene,
|
'Scene': Scene,
|
||||||
|
'Tool': Tool,
|
||||||
'Dispatcher': Dispatcher,
|
'Dispatcher': Dispatcher,
|
||||||
'DispatcherDetail': DispatcherDetail,
|
'DispatcherDetail': DispatcherDetail,
|
||||||
'SubElementInLogicController': SubElementInLogicController,
|
'SubElementInLogicController': SubElementInLogicController,
|
||||||
|
@ -103,6 +105,7 @@ def register_shell_context(app: Flask):
|
||||||
'ReportTimerToolData': ReportTimerToolData,
|
'ReportTimerToolData': ReportTimerToolData,
|
||||||
'ReportVariableDefinitionToolData': ReportVariableDefinitionToolData,
|
'ReportVariableDefinitionToolData': ReportVariableDefinitionToolData,
|
||||||
'ReportVariableDefinitionToolListData': ReportVariableDefinitionToolListData,
|
'ReportVariableDefinitionToolListData': ReportVariableDefinitionToolListData,
|
||||||
|
'get_project_id_from_current_element': get_project_id_from_current_element,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ from app.cores.tool.http_request_header_manager import HTTPRequestHeaderManager
|
||||||
|
|
||||||
|
|
||||||
class ScriptToolDispatcher(AbstractToolDispatcher):
|
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工具组件
|
:param tool: 单个Script Tool工具组件
|
||||||
:type tool: Tool
|
:type tool: Tool
|
||||||
|
@ -19,9 +19,12 @@ class ScriptToolDispatcher(AbstractToolDispatcher):
|
||||||
:type logger: DispatcherLogger
|
:type logger: DispatcherLogger
|
||||||
:param dispatcher: 当dispatcher_type为DISPATCHER_TYPE.BUILD时,需要传入调度数据
|
:param dispatcher: 当dispatcher_type为DISPATCHER_TYPE.BUILD时,需要传入调度数据
|
||||||
:type dispatcher: Dispatcher
|
:type dispatcher: Dispatcher
|
||||||
|
:param project_id: 工具所属的项目id
|
||||||
|
:type project_id: int
|
||||||
"""
|
"""
|
||||||
super().__init__(tool=tool, dispatcher_type=dispatcher_type, logger=logger, dispatcher=dispatcher)
|
super().__init__(tool=tool, dispatcher_type=dispatcher_type, logger=logger, dispatcher=dispatcher)
|
||||||
|
|
||||||
|
self.project_id = project_id
|
||||||
# 脚本执行日志
|
# 脚本执行日志
|
||||||
self.log_text = ''
|
self.log_text = ''
|
||||||
|
|
||||||
|
@ -30,7 +33,7 @@ class ScriptToolDispatcher(AbstractToolDispatcher):
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
super().execute()
|
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):
|
def tear_down(self):
|
||||||
super().tear_down()
|
super().tear_down()
|
||||||
|
|
|
@ -578,6 +578,29 @@ class LogicController(db.Model):
|
||||||
cls.copy(original_logic_controller=original_logic_controller,
|
cls.copy(original_logic_controller=original_logic_controller,
|
||||||
parent_logic_controller=new_logic_controller, scene_id=scene_id)
|
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):
|
class SubElementInLogicController(db.Model):
|
||||||
"""
|
"""
|
||||||
|
@ -1079,6 +1102,20 @@ class Tool(db.Model):
|
||||||
tool.status = STATUS.NORMAL
|
tool.status = STATUS.NORMAL
|
||||||
db.session.commit()
|
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):
|
class TimerTool(db.Model):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -16,7 +16,7 @@ from app.cores.case.debug.dispatcher import DebugCaseDispatcher
|
||||||
from app.cores.tool.dispatcher import ScriptToolDispatcher
|
from app.cores.tool.dispatcher import ScriptToolDispatcher
|
||||||
from app.cores.dispatcher import async_module_run, async_project_run, apscheduler_async_project_run
|
from app.cores.dispatcher import async_module_run, async_project_run, apscheduler_async_project_run
|
||||||
from app.routes.ajax import bp
|
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, \
|
from app.models import Case, Project, Module, Scene, HTTPCase, SSHCase, SQLCase, Dispatcher, DispatcherDetail, Report, \
|
||||||
SubElementInLogicController, LogicController, IfController, WhileController, LoopController, SimpleController, \
|
SubElementInLogicController, LogicController, IfController, WhileController, LoopController, SimpleController, \
|
||||||
Scheduler, DingTalkRobotSetting, DingTalkRobotSettingAssociationProject, DebugCase, Tool, TimerTool, ScriptTool, \
|
Scheduler, DingTalkRobotSetting, DingTalkRobotSettingAssociationProject, DebugCase, Tool, TimerTool, ScriptTool, \
|
||||||
|
@ -809,7 +809,8 @@ def run_script_tool():
|
||||||
'error_no': -1,
|
'error_no': -1,
|
||||||
'error_msg': '错误信息 [脚本工具状态不是正常状态 tool_id=%s, status=%s]' % (form_tool_id, tool.status),
|
'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', '')
|
log_text = result.get('log_text', '')
|
||||||
else:
|
else:
|
||||||
return jsonify({
|
return jsonify({
|
||||||
|
|
|
@ -64,3 +64,14 @@ def get_form_from_request(req, name):
|
||||||
})
|
})
|
||||||
else:
|
else:
|
||||||
return 1, value
|
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)
|
||||||
|
|
Loading…
Reference in New Issue