Files
cdtestplant_v1/apps/createDocument/extensions/content_result_tool.py

116 lines
5.9 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 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