116 lines
5.9 KiB
Python
116 lines
5.9 KiB
Python
from apps.project.models import Project, Round, InfluenceArea
|
||
from docxtpl import DocxTemplate
|
||
from utils.util import *
|
||
from utils.chen_response import ChenResponse
|
||
from django.db.models import Q
|
||
from apps.createDocument.extensions.parse_rich_text import RichParser
|
||
|
||
def create_round_context(project_obj: Project, round_id: str):
|
||
"""根据轮次,生成测评报告中的测评结果"""
|
||
# 0. 首先定义个轮次对应中文
|
||
round_chinese = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
|
||
round_id = int(round_id)
|
||
round_str_id = str(round_id)
|
||
# 1. 首先先查询给定轮次的round对向
|
||
round_obj = project_obj.pField.filter(key=round_str_id).first()
|
||
# 如果没有轮次对象则返回错误
|
||
if not round_obj:
|
||
return ChenResponse(code=400, status=400, message='注意您没有设置第二轮测试,请添加!')
|
||
dut_qs_r2 = round_obj.rdField # 当前轮被测件dut对象qs
|
||
dut_qs_r1 = project_obj.pdField.filter(round__key=str(round_id - 1)) # 上一个轮次被测件dut对象qs
|
||
|
||
# 查询当前轮次duts,是否有源代码,如果没有返回错误
|
||
so_dut = dut_qs_r2.filter(type='SO').first() # 当前轮次源代码被测件对象
|
||
if not so_dut:
|
||
return ChenResponse(code=400, status=400, message='注意您某轮次没有编写源代码被测件信息,务必添加...')
|
||
|
||
# 查询上一个轮次的dut中的源代码、需求文档
|
||
r1_so_dut = dut_qs_r1.filter(type='SO').first()
|
||
|
||
# 3. 文档审查清单
|
||
doc_list = []
|
||
round_duts = round_obj.rdField.filter(Q(type='SJ') | Q(type='XQ') | Q(type='XY'))
|
||
for dut in round_duts:
|
||
dut_dict = {
|
||
'name': dut.name,
|
||
'ident': dut.ref,
|
||
'version': dut.version
|
||
}
|
||
doc_list.append(dut_dict)
|
||
|
||
# 4. 发现多少个问题,什么类型多少个问题
|
||
problems = project_obj.projField.all().distinct() # !important:大变量-项目所有问题
|
||
problems_r2 = problems.filter(case__round__key=round_str_id) # 当前轮次所有问题
|
||
|
||
# 7. 第二轮动态测试用例个数(动态测试-非静态分析、文档审查、代码审查、代码走查4个)
|
||
case_r2_qs = round_obj.rcField.filter(~Q(test__testType='2'), ~Q(test__testType='3'), ~Q(test__testType='8'),
|
||
~Q(test__testType='15')) # !warning:中变量-第一轮动态测试用例qs
|
||
testType_list, testType_count = create_str_testType_list(case_r2_qs)
|
||
## 动态测试(第一轮)各个类型测试用例执行表/各个测试需求表
|
||
demand_r2_dynamic_qs = round_obj.rtField.filter(~Q(testType='2'), ~Q(testType='3'), ~Q(testType='8'),
|
||
~Q(testType='15')) # !warning:中变量:第一轮动态测试的测试项
|
||
summary_r2_demand_info, summry_r2_demandType_info = create_demand_summary(demand_r2_dynamic_qs,
|
||
project_obj.ident)
|
||
|
||
# 8.第二轮所有动态问题统计
|
||
problems_dynamic_r2 = problems_r2.filter(~Q(case__test__testType='2'), ~Q(case__test__testType='3'),
|
||
~Q(case__test__testType='8'),
|
||
~Q(case__test__testType='15')) # !critical:大变量:第一轮动态问题单qs
|
||
problem_dynamic_r2_type_str = create_problem_type_str(problems_dynamic_r2)
|
||
problem_dynamic_r2_grade_str = create_problem_grade_str(problems_dynamic_r2)
|
||
r2_dynamic_str = "本轮测试未发现新问题。"
|
||
has_r2_dynamic = False
|
||
if len(problems_dynamic_r2) > 0:
|
||
has_r2_dynamic = True
|
||
r2_dynamic_str = (f"第{round_chinese[int(round_id)]}轮动态测试共发现问题{problems_dynamic_r2.count()}个,"
|
||
f"其中{problem_dynamic_r2_type_str};"
|
||
f"{problem_dynamic_r2_grade_str}。")
|
||
|
||
context = {
|
||
'project_name': project_obj.name,
|
||
'r1_so_version': r1_so_dut.version,
|
||
'so_version': so_dut.version,
|
||
'case_dynamic_r2_count': case_r2_qs.count(),
|
||
'dynamic_testType_list': '、'.join(testType_list),
|
||
'dynamic_testType_count': testType_count,
|
||
'r2_exe_info_all': summary_r2_demand_info,
|
||
'r2_exe_info_type': summry_r2_demandType_info,
|
||
'has_r2_dynamic': has_r2_dynamic,
|
||
'r2_dynamic_str': r2_dynamic_str,
|
||
'round_id': round_chinese[round_id],
|
||
}
|
||
return context, round_obj
|
||
|
||
# ~~~影响域分析:内容返回influence的render_list~~~
|
||
def create_influence_context(doc: DocxTemplate, round_obj: Round, project_obj: Project) -> None | list:
|
||
area_qs = InfluenceArea.objects.filter(round=round_obj)
|
||
item_render_list = []
|
||
## 如果存在则查询items
|
||
if area_qs.exists():
|
||
area_obj = area_qs.first()
|
||
items_qs = area_obj.influence_items.all()
|
||
if items_qs.exists():
|
||
index = 1
|
||
for item in items_qs:
|
||
# 1.处理关联case - 找第一轮cases
|
||
case_str_list = []
|
||
for case in project_obj.pcField.filter(key__in=item.effect_cases):
|
||
case_ident_index = str(int(case.key.split("-")[-1]) + 1).zfill(3)
|
||
case_str_list.append("_".join(["YL", get_str_abbr(case.test.testType, "testType"), case.ident, case_ident_index]))
|
||
# 2.处理富文本框
|
||
parser = RichParser(item.change_des)
|
||
item_dict = {
|
||
"change_type": item.change_type,
|
||
"change_influ": item.change_influ,
|
||
"case_str_list": case_str_list,
|
||
"change_des": parser.get_final_list(doc, img_size=40, height=30), # 富文本未处理
|
||
"index": str(index),
|
||
}
|
||
index = index + 1
|
||
item_render_list.append(item_dict)
|
||
|
||
if len(item_render_list) > 0:
|
||
return item_render_list
|
||
else:
|
||
return None
|