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()
|