This commit is contained in:
2026-01-28 16:50:40 +08:00
parent f755422cb3
commit beb8c2d25b
202 changed files with 1016 additions and 186 deletions

2
.env
View File

@@ -3,3 +3,5 @@ AUTH_LDAP_BIND_DN='CN=Administrator,CN=Users,DC=sstc,DC=ctu'
AUTH_LDAP_BIND_PASSWORD='WXWX2019!!!!!!'
BASE_DN='OU=all,DC=sstc,DC=ctu'
FILTER_STR='(sAMAccountName=%(user)s)'
AUTH_LDAP_SERVER_URI_IP='ldap://192.168.0.201:389'

View File

@@ -1 +1 @@
3.13
3.13.11

View File

@@ -1,8 +1,6 @@
from datetime import datetime
from ninja.errors import HttpError
from ninja_extra import ControllerBase, api_controller, route
from ninja_extra.permissions import IsAuthenticated
from ninja_jwt.authentication import JWTAuth
from django.db import transaction
from django.db.models import Q
from docxtpl import DocxTemplate
@@ -14,7 +12,6 @@ from apps.dict.models import Dict
# 导入工具函数
from utils.util import get_str_dict, get_list_dict, get_testType, get_ident, get_str_abbr
from utils.chapter_tools.csx_chapter import create_csx_chapter_dict
from utils.util import MyHTMLParser_p
from django.shortcuts import get_object_or_404
from django.forms.models import model_to_dict
from apps.createDocument.extensions.util import create_dg_docx
@@ -25,6 +22,8 @@ from utils.path_utils import project_path
from apps.createSeiTaiDocument.extensions.logger import GenerateLogger
# 导入mixins-处理文档片段
from apps.createDocument.extensions.mixins import FragementToolsMixin
# 导入工具
from apps.createDocument.extensions.tools import demand_sort_by_designKey
# @api_controller("/generate", tags=['生成大纲文档'], auth=JWTAuth(), permissions=[IsAuthenticated])
@api_controller("/generate", tags=['生成大纲文档'])
@@ -47,10 +46,12 @@ class GenerateControllerDG(ControllerBase, FragementToolsMixin):
# 查出第一轮所有testdemand
project_round_one = project_qs.pField.filter(key=0).first()
testDemand_qs = project_round_one.rtField.all()
testDemand_qs = project_round_one.rtField.all().select_related('design')
# 按照自己key排序这样可以按照design的key排序
sorted_demand_qs = sorted(testDemand_qs, key=demand_sort_by_designKey)
# 遍历第一轮测试项默认是ID排序
for single_qs in testDemand_qs:
for single_qs in sorted_demand_qs:
type_index = type_number_list.index(int(single_qs.testType))
# 先查询其testDemandContent信息
content_list = []
@@ -665,7 +666,6 @@ class GenerateControllerDG(ControllerBase, FragementToolsMixin):
test_items = design.dtField.all()
# 连接两个QuerySet默认去重
test_items = test_items.union(design.odField.all())
print('ok:', test_items)
for test_item in test_items:
reveal_ident = "_".join(
["XQ", get_testType(test_item.testType, "testType"), test_item.ident])

View File

@@ -1,23 +1,17 @@
import base64
import io
from pathlib import Path
from copy import deepcopy
from typing import Union
from ninja_extra import api_controller, ControllerBase, route
from ninja_extra.permissions import IsAuthenticated
from ninja_jwt.authentication import JWTAuth
from ninja.errors import HttpError
from django.db import transaction
from django.shortcuts import get_object_or_404
from django.db.models import QuerySet, Q
from docxtpl import DocxTemplate, RichText, InlineImage
from docx.shared import Mm
from docxtpl import DocxTemplate
from docx import Document
# 导入模型
from apps.project.models import Project, Round, Dut
from apps.dict.models import Dict, DictItem
from apps.dict.models import Dict
# 导入项目工具
from utils.util import get_list_dict, get_str_dict, MyHTMLParser, get_ident, get_case_ident, get_testType
from utils.util import get_list_dict, get_str_dict, get_ident, get_case_ident, get_testType
from utils.chapter_tools.csx_chapter import create_csx_chapter_dict
from utils.chen_response import ChenResponse
from apps.createDocument.extensions import util
@@ -27,6 +21,8 @@ from apps.createDocument.extensions.parse_rich_text import RichParser
from apps.createDocument.extensions.documentTime import DocTime
# 导入生成日志记录模块
from apps.createSeiTaiDocument.extensions.logger import GenerateLogger
# 导入排序
from apps.createDocument.extensions.tools import demand_sort_by_designKey
chinese_round_name: list = ['', '', '', '', '', '', '', '', '', '']
@@ -266,9 +262,7 @@ class GenerateControllerHSM(ControllerBase):
@route.get("/create/hdemand", url_name="create-hdemand")
@transaction.atomic
def create_hdemand(self, id: int):
"""
生成非第一轮的多个测试需求
"""
"""生成非第一轮的多个测试需求"""
project_path_str = project_path(id)
tpl_path = Path.cwd() / 'media' / project_path_str / 'form_template/hsm' / '回归测试需求.docx'
doc = DocxTemplate(tpl_path)
@@ -284,9 +278,13 @@ class GenerateControllerHSM(ControllerBase):
test_type_len = Dict.objects.get(code='testType').dictItem.count()
type_number_list = [i for i in range(1, test_type_len + 1)]
list_list = [[] for j in range(1, test_type_len + 1)]
# 获得本轮次所有testDemand
testDemand_qs = hround.rtField.all()
for demand in testDemand_qs:
testDemand_qs = hround.rtField.all().select_related('design')
# 根据自己key排序
sorted_demand_qs = sorted(testDemand_qs, key=demand_sort_by_designKey)
for demand in sorted_demand_qs:
type_index = type_number_list.index(int(demand.testType))
content_list = []
for (index, content) in enumerate(demand.testQField.all()):
@@ -324,7 +322,7 @@ class GenerateControllerHSM(ControllerBase):
"doc_list": doc_list,
"design_description": parser.get_final_list(doc),
"test_demand_content": content_list,
"testMethod": testmethod_str,
"testMethod": testmethod_str.strip(),
"adequacy": demand.adequacy.replace("\n", "\a"),
"testDesciption": demand.testDesciption.replace("\n", "\a") # 测试项描述
}

View File

@@ -0,0 +1,9 @@
from apps.project.models import TestDemand
def demand_sort_by_designKey(demand_obj: TestDemand) -> tuple[int, ...]:
"""仅限于测试项排序函数传入sorted函数的key里面"""
parts = demand_obj.key.split('-')
sort_tuple = tuple(int(part) for part in parts)
return sort_tuple
__all__ = ['demand_sort_by_designKey']

View File

@@ -23,6 +23,7 @@ from apps.project.schemas.design import DeleteSchema, DesignFilterSchema, Design
from apps.project.tools.delete_change_key import design_delete_sub_node_key
from utils.smallTools.interfaceTools import conditionNoneToBlank
from apps.project.tools.auto_create_data import auto_create_renji
from apps.project.tool.dragAndDrop import DesignDrapAtoB
@api_controller("/project", auth=JWTAuth(), permissions=[IsAuthenticated], tags=['设计需求数据'])
class DesignController(ControllerBase):
@@ -66,7 +67,10 @@ class DesignController(ControllerBase):
# 处理树状数据
@route.get("/getDesignDemandInfo", response=List[DesignTreeReturnSchema], url_name="design-info")
def get_design_tree(self, payload: DesignTreeInputSchema = Query(...)):
qs = Design.objects.filter(project__id=payload.project_id, dut__key=payload.key).order_by('id')
qs = Design.objects.filter(
project__id=payload.project_id,
dut__key=payload.key
).select_related('project', 'dut')
return qs
# 添加设计需求
@@ -241,3 +245,24 @@ class DesignController(ControllerBase):
# 最后记得save
new_design_obj.save()
return ChenResponse(status=200, code=200, message='复制当前设计需求成功', data="")
# 拖拽更变desing的key同dut下其他design也变动
@route.get("/switch_position", url_name='design-switch-position')
@transaction.atomic
def switch_position(self, from_key: str, to_key: str, pos: int, project_id: int):
from_key_list = from_key.split("-")
to_key_list = to_key.split("-")
# 如果两个设计需求被测件或轮次不一样则报错
if from_key_list[:-1] != to_key_list[:-1]:
return ChenResponse(status=422, code=40022, message="无法交换不同父节点的设计需求")
# 先查询两个design
from_design_obj: Design = Design.objects.filter(key=from_key, project_id=project_id).first()
to_design_obj: Design = Design.objects.filter(key=to_key, project_id=project_id).first()
if not from_design_obj or not to_design_obj:
return ChenResponse(status=404, code=40004, message="设计需求不存在")
# 获取父节点下所有design
parant_dut = from_design_obj.dut
design_qs = parant_dut.rsField.all()
# 根据pos将from排到后面
return_key = DesignDrapAtoB(from_design_obj, to_design_obj, design_qs, pos)
return ChenResponse(status=200, data=return_key)

View File

@@ -0,0 +1,43 @@
from django.db.models import QuerySet
from apps.project.models import Design, TestDemand
from typing import Union
def DesignDrapAtoB(a: Design,
b: Design,
origin_qs: QuerySet[Design, Design],
pos: Union[-1 | 1]) -> str:
"""该函数传入拖拽design和释放到的design然后更改排序完成key的重新设置"""
# 判断是移动到b前面还是后面
list_qs = list(origin_qs)
list_qs.remove(a)
b_index = list_qs.index(b)
if pos == -1:
list_qs.insert(b_index, a)
elif pos == 1:
list_qs.insert(b_index + 1, a)
# 重新完成排序后调整key
prefix = "".join([a.dut.key, "-"])
for index, obj in enumerate(list_qs):
obj.key = "".join([prefix, str(index)])
# 需要测试项调整key
designConvertDemadnKey(obj)
obj.save()
return a.key
def designConvertDemadnKey(desgin_obj: Design):
"""传入Design对象集体修改demand和case的key"""
for demand in desgin_obj.dtField.all():
design_key = desgin_obj.key
demand_last_key = demand.key.split("-")[-1]
demand.key = "-".join([design_key, demand_last_key])
demandConvertCaseKey(demand)
demand.save()
def demandConvertCaseKey(demand_obj:TestDemand):
"""传入Demand对象集体修改case的key"""
for case in demand_obj.tcField.all():
demand_key = demand_obj.key
case_last_key = case.key.split("-")[-1]
case.key = "-".join([demand_key, case_last_key])
case.save()

View File

@@ -8,7 +8,6 @@ from ninja import Query
from django.db import transaction
from django.contrib.auth import authenticate
from django.shortcuts import get_object_or_404
from ninja_jwt.tokens import RefreshToken
from ninja_jwt.authentication import JWTAuth
from ninja_jwt.controller import TokenObtainPairController
from ninja_jwt import schema
@@ -17,37 +16,25 @@ from utils.chen_response import ChenResponse
from apps.user.schema import UserInfoOutSchema, CreateUserSchema, CreateUserOutSchema, \
UserRetrieveInputSchema, \
UserRetrieveOutSchema, UpdateDeleteUserSchema, UpdateDeleteUserOutSchema, DeleteUserSchema, LogOutSchema, \
LogInputSchema, LogDeleteInSchema, AdminModifyPasswordSchema
LogInputSchema, LogDeleteInSchema, AdminModifyPasswordSchema, MyTokenObtainPairOutSchema, \
MyTokenObtainPairInputSchema
from apps.user.models import TableOperationLog, Users as UserClass
from apps.project.models import Project
# 工具函数
from utils.chen_crud import update, multi_delete
from apps.user.tools.ldap_tools import load_ldap_users
# 导入登录日志函数
from utils.log_util.request_util import save_login_log
Users: UserClass = get_user_model() # type:ignore
Users = get_user_model()
# 定义用户登录接口包含token刷新和生成
@api_controller("/system", tags=['用户token控制和登录接口'])
class UserTokenController(TokenObtainPairController):
auto_import = True
@route.post("/login", url_name='login')
def obtain_token(self, user_token: schema.TokenObtainPairSerializer):
"""新版本有特性,后期修改"""
# 注意TokenObtainPairSerializer是老版本所以兼容本质是TokenObtainPairInputSchema
user: UserClass = user_token._user
if user:
# 判断是否为启用状态
if user.status == '2':
return ChenResponse(status=500, code=500, message='账号已被禁用,请联系管理员...')
save_login_log(request=self.context.request, user=user) # 保存登录日志
refresh = RefreshToken.for_user(user)
token = refresh.access_token # type:ignore
return ChenResponse(code=200,
data={'token': str(token), 'refresh': str(refresh),
'token_exp_data': datetime.fromtimestamp(token["exp"], tz=timezone.utc)})
@route.post("/login", response=MyTokenObtainPairOutSchema, url_name='login')
def obtain_token(self, user_token: MyTokenObtainPairInputSchema):
user_token.check_user_authentication_rule()
return user_token.to_response_schema()
@route.get("/getInfo", response=UserInfoOutSchema, url_name="get_info", auth=JWTAuth())
def get_user_info(self):

View File

@@ -3,9 +3,13 @@ from django.contrib.auth.models import Group
from ninja_schema import ModelSchema, model_validator, Schema
from ninja_extra.exceptions import APIException
from ninja_extra import status
from datetime import datetime
from typing import List
from datetime import datetime, timezone
from typing import List, Type, Dict
from ninja import Field
from ninja.errors import HttpError
from ninja_jwt.schema import TokenObtainInputSchemaBase
from ninja_jwt.tokens import RefreshToken
from utils.log_util.request_util import save_login_log
UserModel = Users
@@ -113,3 +117,34 @@ class AdminModifyPasswordSchema(Schema):
newPassword: str
newPassword_confirmation: str
oldPassword: str
# ~~~~~~~~~~~~~~~~~~~~JWT~~~~~~~~~~~~~~~~~~~~
# 定义输出的内容修改了输出access变为token新增token_exp_data字段
class MyTokenObtainPairOutSchema(Schema):
token: str
refresh: str
token_exp_data: datetime
class MyTokenObtainPairInputSchema(TokenObtainInputSchemaBase):
@classmethod
def get_response_schema(cls) -> Type[Schema]:
"""修改默认的返回Schema"""
return MyTokenObtainPairOutSchema
@classmethod
def get_token(cls, user) -> Dict:
"""因为输出Schema修改这里修改输出的token字典字段"""
values = {}
refresh = RefreshToken.for_user(user)
token = refresh.access_token
values["token"] = str(token) # 修改在这里 # type:ignore
values['refresh'] = str(refresh)
values["token_exp_data"] = datetime.fromtimestamp(token["exp"], tz=timezone.utc)
return values
def authenticate(self, request, credentials: Dict):
super().authenticate(request, credentials)
if self._user:
save_login_log(request, self._user)
if self._user.status == '2': # type:ignore
raise HttpError(401, "账号已被禁用,请联系管理员...")

View File

@@ -7,12 +7,16 @@ env = environ.Env()
# 2. LDAP服务器host和port
server_uri = env('AUTH_LDAP_SERVER_URI', default='ldap://dns.paisat.cn:389')
dn = env('AUTH_LDAP_BIND_DN',default='CN=Administrator,CN=Users,DC=sstc,DC=ctu')
password = env('AUTH_LDAP_BIND_PASSWORD',default='WXWX2019!!!!!!')
base_dn = env('BASE_DN',default='OU=all,DC=sstc,DC=ctu')
filter_str = env('FILTER_STR',default='(sAMAccountName=%(user)s)')
# 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",
dn=dn,
pwd=password,
search_dn=base_dn,
search_filter='(&(sAMAccountName=*))'):
Users = get_user_model()
@@ -50,6 +54,7 @@ def load_ldap_users(url=server_uri,
c_user.email = user_dict['email']
update_flag = True
if update_flag:
c_user.set_password('wxwx2018!!!')
c_user.save()
else:
user_dict['remark'] = '自动同步LDAP数据用户'

View File

@@ -155,6 +155,7 @@ API_OPERATION_EXCLUDE_START = [
'/api/system/abbreviation/index',
'/api/project/dut/soExist',
'/api/system/log/',
'/api/system/dict/'
]
# 配置单次请求最大字节数base64图片和上传需求文档适用

Binary file not shown.

View File

@@ -1 +1,2 @@
[WARNING][2025-04-29 14:20:41,997][logger.py:25][回归测试记录模块][单个问题单表格]片段:问题单4未关联用例请检查
[WARNING][2026-01-20 16:34:34,986][logger.py:25][回归测试说明模块][当前文档全部片段]片段:该项目没有创建轮次

View File

@@ -2211,3 +2211,282 @@ apps.dict.models.Dict.DoesNotExist: Dict matching query does not exist.
[WARNING][2025-12-24 16:39:23,788][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2025-12-24 16:39:23,853][log.py:249]Unauthorized: /api/system/logout
[WARNING][2025-12-24 16:39:28,506][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-12-29 15:33:48,008][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-12-29 15:43:37,401][log.py:249]Payment Required: /api/project/create_renji/
[WARNING][2025-12-29 15:47:52,855][operation.py:131]"POST - UploadController[upload_xq_docx] /api/dut_upload/upload_xq_docx/" ("file 'C:\\Users\\31429\\AppData\\Local\\Temp\\tmpcpy143v1\\21352标校软件需求规格说明V1.01(公开).doc' is not a Word file, content type is 'application/vnd.openxmlformats-officedocument.themeManager+xml'",)
[ERROR][2025-12-29 15:47:52,855][errors.py:131]file 'C:\Users\31429\AppData\Local\Temp\tmpcpy143v1\21352标校软件需求规格说明V1.01(公开).doc' is not a Word file, content type is 'application/vnd.openxmlformats-officedocument.themeManager+xml'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 212, in run
result = self.view_func(request, **ctx.kwargs["view_func_kwargs"])
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\controllers\route\route_functions.py", line 108, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\dut.py", line 252, in upload_xq_docx
extracter = DocxChapterExtractor(docx_path)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\tool\xq_parse.py", line 18, in __init__
self.doc = docx.Document(docx_path) # 解析文档
~~~~~~~~~~~~~^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\api.py", line 30, in Document
raise ValueError(tmpl % (docx, document_part.content_type))
ValueError: file 'C:\Users\31429\AppData\Local\Temp\tmpcpy143v1\21352标校软件需求规格说明V1.01(公开).doc' is not a Word file, content type is 'application/vnd.openxmlformats-officedocument.themeManager+xml'
[ERROR][2025-12-29 15:47:52,858][log.py:249]Internal Server Error: /api/dut_upload/upload_xq_docx/
[WARNING][2025-12-29 15:48:14,809][operation.py:131]"POST - UploadController[upload_xq_docx] /api/dut_upload/upload_xq_docx/" ("file 'C:\\Users\\31429\\AppData\\Local\\Temp\\tmp_n55usen\\21352标校软件需求规格说明V1.01(公开).doc' is not a Word file, content type is 'application/vnd.openxmlformats-officedocument.themeManager+xml'",)
[ERROR][2025-12-29 15:48:14,810][errors.py:131]file 'C:\Users\31429\AppData\Local\Temp\tmp_n55usen\21352标校软件需求规格说明V1.01(公开).doc' is not a Word file, content type is 'application/vnd.openxmlformats-officedocument.themeManager+xml'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 212, in run
result = self.view_func(request, **ctx.kwargs["view_func_kwargs"])
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\controllers\route\route_functions.py", line 108, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\dut.py", line 252, in upload_xq_docx
extracter = DocxChapterExtractor(docx_path)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\tool\xq_parse.py", line 18, in __init__
self.doc = docx.Document(docx_path) # 解析文档
~~~~~~~~~~~~~^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\api.py", line 30, in Document
raise ValueError(tmpl % (docx, document_part.content_type))
ValueError: file 'C:\Users\31429\AppData\Local\Temp\tmp_n55usen\21352标校软件需求规格说明V1.01(公开).doc' is not a Word file, content type is 'application/vnd.openxmlformats-officedocument.themeManager+xml'
[ERROR][2025-12-29 15:48:14,811][log.py:249]Internal Server Error: /api/dut_upload/upload_xq_docx/
[WARNING][2025-12-29 16:07:51,156][log.py:249]Bad Request: /api/project/testDemand/solveRelatedTestDemand
[WARNING][2025-12-30 09:08:25,722][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2025-12-30 09:08:25,816][log.py:249]Unauthorized: /api/system/logout
[WARNING][2025-12-30 09:09:35,244][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-05 15:36:48,015][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 09:53:36,139][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2026-01-12 09:53:36,226][log.py:249]Unauthorized: /api/system/logout
[WARNING][2026-01-12 09:53:40,193][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 10:22:18,307][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 10:22:27,314][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 10:22:30,857][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 10:23:39,227][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 10:23:39,511][operation.py:131]"POST - UserTokenController[obtain_token] /api/system/login" ()
[ERROR][2026-01-12 10:23:39,511][errors.py:131]3 validation errors for NinjaResponseSchema
response.token
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000024934E6AEE0>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.refresh
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000024934E6AEE0>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.token_exp_data
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000024934E6AEE0>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, in run
_processed_results = self._result_to_response(
request, result, ctx.response
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja\operation.py", line 280, in _result_to_response
validated_object = response_model.model_validate(
resp_object, context={"request": request, "response_status": status}
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\pydantic\main.py", line 716, in model_validate
return cls.__pydantic_validator__.validate_python(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
obj,
^^^^
...<5 lines>...
by_name=by_name,
^^^^^^^^^^^^^^^^
)
^
pydantic_core._pydantic_core.ValidationError: 3 validation errors for NinjaResponseSchema
response.token
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000024934E6AEE0>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.refresh
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000024934E6AEE0>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.token_exp_data
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000024934E6AEE0>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
[ERROR][2026-01-12 10:23:39,522][log.py:249]Internal Server Error: /api/system/login
[WARNING][2026-01-12 10:24:08,914][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 10:24:09,211][operation.py:131]"POST - UserTokenController[obtain_token] /api/system/login" ()
[ERROR][2026-01-12 10:24:09,211][errors.py:131]3 validation errors for NinjaResponseSchema
response.token
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E7203AA30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.refresh
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E7203AA30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.token_exp_data
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E7203AA30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, in run
_processed_results = self._result_to_response(
request, result, ctx.response
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja\operation.py", line 280, in _result_to_response
validated_object = response_model.model_validate(
resp_object, context={"request": request, "response_status": status}
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\pydantic\main.py", line 716, in model_validate
return cls.__pydantic_validator__.validate_python(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
obj,
^^^^
...<5 lines>...
by_name=by_name,
^^^^^^^^^^^^^^^^
)
^
pydantic_core._pydantic_core.ValidationError: 3 validation errors for NinjaResponseSchema
response.token
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E7203AA30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.refresh
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E7203AA30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.token_exp_data
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E7203AA30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
[ERROR][2026-01-12 10:24:09,213][log.py:249]Internal Server Error: /api/system/login
[WARNING][2026-01-12 10:24:09,825][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 10:24:10,314][operation.py:131]"POST - UserTokenController[obtain_token] /api/system/login" ()
[ERROR][2026-01-12 10:24:10,314][errors.py:131]3 validation errors for NinjaResponseSchema
response.token
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.refresh
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.token_exp_data
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, in run
_processed_results = self._result_to_response(
request, result, ctx.response
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja\operation.py", line 280, in _result_to_response
validated_object = response_model.model_validate(
resp_object, context={"request": request, "response_status": status}
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\pydantic\main.py", line 716, in model_validate
return cls.__pydantic_validator__.validate_python(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
obj,
^^^^
...<5 lines>...
by_name=by_name,
^^^^^^^^^^^^^^^^
)
^
pydantic_core._pydantic_core.ValidationError: 3 validation errors for NinjaResponseSchema
response.token
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.refresh
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.token_exp_data
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
[ERROR][2026-01-12 10:24:10,315][log.py:249]Internal Server Error: /api/system/login
[WARNING][2026-01-12 10:24:14,108][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 10:24:14,620][operation.py:131]"POST - UserTokenController[obtain_token] /api/system/login" ()
[ERROR][2026-01-12 10:24:14,620][errors.py:131]3 validation errors for NinjaResponseSchema
response.token
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.refresh
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.token_exp_data
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, in run
_processed_results = self._result_to_response(
request, result, ctx.response
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja\operation.py", line 280, in _result_to_response
validated_object = response_model.model_validate(
resp_object, context={"request": request, "response_status": status}
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\pydantic\main.py", line 716, in model_validate
return cls.__pydantic_validator__.validate_python(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
obj,
^^^^
...<5 lines>...
by_name=by_name,
^^^^^^^^^^^^^^^^
)
^
pydantic_core._pydantic_core.ValidationError: 3 validation errors for NinjaResponseSchema
response.token
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.refresh
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
response.token_exp_data
Field required [type=missing, input_value=<ninja_schema.orm.getters...t at 0x0000028E73052A30>, input_type=DjangoGetter]
For further information visit https://errors.pydantic.dev/2.12/v/missing
[ERROR][2026-01-12 10:24:14,630][log.py:249]Internal Server Error: /api/system/login
[WARNING][2026-01-12 10:25:39,666][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-12 10:25:52,819][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-20 15:35:49,614][log.py:249]Not Found: /
[WARNING][2026-01-20 15:35:49,619][log.py:249]Not Found: /
[WARNING][2026-01-20 15:35:49,623][log.py:249]Not Found: /
[WARNING][2026-01-20 15:35:49,627][log.py:249]Not Found: /
[WARNING][2026-01-20 15:35:49,756][log.py:249]Not Found: /favicon.ico
[WARNING][2026-01-20 15:35:49,811][log.py:249]Not Found: /favicon.ico
[WARNING][2026-01-20 15:35:49,847][log.py:249]Not Found: /favicon.ico
[WARNING][2026-01-20 15:35:49,887][log.py:249]Not Found: /favicon.ico
[WARNING][2026-01-20 15:36:36,008][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-20 16:34:34,986][logger.py:25][回归测试说明模块][当前文档全部片段]片段:该项目没有创建轮次
[WARNING][2026-01-20 16:34:34,987][log.py:249]Bad Request: /api/generateHSM/create/basicInformation
[WARNING][2026-01-21 09:08:12,013][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-21 09:20:15,753][log.py:249]Unprocessable Content: /api/project/switch_position
[WARNING][2026-01-21 09:20:20,719][log.py:249]Unprocessable Content: /api/project/switch_position
[WARNING][2026-01-21 09:59:44,017][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-21 10:11:27,647][operation.py:131]"GET - DesignController[switch_position] /api/project/switch_position" ('str.join() takes exactly one argument (2 given)',)
[ERROR][2026-01-21 10:11:27,647][errors.py:131]str.join() takes exactly one argument (2 given)
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 212, in run
result = self.view_func(request, **ctx.kwargs["view_func_kwargs"])
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\controllers\route\route_functions.py", line 108, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\programs\uv\python\cpython-3.13.11-windows-x86_64-none\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\design.py", line 268, in switch_position
return_key = DesignDrapAtoB(from_design_obj, to_design_obj, design_qs, pos)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\tool\dragAndDrop.py", line 20, in DesignDrapAtoB
prefix = "".join(a.dut.key, "-")
TypeError: str.join() takes exactly one argument (2 given)
[ERROR][2026-01-21 10:11:27,651][log.py:249]Internal Server Error: /api/project/switch_position
[WARNING][2026-01-21 10:13:50,072][operation.py:131]"GET - DesignController[switch_position] /api/project/switch_position" ('cannot unpack non-iterable Design object',)
[ERROR][2026-01-21 10:13:50,073][errors.py:131]cannot unpack non-iterable Design object
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 212, in run
result = self.view_func(request, **ctx.kwargs["view_func_kwargs"])
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\controllers\route\route_functions.py", line 108, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\programs\uv\python\cpython-3.13.11-windows-x86_64-none\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\design.py", line 268, in switch_position
return_key = DesignDrapAtoB(from_design_obj, to_design_obj, design_qs, pos)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\tool\dragAndDrop.py", line 21, in DesignDrapAtoB
for index, obj in list_qs:
^^^^^^^^^^
TypeError: cannot unpack non-iterable Design object
[ERROR][2026-01-21 10:13:50,075][log.py:249]Internal Server Error: /api/project/switch_position
[WARNING][2026-01-26 09:29:52,516][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2026-01-26 09:29:52,614][log.py:249]Unauthorized: /api/system/logout
[WARNING][2026-01-26 09:34:15,617][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-26 10:18:20,468][log.py:249]Unprocessable Content: /api/project/switch_position
[ERROR][2026-01-26 10:43:44,242][log.py:249]Internal Server Error: /api/project/case/create_by_demand
[WARNING][2026-01-26 10:55:06,736][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-27 13:17:05,789][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2026-01-27 13:17:05,892][log.py:249]Unauthorized: /api/system/logout
[WARNING][2026-01-27 13:18:15,840][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-01-28 12:13:49,105][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More