164 lines
7.4 KiB
Python
164 lines
7.4 KiB
Python
from typing import Tuple, Any
|
||
from copy import deepcopy
|
||
from django.shortcuts import get_object_or_404
|
||
from apps.project.models import Project
|
||
from ninja.errors import HttpError
|
||
|
||
# 1. case被移动到某测试项下面
|
||
def case_move_to_test(project_id: int, case_key: str, demand_key: str) -> Tuple[str, Any]:
|
||
"""移动case到某个测试项下面,传入project_id,case的key,测试项的key,renturn -> 元组(旧case的key,新case的key)"""
|
||
same_root_flag = False
|
||
if '-'.join(case_key.split('-')[:-1]) == demand_key:
|
||
same_root_flag = True
|
||
# 判断是否移动到自己所属的demand的,直接返回不操作
|
||
if same_root_flag:
|
||
raise HttpError(500, message='无法移动到自己所属测试项里面')
|
||
project_qs = get_object_or_404(Project, id=project_id)
|
||
case = project_qs.pcField.filter(key=case_key).first()
|
||
demand_origin = case.test # 未变化之前case对应的测试项
|
||
demand = project_qs.ptField.filter(key=demand_key).first() # 新的demand对象
|
||
case.ident = demand.ident
|
||
case.test = demand
|
||
case.round = demand.round
|
||
case.dut = demand.dut
|
||
case.design = demand.design
|
||
# 查询被拖拽到的demand有多少用例,用于设置key
|
||
case.key = "".join([demand.key, '-', str(demand.tcField.count())])
|
||
case.save()
|
||
# 因为移动要删除之前demand的用例,所以需要重新设置key
|
||
index = 0
|
||
for c in demand_origin.tcField.all():
|
||
c.key = "".join([demand_origin.key, '-', str(index)])
|
||
c.save()
|
||
index += 1
|
||
return case_key, case.key
|
||
|
||
# 2.case复制到测试项中
|
||
def case_copy_to_test(project_id: int, case_key: str, demand_key: str) -> Tuple[str, Any]:
|
||
# 初始化内容
|
||
project_qs = get_object_or_404(Project, id=project_id)
|
||
case = project_qs.pcField.filter(key=case_key).first()
|
||
demand = project_qs.ptField.filter(key=demand_key).first()
|
||
origin_case = deepcopy(case)
|
||
case.id = None
|
||
case.ident = demand.ident
|
||
case.test = demand
|
||
case.round = demand.round
|
||
case.dut = demand.dut
|
||
case.design = demand.design
|
||
case.key = "".join([demand.key, '-', str(demand.tcField.count())])
|
||
case.save()
|
||
# 用例步骤也要复制一份过去
|
||
for case_step in origin_case.step.all():
|
||
case_step.id = None
|
||
case_step.case = case
|
||
case_step.save()
|
||
return case_key, case.key
|
||
|
||
# 3.(需要拆分)拖拽用例到用例的函数,TODO:必须拆分
|
||
def case_to_case_copy_or_move(project_id: int, drag_key: str, drop_key: str, move: bool, position: int):
|
||
"""待优化和上面一样:TODO:封装多个函数理清思路"""
|
||
project_qs = get_object_or_404(Project, id=project_id)
|
||
drag_case = project_qs.pcField.filter(key=drag_key).first()
|
||
drag_demand = drag_case.test
|
||
drop_case = project_qs.pcField.filter(key=drop_key).first()
|
||
drop_demand = drop_case.test
|
||
# 判断是否移动到同级
|
||
same_root_flag = False
|
||
if drag_key.split('-')[:-2] == drop_key.split('-')[:-2]:
|
||
same_root_flag = True
|
||
if move:
|
||
# 1.移动到同级demand - 只需要改变2个key
|
||
if same_root_flag:
|
||
case_list = list(drag_demand.tcField.all()) # 这是已经排序的
|
||
case_list.pop(case_list.index(drag_case))
|
||
# 移动出去后,查看现在drop_case索引
|
||
drop_case_index = case_list.index(drop_case)
|
||
if position == 0 or position == 1: # 1和0就是往下放,首先drop的位置是不变的
|
||
case_list.insert(drop_case_index + 1, drag_case)
|
||
elif position == -1:
|
||
case_list.insert(drop_case_index, drag_case)
|
||
# 已经排序好了就开始修改key
|
||
ca_index = 0
|
||
for ca in case_list:
|
||
ca.key = "".join([drag_demand.key, '-', str(ca_index)])
|
||
ca.save()
|
||
ca_index += 1
|
||
# 2.移动到非同级demand
|
||
else:
|
||
drag_case.ident = drop_demand.ident
|
||
drag_case.test = drop_demand
|
||
drag_case.round = drop_demand.round
|
||
drag_case.dut = drop_demand.dut
|
||
drag_case.design = drop_demand.design
|
||
drag_case.save() # 到这里drag_case已经放入了drop_demand
|
||
# 查询所有的drop_demand的所有用例
|
||
drop_case_list = list(drop_demand.tcField.all())
|
||
drop_case_list.pop(drop_case_list.index(drag_case))
|
||
drop_case_index = drop_case_list.index(drop_case)
|
||
if position == 0 or position == 1: # 1和0就是往下放,首先drop的位置是不变的
|
||
drop_case_list.insert(drop_case_index + 1, drag_case)
|
||
elif position == -1:
|
||
drop_case_list.insert(drop_case_index, drag_case)
|
||
ca_ind = 0
|
||
for ca in drop_case_list:
|
||
ca.key = "".join([drop_demand.key, '-', str(ca_ind)])
|
||
ca.save()
|
||
ca_ind += 1
|
||
# 因为移动要删除之前demand的用例,所以需要重新设置key
|
||
index = 0
|
||
for c in drag_demand.tcField.all():
|
||
c.key = "".join([drag_demand.key, '-', str(index)])
|
||
c.save()
|
||
index += 1
|
||
# 如果是复制
|
||
else:
|
||
origin_drag_case = deepcopy(drag_case) # 深度复制被拖拽的case
|
||
# 同一个测试项内用例的复制,还要看顺序
|
||
if same_root_flag:
|
||
drag_case.id = None
|
||
drag_case.save()
|
||
# 开始插入到被拖拽case上下
|
||
case_sx_list = list(drag_demand.tcField.all())
|
||
case_sx_list.pop(case_sx_list.index(drag_case))
|
||
drop_case_in = case_sx_list.index(drop_case)
|
||
if position == 0 or position == 1: # 1和0就是往下放,首先drop的位置是不变的
|
||
case_sx_list.insert(drop_case_in + 1, drag_case)
|
||
elif position == -1:
|
||
case_sx_list.insert(drop_case_in, drag_case)
|
||
ind = 0
|
||
for cas in case_sx_list:
|
||
cas.key = "".join([drag_demand.key, '-', str(ind)])
|
||
cas.save()
|
||
ind += 1
|
||
# 根据origin复制步骤
|
||
for c_step in origin_drag_case.step.all():
|
||
c_step.id = None
|
||
c_step.case = drag_case # 外键设置为新用例
|
||
c_step.save()
|
||
else:
|
||
drag_case.id = None
|
||
drag_case.ident = drop_demand.ident
|
||
drag_case.test = drop_demand
|
||
drag_case.round = drop_demand.round
|
||
drag_case.dut = drop_demand.dut
|
||
drag_case.design = drop_demand.design
|
||
drag_case.save()
|
||
cases_list = list(drop_demand.tcField.all())
|
||
cases_list.pop(cases_list.index(drag_case))
|
||
drop_case_idx = cases_list.index(drop_case)
|
||
if position == 0 or position == 1: # 1和0就是往下放,首先drop的位置是不变的
|
||
cases_list.insert(drop_case_idx + 1, drag_case)
|
||
elif position == -1:
|
||
cases_list.insert(drop_case_idx, drag_case)
|
||
cas_idx = 0
|
||
for cas in cases_list:
|
||
cas.key = "".join([drop_demand.key, '-', str(cas_idx)])
|
||
cas.save()
|
||
cas_idx += 1
|
||
# 复制用例步骤
|
||
for cs_step in origin_drag_case.step.all():
|
||
cs_step.id = None
|
||
cs_step.case = drag_case # 外键设置为新用例
|
||
cs_step.save()
|