保存修订
This commit is contained in:
Binary file not shown.
@@ -3,7 +3,7 @@ from pathlib import Path
|
||||
from ninja_extra import api_controller, ControllerBase, route
|
||||
from django.db import transaction
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.db.models import Q
|
||||
from django.db.models import Q, QuerySet
|
||||
from docxtpl import DocxTemplate
|
||||
from typing import Optional
|
||||
from docx import Document
|
||||
@@ -16,7 +16,8 @@ from apps.createDocument.extensions import util
|
||||
from utils.chen_response import ChenResponse
|
||||
from apps.createDocument.extensions.util import create_bg_docx, get_round1_problem
|
||||
from utils.util import get_str_dict, get_list_dict, create_problem_grade_str, create_str_testType_list, \
|
||||
create_demand_summary, create_problem_type_str, create_problem_table, create_problem_type_table, get_str_abbr
|
||||
create_demand_summary, create_problem_type_str, create_problem_table, create_problem_type_table, \
|
||||
get_str_abbr
|
||||
# 根据轮次生成测评内容文档context
|
||||
from apps.createDocument.extensions.content_result_tool import create_round_context
|
||||
from apps.createDocument.extensions.zhui import create_bg_round1_zhui
|
||||
@@ -62,9 +63,11 @@ class GenerateControllerBG(ControllerBase):
|
||||
'publish_date': timer.dg_cover_time, 'source': project_obj.test_unit}
|
||||
std_documents.append(dg_duty)
|
||||
# 需要添加说明、记录
|
||||
sm_duty = {'doc_name': f'{project_obj.name}软件测试说明', 'ident_version': f'PT-{project_obj.ident}-TD-1.00',
|
||||
sm_duty = {'doc_name': f'{project_obj.name}软件测试说明',
|
||||
'ident_version': f'PT-{project_obj.ident}-TD-1.00',
|
||||
'publish_date': timer.sm_cover_time, 'source': project_obj.test_unit}
|
||||
jl_duty = {'doc_name': f'{project_obj.name}软件测试记录', 'ident_version': f'PT-{project_obj.ident}-TN',
|
||||
jl_duty = {'doc_name': f'{project_obj.name}软件测试记录',
|
||||
'ident_version': f'PT-{project_obj.ident}-TN',
|
||||
'publish_date': timer.jl_cover_time, 'source': project_obj.test_unit}
|
||||
# 循环所有轮次,除了第一轮
|
||||
std_documents.extend([sm_duty, jl_duty])
|
||||
@@ -144,7 +147,8 @@ class GenerateControllerBG(ControllerBase):
|
||||
for case in round1_case_qs:
|
||||
demand: TestDemand = case.test
|
||||
test_type_set.add(demand.testType)
|
||||
round1_testType_list = list(map(lambda x: x['ident_version'], get_list_dict('testType', list(test_type_set))))
|
||||
round1_testType_list = list(
|
||||
map(lambda x: x['ident_version'], get_list_dict('testType', list(test_type_set))))
|
||||
# 这里找出第一轮,源代码被测件,并获取版本
|
||||
so_dut = round1.rdField.filter(type='SO').first()
|
||||
so_dut_verson = "$请添加第一轮的源代码信息$"
|
||||
@@ -158,7 +162,8 @@ class GenerateControllerBG(ControllerBase):
|
||||
# 找所属dut的so-dut
|
||||
so_dut = r.rdField.filter(type='SO').first()
|
||||
# 找出上一轮dut的so-dut
|
||||
last_problem_count = Problem.objects.filter(case__round__key=str(int(r.key) - 1)).distinct().count()
|
||||
last_problem_count = Problem.objects.filter(
|
||||
case__round__key=str(int(r.key) - 1)).distinct().count()
|
||||
current_round_problem_count = Problem.objects.filter(case__round__key=r.key).distinct().count()
|
||||
if current_round_problem_count > 0:
|
||||
current_round_description = f'引入新问题{current_round_problem_count}个'
|
||||
@@ -294,14 +299,16 @@ class GenerateControllerBG(ControllerBase):
|
||||
static_problems = problems_r1.filter(case__test__testType='15')
|
||||
|
||||
# 6.第一轮动态测试用例个数(动态测试-非静态分析、文档审查、代码审查、代码走查4个)
|
||||
case_r1_qs = round1.rcField.filter(~Q(test__testType='2'), ~Q(test__testType='3'), ~Q(test__testType='8'),
|
||||
case_r1_qs = round1.rcField.filter(~Q(test__testType='2'), ~Q(test__testType='3'),
|
||||
~Q(test__testType='8'),
|
||||
~Q(test__testType='15'),
|
||||
round__key='0') # !warning:中变量-第一轮动态测试用例qs
|
||||
testType_list, testType_count = create_str_testType_list(case_r1_qs)
|
||||
## 动态测试(第一轮)各个类型测试用例执行表/各个测试需求表
|
||||
demand_r1_dynamic_qs = round1.rtField.filter(~Q(testType='2'), ~Q(testType='3'), ~Q(testType='8'),
|
||||
~Q(testType='15')) # !warning:中变量:第一轮动态测试的测试项
|
||||
summary_r1_demand_info, summry_r1_demandType_info = create_demand_summary(demand_r1_dynamic_qs, project_ident)
|
||||
summary_r1_demand_info, summry_r1_demandType_info = create_demand_summary(demand_r1_dynamic_qs,
|
||||
project_ident)
|
||||
|
||||
# N.第一轮所有动态问题统计
|
||||
problems_dynamic_r1 = problems_r1.filter(~Q(case__test__testType='2'), ~Q(case__test__testType='3'),
|
||||
@@ -450,7 +457,8 @@ class GenerateControllerBG(ControllerBase):
|
||||
for design in round1_design_yz_qs:
|
||||
rich_parser2 = RichParser(design.description)
|
||||
p_list = rich_parser2.get_final_p_list()
|
||||
design_dict = {'yz_des': "".join([design.chapter, '章节:', design.name, '\a', '\a'.join(p_list)])}
|
||||
design_dict = {
|
||||
'yz_des': "".join([design.chapter, '章节:', design.name, '\a', '\a'.join(p_list)])}
|
||||
# 找出其中所有demand
|
||||
demand_qs = design.dtField.all()
|
||||
if not demand_qs.exists():
|
||||
@@ -545,7 +553,7 @@ class GenerateControllerBG(ControllerBase):
|
||||
last_dut_so = dut_so
|
||||
break
|
||||
# 找出所有被测件协议(XY)、需求规格说明(XQ)、设计说明(SJ)
|
||||
duties_qs: list[Dut] = project_obj.pdField.filter(Q(type='XQ') | Q(type='SJ') | Q(type='XY'))
|
||||
duties_qs = project_obj.pdField.filter(Q(type='XQ') | Q(type='SJ') | Q(type='XY'))
|
||||
# ***Inspect-start***
|
||||
if not last_dut_so:
|
||||
self.logger.model = '测评报告'
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -110,8 +110,9 @@ class TestDemandController(ControllerBase):
|
||||
# ident判重
|
||||
project_qs = Project.objects.filter(id=payload.project_id).first()
|
||||
if payload.ident and project_qs:
|
||||
exists = project_qs.ptField.filter(ident=payload.ident).exists()
|
||||
if exists:
|
||||
old_obj = project_qs.ptField.filter(ident=payload.ident).first()
|
||||
# 2025/06/24修改,现在运行不同测试类型有相同的标识
|
||||
if old_obj and old_obj.testType == payload.testType:
|
||||
return ChenResponse(code=500, status=500,
|
||||
message='测试项标识和其他测试项重复,请更换测试项标识!!!')
|
||||
# 构造design_key
|
||||
@@ -161,9 +162,11 @@ class TestDemandController(ControllerBase):
|
||||
for attr, value in payload.dict().items():
|
||||
# 判重复
|
||||
if attr == 'ident':
|
||||
if testDemand_qs.ident != value: # 如果ident不和原来相等,则要判重复
|
||||
exists = project_qs.ptField.filter(ident=payload.ident).exists()
|
||||
if exists:
|
||||
# 先判断是否和原标识一样,且测试类型改变
|
||||
if payload.dict()['testType'] != testDemand_qs.testType and value == old_ident:
|
||||
old_obj = project_qs.ptField.filter(ident=payload.ident).first()
|
||||
# 2025/06/24修改不同类型可以相同
|
||||
if old_obj and old_obj.testType == payload.dict()['testType']:
|
||||
return ChenResponse(code=500, status=500, message='更换的标识和其他测试项重复')
|
||||
if attr == 'project_id' or attr == 'round_key' or attr == 'dut_key' or attr == 'design_key':
|
||||
continue # 如果发现是key则不处理
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.3 on 2025-06-20 19:25
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('project', '0016_dutmetrics'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='testdemandcontentstep',
|
||||
name='id',
|
||||
field=models.BigAutoField(help_text='Id', primary_key=True, serialize=False, verbose_name='Id'),
|
||||
),
|
||||
]
|
||||
Binary file not shown.
@@ -258,7 +258,6 @@ class TestDemandContent(CoreModel):
|
||||
# 4月17日新增:因为测试项需要测试子项step
|
||||
class TestDemandContentStep(CoreModel):
|
||||
objects = models.Manager()
|
||||
id = ShortUUIDField(primary_key=True, help_text="Id", verbose_name="Id")
|
||||
operation = models.CharField(max_length=3072, blank=True, null=True, verbose_name='测试子项操作')
|
||||
expect = models.CharField(max_length=1024, blank=True, null=True, verbose_name='期望')
|
||||
testDemandContent = models.ForeignKey(to="TestDemandContent", db_constraint=False, related_name="testStepField",
|
||||
|
||||
Binary file not shown.
@@ -14,7 +14,8 @@ from ninja_jwt.controller import TokenObtainPairController
|
||||
from ninja_jwt import schema
|
||||
from typing import List
|
||||
from utils.chen_response import ChenResponse
|
||||
from apps.user.schema import UserInfoOutSchema, CreateUserSchema, CreateUserOutSchema, UserRetrieveInputSchema, \
|
||||
from apps.user.schema import UserInfoOutSchema, CreateUserSchema, CreateUserOutSchema, \
|
||||
UserRetrieveInputSchema, \
|
||||
UserRetrieveOutSchema, UpdateDeleteUserSchema, UpdateDeleteUserOutSchema, DeleteUserSchema, LogOutSchema, \
|
||||
LogInputSchema, LogDeleteInSchema, AdminModifyPasswordSchema
|
||||
from apps.user.models import TableOperationLog, Users as UserClass
|
||||
@@ -102,7 +103,8 @@ class UserManageController(ControllerBase):
|
||||
create_datetime__range=date_list).order_by('-create_datetime')
|
||||
return qs
|
||||
|
||||
@route.put("/update/{user_id}", response=UpdateDeleteUserOutSchema, permissions=[IsAuthenticated, IsAdminUser],
|
||||
@route.put("/update/{user_id}", response=UpdateDeleteUserOutSchema,
|
||||
permissions=[IsAuthenticated, IsAdminUser],
|
||||
url_name="user-update")
|
||||
def update_user(self, user_id: int, payload: UpdateDeleteUserSchema):
|
||||
if payload.username == "superAdmin":
|
||||
@@ -122,7 +124,8 @@ class UserManageController(ControllerBase):
|
||||
return ChenResponse(code=200, status=200, message="删除成功")
|
||||
|
||||
# 管理员改变用户状态是否停用/启用
|
||||
@route.get('/change_status', auth=JWTAuth(), permissions=[IsAuthenticated, IsAdminUser], url_name='user-change')
|
||||
@route.get('/change_status', auth=JWTAuth(), permissions=[IsAuthenticated, IsAdminUser],
|
||||
url_name='user-change')
|
||||
def change_user_status(self, user_status: str, userId: int):
|
||||
user = Users.objects.filter(id=userId).first()
|
||||
if not user:
|
||||
@@ -144,6 +147,7 @@ class UserManageController(ControllerBase):
|
||||
user.set_password(payload.newPassword)
|
||||
user.save()
|
||||
return ChenResponse(status=200, code=200, message='管理员修改密码成功')
|
||||
return None
|
||||
|
||||
# 用户登录后动态读取LDAP用户录入数据
|
||||
@route.get("/ldap", url_name='user-ldap')
|
||||
@@ -171,7 +175,8 @@ class LogController(ControllerBase):
|
||||
logs = logs.filter(user__username__icontains=data.user, create_datetime__range=data.create_datetime)
|
||||
return logs
|
||||
|
||||
@route.get('/operation_delete', url_name='log_delete', permissions=[IsAuthenticated, IsAdminUser], auth=JWTAuth())
|
||||
@route.get('/operation_delete', url_name='log_delete', permissions=[IsAuthenticated, IsAdminUser],
|
||||
auth=JWTAuth())
|
||||
def log_delete(self, data: LogDeleteInSchema = Query(...)):
|
||||
time = datetime.now() - timedelta(days=data.day)
|
||||
log_qs = TableOperationLog.objects.filter(create_datetime__lt=time)
|
||||
|
||||
Binary file not shown.
@@ -1,7 +1,15 @@
|
||||
import ldap
|
||||
from django.contrib.auth import get_user_model
|
||||
import environ
|
||||
|
||||
def load_ldap_users(url='ldap://dns.paisat.cn:389',
|
||||
# 1. 环境变量读取
|
||||
env = environ.Env()
|
||||
|
||||
# 2. LDAP服务器host和port
|
||||
server_uri = env('AUTH_LDAP_SERVER_URI', default='ldap://dns.paisat.cn:389')
|
||||
|
||||
# 3. 连接LDAP服务器进行操作
|
||||
def load_ldap_users(url=server_uri,
|
||||
dn="CN=Administrator,CN=Users,DC=sstc,DC=ctu",
|
||||
pwd="WXWX2019!!!!!!",
|
||||
search_dn="OU=ALL,DC=sstc,DC=ctu",
|
||||
|
||||
Reference in New Issue
Block a user