Files
cdtestplant_v1/apps/project/tools/copyCase.py
2025-04-29 18:09:00 +08:00

164 lines
7.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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_idcase的key测试项的keyrenturn -> 元组(旧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()