343 lines
20 KiB
Python
343 lines
20 KiB
Python
"""该模块:选择节点新创建一个轮次,数据为选中节点"""
|
||
import re
|
||
from copy import deepcopy
|
||
from apps.project.models import Project, Round, Dut, Design, TestDemand, Case
|
||
|
||
class TreeKey(object):
|
||
"""生成一个dict,展示复制的节点tree_dict是解析后的属性名称"""
|
||
"""递归写法:
|
||
def slide(key_list):
|
||
tree_dict = {}
|
||
for key in key_list:
|
||
split_list = key.split('-', 1)
|
||
if split_list[0] not in tree_dict:
|
||
tree_dict[split_list[0]] = []
|
||
if len(split_list) > 1:
|
||
tree_dict[split_list[0]].append(split_list[1])
|
||
else:
|
||
tree_dict[split_list[0]] = 'all'
|
||
else:
|
||
if isinstance(tree_dict[split_list[0]], list):
|
||
if len(split_list) > 1:
|
||
tree_dict[split_list[0]].append(split_list[1])
|
||
else:
|
||
tree_dict[split_list[0]] = 'all'
|
||
|
||
for k, v in tree_dict.items():
|
||
if isinstance(v, list):
|
||
tree_dict[k] = slide(v)
|
||
return tree_dict
|
||
|
||
key_l = ['0-1-1-0', '0-1-2-1', '0-2-0-1']
|
||
print(slide(key_l))
|
||
"""
|
||
|
||
def __init__(self, key_list):
|
||
self.tree_dict = {}
|
||
if key_list is None:
|
||
self.key_list = []
|
||
return
|
||
self.key_list = deepcopy(key_list)
|
||
res_dict = self.list_dict(self.key_list)
|
||
for k, v in res_dict.items():
|
||
if isinstance(v, list):
|
||
res_dict[k] = self.list_dict(v)
|
||
for k1, v1 in res_dict[k].items():
|
||
if isinstance(v1, list):
|
||
res_dict[k][k1] = self.list_dict(v1)
|
||
for k2, v2 in res_dict[k][k1].items():
|
||
if isinstance(v2, list):
|
||
res_dict[k][k1][k2] = self.list_dict(v2)
|
||
for k3, v3 in res_dict[k][k1][k2].items():
|
||
if isinstance(v3, list):
|
||
res_dict[k][k1][k2][k3] = self.list_dict(v3)
|
||
self.tree_dict = res_dict
|
||
|
||
def list_dict(self, key_list) -> dict:
|
||
tree_dict = {}
|
||
for key in key_list:
|
||
split_list = key.split('-', 1)
|
||
if len(split_list) == 1:
|
||
tree_dict[split_list[0]] = 'all'
|
||
else:
|
||
if split_list[0] not in tree_dict:
|
||
tree_dict[split_list[0]] = []
|
||
if isinstance(tree_dict[split_list[0]], list):
|
||
tree_dict[split_list[0]].append(split_list[1])
|
||
return tree_dict
|
||
|
||
def copy_tree(self, round_count: int, project_obj: Project):
|
||
for round_k, round_v in self.tree_dict.items():
|
||
# 1.这是轮次层级,如果为'all',则复制整个轮次到第二轮
|
||
if round_v == 'all':
|
||
round_obj: Round = Round.objects.filter(key=round_k, project=project_obj).first()
|
||
round_obj.remark = f"第{round_count + 1}轮测试"
|
||
round_obj.ident = round_obj.ident.replace(round_obj.ident[-1], f'{round_count + 1}')
|
||
round_obj.name = f"第{round_count + 1}轮测试"
|
||
round_obj.title = f"第{round_count + 1}轮测试"
|
||
round_obj.key = f"{round_count}"
|
||
round_obj.id = None
|
||
round_obj.save()
|
||
round_origin: Round = Round.objects.filter(key=round_k, project=project_obj).first()
|
||
dut_qs = round_origin.rdField.all()
|
||
for dut in dut_qs:
|
||
dut_origin = deepcopy(dut)
|
||
dut.ident = re.sub(r"-R\d+-", f'-R{round_count + 1}-', dut.ident)
|
||
dut.key = f"{round_count}-{dut.key.split('-')[-1]}"
|
||
dut.round = round_obj
|
||
dut.id = None
|
||
dut.save()
|
||
design_qs = dut_origin.rsField.all()
|
||
for i, design in enumerate(design_qs):
|
||
design_origin = deepcopy(design)
|
||
design.key = dut.key + f"-{i}"
|
||
design.dut = dut
|
||
design.round = round_obj
|
||
design.id = None
|
||
design.save()
|
||
demand_qs = design_origin.dtField.all()
|
||
for j, demand in enumerate(demand_qs):
|
||
demand_origin = deepcopy(demand)
|
||
# 需要将demand_item也复制一份
|
||
demand.key = design.key + f"-{j}"
|
||
demand.design = design
|
||
demand.dut = dut
|
||
demand.round = round_obj
|
||
demand.id = None
|
||
demand.save()
|
||
for content_obj in demand_origin.testQField.all():
|
||
content_origin = deepcopy(content_obj)
|
||
content_obj.testDemand = demand
|
||
content_obj.id = None
|
||
content_obj.save()
|
||
# 需要将DemandContentStep也要复制一份
|
||
for step_obj in content_origin.testStepField.all():
|
||
step_obj.testDemandContent = content_obj
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
case_qs = demand_origin.tcField.all()
|
||
for k, case in enumerate(case_qs):
|
||
case_origin = deepcopy(case)
|
||
case.key = demand.key + f"-{k}"
|
||
case.test = demand
|
||
case.design = design
|
||
case.dut = dut
|
||
case.round = round_obj
|
||
case.id = None
|
||
case.save()
|
||
for step_obj in case_origin.step.all():
|
||
step_obj.case = case
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
# 2.如果不是all,下面有值
|
||
if isinstance(round_v, dict):
|
||
# 2.1 如果字典,则先要创建轮次
|
||
round_obj: Round = Round.objects.filter(key=round_k, project=project_obj).first()
|
||
round_obj.remark = f"第{round_count + 1}轮测试"
|
||
round_obj.ident = round_obj.ident.replace(round_obj.ident[-1], f'{round_count + 1}')
|
||
round_obj.name = f"第{round_count + 1}轮测试"
|
||
round_obj.title = f"第{round_count + 1}轮测试"
|
||
round_obj.key = f"{round_count}"
|
||
round_obj.id = None
|
||
round_obj.save()
|
||
dut_index = 1
|
||
for dut_k, dut_v in round_v.items():
|
||
# 2.1 如果dut_v是all,那么从该dut整体复制
|
||
dut_key_origin = round_k + "-" + dut_k
|
||
if dut_v == 'all':
|
||
# 查询原始dut
|
||
dut_obj = Dut.objects.filter(key=dut_key_origin, project=project_obj).first()
|
||
dut_obj.ident = dut_obj.ident[:11] + str(dut_index)
|
||
dut_obj.ident = re.sub(r"-R\d+-", f'-R{round_count + 1}-', dut_obj.ident)
|
||
dut_obj.key = f"{round_count}-{dut_index - 1}"
|
||
dut_obj.round = round_obj
|
||
dut_obj.id = None
|
||
dut_obj.save()
|
||
dut_origin = Dut.objects.filter(key=dut_key_origin, project=project_obj).first()
|
||
design_qs = dut_origin.rsField.all()
|
||
for i, design in enumerate(design_qs):
|
||
design_origin = deepcopy(design)
|
||
design.key = dut_obj.key + f"-{i}"
|
||
design.dut = dut_obj
|
||
design.round = round_obj
|
||
design.id = None
|
||
design.save()
|
||
demand_qs = design_origin.dtField.all()
|
||
for j, demand in enumerate(demand_qs):
|
||
demand_origin = deepcopy(demand)
|
||
# 需要将demand_item也复制一份
|
||
demand.key = design.key + f"-{j}"
|
||
demand.design = design
|
||
demand.dut = dut_obj
|
||
demand.round = round_obj
|
||
demand.id = None
|
||
demand.save()
|
||
for content_obj in demand_origin.testQField.all():
|
||
content_origin = deepcopy(content_obj)
|
||
content_obj.testDemand = demand
|
||
content_obj.id = None
|
||
content_obj.save()
|
||
# 需要将DemandContentStep也要复制一份
|
||
for step_obj in content_origin.testStepField.all():
|
||
step_obj.testDemandContent = content_obj
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
case_qs = demand_origin.tcField.all()
|
||
for k, case in enumerate(case_qs):
|
||
case_origin = deepcopy(case)
|
||
case.key = demand.key + f"-{k}"
|
||
case.test = demand
|
||
case.design = design
|
||
case.dut = dut_obj
|
||
case.round = round_obj
|
||
case.id = None
|
||
case.save()
|
||
for step_obj in case_origin.step.all():
|
||
step_obj.case = case
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
|
||
if isinstance(dut_v, dict):
|
||
dut_obj = Dut.objects.filter(key=dut_key_origin, project=project_obj).first()
|
||
dut_obj.ident = dut_obj.ident[:11] + str(dut_index)
|
||
dut_obj.ident = re.sub(r"-R\d+-", f'-R{round_count + 1}-', dut_obj.ident)
|
||
dut_obj.key = f"{round_count}-{dut_index - 1}"
|
||
dut_obj.round = round_obj
|
||
dut_obj.id = None
|
||
dut_obj.save()
|
||
design_index = 1
|
||
for design_k, design_v in dut_v.items():
|
||
design_key_origin = round_k + "-" + dut_k + "-" + design_k
|
||
if design_v == 'all':
|
||
design_obj = Design.objects.filter(key=design_key_origin, project=project_obj).first()
|
||
design_obj.key = f"{dut_obj.key}-{design_index - 1}"
|
||
design_obj.dut = dut_obj
|
||
design_obj.round = round_obj
|
||
design_obj.id = None
|
||
design_obj.save()
|
||
design_origin = Design.objects.filter(key=design_key_origin,
|
||
project=project_obj).first()
|
||
demand_qs = design_origin.dtField.all()
|
||
for j, demand in enumerate(demand_qs):
|
||
demand_origin = deepcopy(demand)
|
||
# 需要将demand_item也复制一份
|
||
demand.key = design_obj.key + f"-{j}"
|
||
demand.design = design_obj
|
||
demand.dut = dut_obj
|
||
demand.round = round_obj
|
||
demand.id = None
|
||
demand.save()
|
||
for content_obj in demand_origin.testQField.all():
|
||
content_origin = deepcopy(content_obj)
|
||
content_obj.testDemand = demand
|
||
content_obj.id = None
|
||
content_obj.save()
|
||
for step_obj in content_origin.testStepField.all():
|
||
step_obj.testDemandContent = content_obj
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
case_qs = demand_origin.tcField.all()
|
||
for k, case in enumerate(case_qs):
|
||
case_origin = deepcopy(case)
|
||
case.key = demand.key + f"-{k}"
|
||
case.test = demand
|
||
case.design = design_obj
|
||
case.dut = dut_obj
|
||
case.round = round_obj
|
||
case.id = None
|
||
case.save()
|
||
for step_obj in case_origin.step.all():
|
||
step_obj.case = case
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
|
||
if isinstance(design_v, dict):
|
||
design_obj = Design.objects.filter(key=design_key_origin, project=project_obj).first()
|
||
design_obj.key = f"{round_count}-{dut_index - 1}-{design_index - 1}"
|
||
design_obj.dut = dut_obj
|
||
design_obj.round = round_obj
|
||
design_obj.id = None
|
||
design_obj.save()
|
||
demand_index = 1
|
||
for demand_k, demand_v in design_v.items():
|
||
demand_key_origin = round_k + "-" + dut_k + "-" + design_k + "-" + demand_k
|
||
if demand_v == 'all':
|
||
demand_obj = TestDemand.objects.filter(key=demand_key_origin,
|
||
project=project_obj).first()
|
||
demand_obj.key = f"{design_obj.key}-{demand_index - 1}"
|
||
demand_obj.design = design_obj
|
||
demand_obj.dut = dut_obj
|
||
demand_obj.round = round_obj
|
||
demand_obj.id = None
|
||
demand_obj.save()
|
||
demand_origin = TestDemand.objects.filter(key=demand_key_origin,
|
||
project=project_obj).first()
|
||
for content_obj in demand_origin.testQField.all():
|
||
content_origin = deepcopy(content_obj)
|
||
content_obj.testDemand = demand_obj
|
||
content_obj.id = None
|
||
content_obj.save()
|
||
for step_obj in content_origin.testStepField.all():
|
||
step_obj.testDemandContent = content_obj
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
case_qs = demand_origin.tcField.all()
|
||
for k, case in enumerate(case_qs):
|
||
case_origin = deepcopy(case)
|
||
case.key = demand_obj.key + f"-{k}"
|
||
case.test = demand_obj
|
||
case.design = design_obj
|
||
case.dut = dut_obj
|
||
case.round = round_obj
|
||
case.id = None
|
||
case.save()
|
||
for step_obj in case_origin.step.all():
|
||
step_obj.case = case
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
|
||
if isinstance(demand_v, dict):
|
||
demand_obj = TestDemand.objects.filter(key=demand_key_origin,
|
||
project=project_obj).first()
|
||
demand_obj.key = f"{round_count}-{dut_index - 1}-{design_index - 1}-{demand_index - 1}"
|
||
demand_obj.design = design_obj
|
||
demand_obj.dut = dut_obj
|
||
demand_obj.round = round_obj
|
||
demand_obj.id = None
|
||
demand_obj.save()
|
||
demand_origin = TestDemand.objects.filter(key=demand_key_origin,
|
||
project=project_obj).first()
|
||
for content_obj in demand_origin.testQField.all():
|
||
content_origin = deepcopy(content_obj)
|
||
content_obj.testDemand = demand_obj
|
||
content_obj.id = None
|
||
content_obj.save()
|
||
for step_obj in content_origin.testStepField.all():
|
||
step_obj.testDemandContent = content_obj
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
case_index = 1
|
||
for case_k, case_v in demand_v.items():
|
||
case_key_origin = round_k + "-" + dut_k + "-" + design_k + "-" + demand_k + "-" + case_k
|
||
if case_v == 'all':
|
||
case_obj = Case.objects.filter(key=case_key_origin,
|
||
project=project_obj).first()
|
||
case_obj.key = f"{demand_obj.key}-{case_index}"
|
||
case_obj.test = demand_obj
|
||
case_obj.dut = dut_obj
|
||
case_obj.design = design_obj
|
||
case_obj.round = round_obj
|
||
case_obj.id = None
|
||
case_obj.save()
|
||
case_origin = Case.objects.filter(key=case_key_origin,
|
||
project=project_obj).first()
|
||
for step_obj in case_origin.step.all():
|
||
step_obj.case = case_obj
|
||
step_obj.id = None
|
||
step_obj.save()
|
||
|
||
case_index += 1
|
||
demand_index += 1
|
||
design_index += 1
|
||
dut_index += 1
|