大表功能完成
This commit is contained in:
@@ -7,11 +7,14 @@ from ninja.errors import HttpError
|
||||
from utils.chen_pagination import MyPagination
|
||||
from django.db import transaction
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.db.models.functions import Replace
|
||||
from django.db.models import Q, F, Value
|
||||
from typing import List
|
||||
from utils.chen_response import ChenResponse
|
||||
from utils.chen_crud import multi_delete_case
|
||||
from apps.project.models import Design, Dut, Round, TestDemand, Case, CaseStep, Project, Problem
|
||||
from apps.project.schemas.case import DeleteSchema, CaseModelOutSchema, CaseFilterSchema, CaseTreeReturnSchema, \
|
||||
from apps.project.schemas.case import DeleteSchema, CaseModelOutSchema, CaseFilterSchema, \
|
||||
CaseTreeReturnSchema, ReplaceCaseSchema, PersonReplaceSchema, ExetimeReplaceSchema, \
|
||||
CaseTreeInputSchema, CaseCreateOutSchema, CaseCreateInputSchema, DemandNodeSchema
|
||||
from utils.util import get_testType
|
||||
from utils.codes import HTTP_INDEX_ERROR, HTTP_EXISTS_CASES
|
||||
@@ -35,15 +38,23 @@ class CaseController(ControllerBase):
|
||||
qs = Case.objects.filter(id=case_id) # type:ignore
|
||||
else:
|
||||
conditionNoneToBlank(data)
|
||||
test_key = "".join([data.round_id, '-', data.dut_id, '-', data.design_id, '-', data.test_id])
|
||||
qs = Case.objects.filter(project__id=data.project_id, test__key=test_key, # type:ignore
|
||||
ident__icontains=data.ident,
|
||||
name__icontains=data.name,
|
||||
designPerson__icontains=data.designPerson,
|
||||
testPerson__icontains=data.testPerson,
|
||||
monitorPerson__icontains=data.monitorPerson,
|
||||
summarize__icontains=data.summarize,
|
||||
).order_by("key")
|
||||
query_params = {
|
||||
'project__id': data.project_id,
|
||||
'ident__icontains': data.ident,
|
||||
'name__icontains': data.name,
|
||||
'designPerson__icontains': data.designPerson,
|
||||
'testPerson__icontains': data.testPerson,
|
||||
'monitorPerson__icontains': data.monitorPerson,
|
||||
'summarize__icontains': data.summarize
|
||||
}
|
||||
# 如果没有多个key则是“那个汇总界面”
|
||||
if data.dut_id and data.design_id and data.test_id:
|
||||
test_key = "".join([data.round_id, '-', data.dut_id, '-', data.design_id, '-', data.test_id])
|
||||
query_params['test__key'] = test_key
|
||||
else:
|
||||
# 汇总界面只查round
|
||||
query_params['round__key'] = data.round_id
|
||||
qs = Case.objects.filter(**query_params).order_by("key")
|
||||
# 由于有嵌套query_set存在,把每个用例的schema加上一个字段
|
||||
query_list = []
|
||||
for query_single in qs:
|
||||
@@ -54,6 +65,14 @@ class CaseController(ControllerBase):
|
||||
related_problem: Problem = query_single.caseField.first()
|
||||
if query_single.caseField.all():
|
||||
setattr(query_single, 'problem', related_problem)
|
||||
# 2025年5月10日在test字段加上testContent
|
||||
test_obj = query_single.test
|
||||
sub_list = []
|
||||
for step_obj in test_obj.testQField.all():
|
||||
setattr(step_obj, "subStep", step_obj.testStepField.all().values())
|
||||
sub_list.append(step_obj)
|
||||
setattr(test_obj, "testContent", sub_list)
|
||||
setattr(query_single, 'test', test_obj)
|
||||
query_list.append(query_single)
|
||||
return query_list
|
||||
|
||||
@@ -69,6 +88,17 @@ class CaseController(ControllerBase):
|
||||
return case
|
||||
raise HttpError(500, "您获取的数据不存在")
|
||||
|
||||
@route.get("/getCaseOneById", response=CaseModelOutSchemaWithoutProblem, url_name='case-one-by-id')
|
||||
@transaction.atomic
|
||||
def get_case_by_id(self, id: int):
|
||||
"""用于在用例树状页面,获取promblem信息,这里根据key获取信息"""
|
||||
case = Case.objects.filter(id=id).first()
|
||||
if case:
|
||||
setattr(case, "testStep", case.step.all().values())
|
||||
setattr(case, 'testType', get_testType(case.test.testType, dict_code='testType'))
|
||||
return case
|
||||
raise HttpError(500, "您获取的数据不存在")
|
||||
|
||||
# 处理树状数据
|
||||
@route.get("/getCaseInfo", response=List[CaseTreeReturnSchema], url_name="case-info")
|
||||
@transaction.atomic
|
||||
@@ -108,8 +138,9 @@ class CaseController(ControllerBase):
|
||||
# 直接把测试项的标识给前端处理显示
|
||||
asert_dict['ident'] = test_instance.ident
|
||||
# ~~~~~~~~~end~~~~~~~~~
|
||||
asert_dict.update({'key': key_string, 'round': round_instance, 'dut': dut_instance, 'design': design_instance,
|
||||
"test": test_instance, 'title': payload.name})
|
||||
asert_dict.update(
|
||||
{'key': key_string, 'round': round_instance, 'dut': dut_instance, 'design': design_instance,
|
||||
"test": test_instance, 'title': payload.name})
|
||||
asert_dict.pop("round_key")
|
||||
asert_dict.pop("dut_key")
|
||||
asert_dict.pop("design_key")
|
||||
@@ -144,7 +175,8 @@ class CaseController(ControllerBase):
|
||||
content_single.delete()
|
||||
data_list = []
|
||||
for item in value:
|
||||
if item['operation'] or item['expect'] or item['result'] or item['passed'] or item['status']:
|
||||
if item['operation'] or item['expect'] or item['result'] or item['passed'] or item[
|
||||
'status']:
|
||||
item["case"] = case_qs
|
||||
data_list.append(CaseStep(**item))
|
||||
CaseStep.objects.bulk_create(data_list) # type:ignore
|
||||
@@ -186,7 +218,8 @@ class CaseController(ControllerBase):
|
||||
# 先查询当前测试项下面有无case
|
||||
case_exists = demand.tcField.exists()
|
||||
if case_exists:
|
||||
return ChenResponse(status=500, code=HTTP_EXISTS_CASES, message='测试项下面有用例,请删除后生成')
|
||||
return ChenResponse(status=500, code=HTTP_EXISTS_CASES,
|
||||
message='测试项下面有用例,请删除后生成')
|
||||
# 查询所有测试子项
|
||||
sub_items = demand.testQField.all()
|
||||
# 每一个子项都创建一个用例,先声明一个列表,后面可以bulk_create
|
||||
@@ -224,7 +257,8 @@ class CaseController(ControllerBase):
|
||||
CaseStep.objects.create(**case_step_dict) # type:ignore
|
||||
index += 1
|
||||
# 这里返回一个demand的key用于前端刷新树状图
|
||||
return ChenResponse(data={'key': demand_node.key}, status=200, code=200, message='测试项自动生成用例成功')
|
||||
return ChenResponse(data={'key': demand_node.key}, status=200, code=200,
|
||||
message='测试项自动生成用例成功')
|
||||
|
||||
# 测试用例复制/移动到测试项上
|
||||
@route.get("/case/copy_or_move_to_demand", url_name='case-copy-move-demand')
|
||||
@@ -240,6 +274,56 @@ class CaseController(ControllerBase):
|
||||
# 测试用例复制/移动到用例
|
||||
@route.get("/case/copy_or_move_by_case", url_name='case-copy-move-case')
|
||||
@transaction.atomic
|
||||
def copy_move_case_by_case(self, project_id: int, drag_key: str, drop_key: str, move: bool, position: int):
|
||||
def copy_move_case_by_case(self, project_id: int, drag_key: str, drop_key: str, move: bool,
|
||||
position: int):
|
||||
case_to_case_copy_or_move(project_id, drag_key, drop_key, move, position)
|
||||
return ChenResponse(data={'old': {'key': drag_key}, 'new': {'key': drop_key}})
|
||||
|
||||
# 用例-替换接口
|
||||
@route.post("/case/replace/", url_name='case-replace')
|
||||
@transaction.atomic
|
||||
def replace_case_step_content(self, payload: ReplaceCaseSchema):
|
||||
# 1.首先查询项目
|
||||
project_obj: Project = get_object_or_404(Project, id=payload.project_id)
|
||||
# 2.查询[所有轮次]的selectRows的id
|
||||
case_qs = project_obj.pcField.filter(id__in=payload.selectRows, round__key=payload.round_key)
|
||||
# 3.批量替换里面文本(解构不影响老数组)
|
||||
selectColumn = [x for x in payload.selectColumn if x != 'testStep']
|
||||
replace_kwargs = {
|
||||
field_name: Replace(F(field_name), Value(payload.originText), Value(payload.replaceText))
|
||||
for field_name in selectColumn
|
||||
}
|
||||
# 4.单独处理testContentStep的操作、预期-查询所有
|
||||
# 4.1.获取所有关联的TestDemandContentStep
|
||||
step_count = 0
|
||||
if 'testStep' in payload.selectColumn:
|
||||
caseStep_qs = CaseStep.objects.filter(case__in=case_qs)
|
||||
# 批量更新 operation 和 expect
|
||||
step_count = caseStep_qs.update(
|
||||
operation=Replace(F('operation'), Value(payload.originText), Value(payload.replaceText)),
|
||||
expect=Replace(F('expect'), Value(payload.originText), Value(payload.replaceText))
|
||||
)
|
||||
# 5.提交更新
|
||||
replace_count = case_qs.update(**replace_kwargs)
|
||||
return {'count': replace_count + step_count}
|
||||
|
||||
# 批量替换设计人员、执行人员、审核人员
|
||||
@route.post("/case/personReplace/", url_name='case-person-replace')
|
||||
@transaction.atomic
|
||||
def bulk_replace_person(self, payload: PersonReplaceSchema):
|
||||
# 替换设计人员
|
||||
case_qs = Case.objects.filter(id__in=payload.selectRows)
|
||||
if payload.designPerson != '不替换' and payload.designPerson != '':
|
||||
case_qs.update(designPerson=payload.designPerson)
|
||||
if payload.testPerson != '不替换' and payload.testPerson != '':
|
||||
case_qs.update(testPerson=payload.testPerson)
|
||||
if payload.monitorPerson != '不替换' and payload.monitorPerson != '':
|
||||
case_qs.update(monitorPerson=payload.monitorPerson)
|
||||
|
||||
# 批量替换事件
|
||||
@route.post("/case/timeReplace/", url_name='case-time-replace')
|
||||
@transaction.atomic
|
||||
def bulk_replace_time(self, payload: ExetimeReplaceSchema):
|
||||
# 替换设计人员
|
||||
case_qs = Case.objects.filter(id__in=payload.selectRows)
|
||||
case_qs.update(exe_time=payload.exetime)
|
||||
|
||||
Reference in New Issue
Block a user