日常修复内容20260422

This commit is contained in:
2026-04-22 18:28:32 +08:00
parent dffc1d5872
commit 66e48d3165
507 changed files with 473 additions and 1085 deletions

2
.idea/misc.xml generated
View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="Black"> <component name="Black">
<option name="sdkName" value="Python 3.8 (cdtestplant_v1)" /> <option name="sdkName" value="uv (cdtestplant_v1)" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="uv (cdtestplant_v1)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="uv (cdtestplant_v1)" project-jdk-type="Python SDK" />
</project> </project>

View File

@@ -15,7 +15,7 @@ from pathlib import Path
from utils.chen_response import ChenResponse from utils.chen_response import ChenResponse
# 导入数据库ORM # 导入数据库ORM
from apps.project.models import Project, Contact, Abbreviation, ProjectSoftSummary, StuctSortData, StaticSoftItem, StaticSoftHardware, \ from apps.project.models import Project, Contact, Abbreviation, ProjectSoftSummary, StuctSortData, StaticSoftItem, StaticSoftHardware, \
DynamicSoftTable, DynamicHardwareTable, ProjectDynamicDescription, EvaluateData, EnvAnalysis DynamicSoftTable, DynamicHardwareTable, ProjectDynamicDescription, EvaluateData, EnvAnalysis, Design
from apps.dict.models import Dict 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.util import get_str_dict, get_list_dict, get_testType, get_ident, get_str_abbr
@@ -91,12 +91,23 @@ class GenerateControllerDG(ControllerBase, FragementToolsMixin):
html_parser = RichParser(single_qs.design.description) html_parser = RichParser(single_qs.design.description)
desc_list = html_parser.get_final_list(doc) desc_list = html_parser.get_final_list(doc)
# 查询关联design以及普通design # 查询关联design以及普通design
doc_list = [{'dut_name': single_qs.dut.name, 'design_chapter': single_qs.design.chapter, doc_list = [{
'design_name': single_qs.design.name}] 'dut_name': single_qs.dut.name,
for relate_design in single_qs.otherDesign.all(): 'design_chapter': single_qs.design.chapter,
ddict = {'dut_name': relate_design.dut.name, 'design_chapter': relate_design.chapter, 'design_name': single_qs.design.name,
'design_name': relate_design.name} 'dut_type': single_qs.dut.type # 添加 type 字段用于排序
}]
for relate_design in single_qs.otherDesign.all(): # type: Design
ddict = {
'dut_name': relate_design.dut.name,
'design_chapter': relate_design.chapter,
'design_name': relate_design.name,
'dut_type': relate_design.dut.type # 添加 type 字段用于排序
}
doc_list.append(ddict) doc_list.append(ddict)
# 定义排序顺序映射
TYPE_ORDER = {'YZ': 0, 'XQ': 1, 'XY': 2, 'SJ': 3, None: 99, '': 999}
doc_list.sort(key=lambda x: TYPE_ORDER.get(x.get('dut_type'), 999))
# 组装单个测试项 # 组装单个测试项
## 打印本项目是FPGA还是CPU ## 打印本项目是FPGA还是CPU
@@ -403,10 +414,13 @@ class GenerateControllerDG(ControllerBase, FragementToolsMixin):
interface_dict = { interface_dict = {
'name': interface.name, 'name': interface.name,
'ident': interface.ident, 'ident': interface.ident,
'source': interface.source,
'to': interface.to,
'type': interface.type, 'type': interface.type,
'protocal': interface.protocal, 'is_bidirectional': interface.is_bidirectional, # 是否有反向
'jk_info_list': [{
'source': item.source,
'destination': item.destination,
'description': item.description,
} for item in interface.jkField.all()]
} }
interface_list.append(interface_dict) interface_list.append(interface_dict)
# 项目接口图处理 - 2026/2/4 # 项目接口图处理 - 2026/2/4
@@ -423,7 +437,7 @@ class GenerateControllerDG(ControllerBase, FragementToolsMixin):
'iters': interfaceNameList, 'iters': interfaceNameList,
'iter_list': interface_list, 'iter_list': interface_list,
'image_render': image_render if image_render else "", 'image_render': image_render if image_render else "",
'fontnote': fontnote if fontnote else "".join([project_name, '接口示意图']) 'fontnote': fontnote if fontnote else "".join([project_name, '接口示意图']),
} }
doc.render(context, autoescape=True) doc.render(context, autoescape=True)
try: try:
@@ -469,7 +483,7 @@ class GenerateControllerDG(ControllerBase, FragementToolsMixin):
except PermissionError as e: except PermissionError as e:
return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e)) return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
# 通用生成静态软件项、静态硬件项、动态软件项、动态硬件信息的context包含fontnote和table # 通用生成静态软件项、静态硬件项、动态软件项、动态硬件信息、测评数据的context包含fontnote和table
@classmethod @classmethod
def create_table_context(cls, table_data: list[list[str]], doc: DocxTemplate): def create_table_context(cls, table_data: list[list[str]], doc: DocxTemplate):
"""注意:该函数会增加一列序号列,并且支持单元格内回车换行(段落换行)""" """注意:该函数会增加一列序号列,并且支持单元格内回车换行(段落换行)"""

View File

@@ -8,7 +8,7 @@ from django.db.models import QuerySet, Q
from docxtpl import DocxTemplate from docxtpl import DocxTemplate
from docx import Document from docx import Document
# 导入模型 # 导入模型
from apps.project.models import Project, Round, Dut, InfluenceArea from apps.project.models import Project, Round, Dut
from apps.dict.models import Dict from apps.dict.models import Dict
# 导入项目工具 # 导入项目工具
from utils.util import get_list_dict, get_str_dict, get_ident, get_case_ident, get_testType from utils.util import get_list_dict, get_str_dict, get_ident, get_case_ident, get_testType
@@ -19,7 +19,6 @@ from utils.path_utils import project_path
from apps.createDocument.extensions.util import delete_dir_files from apps.createDocument.extensions.util import delete_dir_files
from apps.createDocument.extensions.parse_rich_text import RichParser from apps.createDocument.extensions.parse_rich_text import RichParser
from apps.createDocument.extensions.documentTime import DocTime from apps.createDocument.extensions.documentTime import DocTime
from utils.util import get_str_abbr
from apps.createDocument.extensions.content_result_tool import create_influence_context from apps.createDocument.extensions.content_result_tool import create_influence_context
# 导入生成日志记录模块 # 导入生成日志记录模块
from apps.createSeiTaiDocument.extensions.logger import GenerateLogger from apps.createSeiTaiDocument.extensions.logger import GenerateLogger
@@ -234,7 +233,7 @@ class GenerateControllerHSM(ControllerBase):
xq_dut: Dut = hround.rdField.filter(type='XQ').first() xq_dut: Dut = hround.rdField.filter(type='XQ').first()
# 处理代码版本 # 处理代码版本
last_round_key = str(int(hround.key) - 1) last_round_key = str(int(hround.key) - 1)
last_round: Round = project_obj.pField.filter(key=last_round_key).first() last_round: Round | None = project_obj.pField.filter(key=last_round_key).first()
last_round_so_dut = last_round.rdField.filter(type='SO').first() last_round_so_dut = last_round.rdField.filter(type='SO').first()
if not last_round_so_dut: if not last_round_so_dut:
return ChenResponse(code=400, status=400, return ChenResponse(code=400, status=400,

View File

@@ -1,98 +1,109 @@
from pathlib import Path from pathlib import Path
from docxtpl import DocxTemplate from docxtpl import DocxTemplate
from docx.table import Table from docx.table import Table
from utils.chen_response import ChenResponse from utils.chen_response import ChenResponse
from typing import Any from typing import Any
from apps.project.models import Project from apps.project.models import Project
from utils.path_utils import project_path from utils.path_utils import project_path
def merge_all_cell(table: Table) -> None: def merge_all_cell(table: Table) -> None:
"""生成需求研总对照表工具逐个找第二列和第三列单元格的text如果一致则合并""" """生成需求研总对照表工具逐个找第二列和第三列单元格的text如果一致则合并"""
col_list = [table.columns[1], table.columns[2]] col_list = [table.columns[1], table.columns[2]]
# 合并第二列相同的单元格 # 合并第二列相同的单元格
for col_right in col_list: for col_right in col_list:
index = 0 index = 0
temp_text = "" temp_text = ""
for cell in col_right.cells: for cell in col_right.cells:
if index == 0: if index == 0:
temp_text = cell.text temp_text = cell.text
else: else:
if cell.text == temp_text: if cell.text == temp_text:
if cell.text == '': # 不知道什么原因必须这样判断下 if cell.text == '': # 不知道什么原因必须这样判断下
cell.text = '/' cell.text = '/'
text_temp = cell.text text_temp = cell.text
ce = cell.merge(col_right.cells[index - 1]) ce = cell.merge(col_right.cells[index - 1])
ce.text = text_temp ce.text = text_temp
else: else:
temp_text = cell.text temp_text = cell.text
index += 1 index += 1
def create_sm_docx(template_name: str, context: dict, id: int) -> ChenResponse: def create_sm_docx(template_name: str, context: dict, id: int) -> ChenResponse:
"""生成最终说明文档工具函数""" """生成最终说明文档工具函数"""
input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'sm' / template_name input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'sm' / template_name
doc = DocxTemplate(input_path) doc = DocxTemplate(input_path)
doc.render(context, autoescape=True) doc.render(context, autoescape=True)
try: try:
doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/sm" / template_name) doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/sm" / template_name)
return ChenResponse(status=200, code=200, message="文档生成成功!") return ChenResponse(status=200, code=200, message="文档生成成功!")
except PermissionError as e: except PermissionError as e:
return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e)) return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
def create_dg_docx(template_name: str, context: dict, id: int) -> ChenResponse: def create_hsm_docx(template_name: str, context: dict, id: int) -> ChenResponse:
"""生成最终大纲文档工具函数""" """生成最终回归测试说明文档工具函数"""
input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'dg' / template_name input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'hsm' / template_name
doc = DocxTemplate(input_path) doc = DocxTemplate(input_path)
doc.render(context, autoescape=True) doc.render(context, autoescape=True)
try: try:
doc.save(Path.cwd() / "media" / project_path(id) / "output_dir" / template_name) doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/hsm" / template_name)
return ChenResponse(status=200, code=200, message="文档生成成功!") return ChenResponse(status=200, code=200, message="文档生成成功!")
except PermissionError as e: except PermissionError as e:
return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e)) return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
def create_bg_docx(template_name: str, context: dict, id: int) -> ChenResponse: def create_dg_docx(template_name: str, context: dict, id: int) -> ChenResponse:
"""生成最终报告文档工具函数""" """生成最终大纲文档工具函数"""
input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'bg' / template_name input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'dg' / template_name
doc = DocxTemplate(input_path) doc = DocxTemplate(input_path)
doc.render(context, autoescape=True) doc.render(context, autoescape=True)
try: try:
doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/bg" / template_name) doc.save(Path.cwd() / "media" / project_path(id) / "output_dir" / template_name)
return ChenResponse(status=200, code=200, message="文档生成成功!") return ChenResponse(status=200, code=200, message="文档生成成功!")
except PermissionError as e: except PermissionError as e:
return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e)) return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
def create_wtd_docx(template_name: str, context: dict, id: int) -> ChenResponse: def create_bg_docx(template_name: str, context: dict, id: int) -> ChenResponse:
"""生成最终问题单文档工具函数""" """生成最终报告文档工具函数"""
input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'wtd' / template_name input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'bg' / template_name
doc = DocxTemplate(input_path) doc = DocxTemplate(input_path)
doc.render(context, autoescape=True) doc.render(context, autoescape=True)
try: try:
doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/wtd" / template_name) doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/bg" / template_name)
return ChenResponse(status=200, code=200, message="文档生成成功!") return ChenResponse(status=200, code=200, message="文档生成成功!")
except PermissionError as e: except PermissionError as e:
return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e)) return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
def get_round1_problem(project: Project) -> Any: def create_wtd_docx(template_name: str, context: dict, id: int) -> ChenResponse:
""" """生成最终问题单文档工具函数"""
从项目返回第一轮问题单 input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'wtd' / template_name
:param project: Project项目Model对象 doc = DocxTemplate(input_path)
:return: 问题单的列表 doc.render(context, autoescape=True)
""" try:
all_problem_qs = project.projField.all() doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/wtd" / template_name)
# 遍历每个问题,找出第一轮的问题 return ChenResponse(status=200, code=200, message="文档生成成功!")
problem_set = set() except PermissionError as e:
for problem in all_problem_qs: return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
flag = False
for case in problem.case.all(): def get_round1_problem(project: Project) -> Any:
if case.round.key == '0': """
flag = True 从项目返回第一轮问题单
if flag: :param project: Project项目Model对象
problem_set.add(problem) :return: 问题单的列表
return list(problem_set) """
all_problem_qs = project.projField.all()
def delete_dir_files(path: Path) -> Any: # 遍历每个问题,找出第一轮的问题
"""传入一个Path对象如果是文件夹则删除里面所有的文件不删除文件夹""" problem_set = set()
if path.is_dir(): for problem in all_problem_qs:
for file in path.iterdir(): flag = False
if file.is_file(): for case in problem.case.all():
file.unlink() if case.round.key == '0':
flag = True
if flag:
problem_set.add(problem)
return list(problem_set)
def delete_dir_files(path: Path) -> Any:
"""传入一个Path对象如果是文件夹则删除里面所有的文件不删除文件夹"""
if path.is_dir():
for file in path.iterdir():
if file.is_file():
file.unlink()

View File

@@ -15,7 +15,7 @@ from typing import List
from utils.chen_response import ChenResponse from utils.chen_response import ChenResponse
from utils.chen_crud import multi_delete_design from utils.chen_crud import multi_delete_design
from utils.codes import HTTP_INDEX_ERROR from utils.codes import HTTP_INDEX_ERROR
from apps.project.models import Design, Dut, Round, Project from apps.project.models import Design, Dut, Round, Project, JKDesignInfo
from apps.project.schemas.design import DeleteSchema, DesignFilterSchema, DesignModelOutSchema, \ from apps.project.schemas.design import DeleteSchema, DesignFilterSchema, DesignModelOutSchema, \
DesignTreeReturnSchema, \ DesignTreeReturnSchema, \
DesignTreeInputSchema, DesignCreateOutSchema, DesignCreateInputSchema, MultiDesignCreateInputSchema, \ DesignTreeInputSchema, DesignCreateOutSchema, DesignCreateInputSchema, MultiDesignCreateInputSchema, \
@@ -25,6 +25,22 @@ from utils.smallTools.interfaceTools import conditionNoneToBlank
from apps.project.tools.auto_create_data import auto_create_renji from apps.project.tools.auto_create_data import auto_create_renji
from apps.project.tool.dragAndDrop import DesignDrapAtoB from apps.project.tool.dragAndDrop import DesignDrapAtoB
def _save_jk_direction_info(design: Design, direction: str, source: str, destination: str, description: str):
"""保存或更新 JKDesignInfo 记录"""
if not source and not destination and not description:
# 如果三个字段全为空,则删除可能存在的记录(避免冗余数据)
JKDesignInfo.objects.filter(jk=design, direction=direction).delete()
return
JKDesignInfo.objects.update_or_create(
jk=design,
direction=direction,
defaults={
'source': source or '',
'destination': destination or '',
'description': description or '',
}
)
@api_controller("/project", auth=JWTAuth(), permissions=[IsAuthenticated], tags=['设计需求数据']) @api_controller("/project", auth=JWTAuth(), permissions=[IsAuthenticated], tags=['设计需求数据'])
class DesignController(ControllerBase): class DesignController(ControllerBase):
@route.get("/getDesignDemandList", response=List[DesignModelOutSchema], exclude_none=True, @route.get("/getDesignDemandList", response=List[DesignModelOutSchema], exclude_none=True,
@@ -97,7 +113,30 @@ class DesignController(ControllerBase):
{'key': key_string, 'round': round_instance, 'dut': dut_instance, 'title': payload.name}) {'key': key_string, 'round': round_instance, 'dut': dut_instance, 'title': payload.name})
asert_dict.pop("round_key") asert_dict.pop("round_key")
asert_dict.pop("dut_key") asert_dict.pop("dut_key")
# 去掉Design不使用的字段
asert_dict.pop("forward_source", None)
asert_dict.pop("forward_destination", None)
asert_dict.pop("forward_description", None)
asert_dict.pop("reverse_source", None)
asert_dict.pop("reverse_destination", None)
asert_dict.pop("reverse_description", None)
qs = Design.objects.create(**asert_dict) qs = Design.objects.create(**asert_dict)
# 处理接口方向信息(仅当 demandType == '3' 且存在正向/反向数据时)
if payload.demandType == '3':
_save_jk_direction_info(
design=qs,
direction=JKDesignInfo.Direction.FORWARD,
source=payload.forward_source,
destination=payload.forward_destination,
description=payload.forward_description,
)
_save_jk_direction_info(
design=qs,
direction=JKDesignInfo.Direction.REVERSE,
source=payload.reverse_source,
destination=payload.reverse_destination,
description=payload.reverse_description,
)
return qs return qs
# 批量增加设计需求对应前端批量增加页面modal # 批量增加设计需求对应前端批量增加页面modal
@@ -136,15 +175,36 @@ class DesignController(ControllerBase):
# 判断是否和同项目同轮次的标识重复 # 判断是否和同项目同轮次的标识重复
if len(design_search) > 1 and payload.ident != '': if len(design_search) > 1 and payload.ident != '':
return ChenResponse(code=400, status=400, message='研制需求的标识重复,请检查') return ChenResponse(code=400, status=400, message='研制需求的标识重复,请检查')
# 查到当前 # 查到当前
design_qs = Design.objects.get(id=id) design_qs = Design.objects.get(id=id)
for attr, value in payload.dict().items(): for attr, value in payload.dict().items():
if attr == 'project_id' or attr == 'round_key' or attr == 'dut_key': if attr in ('project_id', 'round_key', 'dut_key'):
continue continue
if attr == 'name': if attr == 'name':
setattr(design_qs, "title", value) setattr(design_qs, "title", value)
setattr(design_qs, attr, value) setattr(design_qs, attr, value)
design_qs.save() design_qs.save()
# 处理接口方向信息更新
if payload.demandType == '3':
_save_jk_direction_info(
design=design_qs,
direction=JKDesignInfo.Direction.FORWARD,
source=payload.forward_source,
destination=payload.forward_destination,
description=payload.forward_description,
)
_save_jk_direction_info(
design=design_qs,
direction=JKDesignInfo.Direction.REVERSE,
source=payload.reverse_source,
destination=payload.reverse_destination,
description=payload.reverse_description,
)
else:
# 如果需求类型不再是接口,则删除已有的方向信息
JKDesignInfo.objects.filter(jk=design_qs).delete()
return design_qs return design_qs
# 删除设计需求 # 删除设计需求

View File

@@ -463,7 +463,7 @@ class ProjectController(ControllerBase):
return ChenResponse(status=200, code=25001, data={"table": item_obj.table, "fontnote": item_obj.fontnote}) return ChenResponse(status=200, code=25001, data={"table": item_obj.table, "fontnote": item_obj.fontnote})
return ChenResponse(status=200, code=25002, data=None) return ChenResponse(status=200, code=25002, data=None)
# ~~~静态软件项、静态硬件项、动态软件项、动态硬件项 - 新增或修改~~~ # ~~~静态软件项、静态硬件项、动态软件项、动态硬件项、测评数据 - 新增或修改~~~
@route.post("/post_static_dynamic_item/") @route.post("/post_static_dynamic_item/")
@transaction.atomic @transaction.atomic
def post_static_dynamic_item(self, data: StaticDynamicData): def post_static_dynamic_item(self, data: StaticDynamicData):

View File

@@ -0,0 +1,51 @@
# Generated by Django 6.0.4 on 2026-04-21 18:21
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0032_alter_design_protocal'),
]
operations = [
migrations.RemoveField(
model_name='design',
name='protocal',
),
migrations.RemoveField(
model_name='design',
name='to',
),
migrations.RemoveField(
model_name='design',
name='type',
),
migrations.AlterField(
model_name='design',
name='source',
field=models.CharField(blank=True, default='', help_text='接口来源', max_length=256, null=True, verbose_name='接口来源'),
),
migrations.CreateModel(
name='JKDesignInfo',
fields=[
('id', models.BigAutoField(help_text='Id', primary_key=True, serialize=False, verbose_name='Id')),
('remark', models.CharField(blank=True, help_text='描述', max_length=255, null=True, verbose_name='描述')),
('update_datetime', models.DateField(auto_now=True, help_text='修改时间', null=True, verbose_name='修改时间')),
('create_datetime', models.DateField(auto_now_add=True, help_text='创建时间', null=True, verbose_name='创建时间')),
('sort', models.IntegerField(blank=True, default=1, help_text='显示排序', null=True, verbose_name='显示排序')),
('direction', models.CharField(choices=[('forward', '正向'), ('reverse', '反向')], max_length=10, verbose_name='方向')),
('description', models.TextField(blank=True, default='', max_length=1024, null=True, verbose_name='接口描述')),
('source', models.CharField(blank=True, default='', max_length=200, null=True, verbose_name='来源')),
('destination', models.CharField(blank=True, default='', max_length=200, null=True, verbose_name='目的地')),
('jk', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='jkField', to='project.design', verbose_name='所属接口Design')),
],
options={
'verbose_name': '接口一个方向的信息',
'verbose_name_plural': '接口一个方向的信息',
'unique_together': {('jk', 'direction')},
},
),
]

View File

@@ -0,0 +1,37 @@
# Generated by Django 6.0.4 on 2026-04-21 18:27
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0033_remove_design_protocal_remove_design_to_and_more'),
]
operations = [
migrations.RemoveField(
model_name='design',
name='source',
),
migrations.AddField(
model_name='design',
name='type',
field=models.CharField(blank=True, default='', help_text='接口类型', max_length=1024, null=True, verbose_name='接口类型'),
),
migrations.AlterField(
model_name='jkdesigninfo',
name='description',
field=models.TextField(blank=True, max_length=1024, null=True, verbose_name='接口描述'),
),
migrations.AlterField(
model_name='jkdesigninfo',
name='destination',
field=models.CharField(blank=True, max_length=200, null=True, verbose_name='目的地'),
),
migrations.AlterField(
model_name='jkdesigninfo',
name='source',
field=models.CharField(blank=True, max_length=200, null=True, verbose_name='来源'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.4 on 2026-04-21 18:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0034_remove_design_source_design_type_and_more'),
]
operations = [
migrations.AddField(
model_name='design',
name='is_bidirectional',
field=models.BooleanField(default=False, verbose_name='是否双向'),
),
]

View File

@@ -15,9 +15,9 @@ class Project(CoreModel):
help_text="项目标识", unique=True) # 唯一 help_text="项目标识", unique=True) # 唯一
name = models.CharField(max_length=100, blank=True, null=True, verbose_name="项目名称", name = models.CharField(max_length=100, blank=True, null=True, verbose_name="项目名称",
help_text="项目名称") help_text="项目名称")
beginTime = models.DateField(auto_now_add=True, null=True, blank=True, help_text="开始时间", beginTime = models.DateField(null=True, blank=True, help_text="开始时间",
verbose_name="开始时间") verbose_name="开始时间")
endTime = models.DateField(auto_now_add=True, null=True, blank=True, help_text="结束时间", endTime = models.DateField(null=True, blank=True, help_text="结束时间",
verbose_name="结束时间") verbose_name="结束时间")
duty_person = models.CharField(max_length=64, verbose_name="负责人", help_text="负责人") duty_person = models.CharField(max_length=64, verbose_name="负责人", help_text="负责人")
member = models.JSONField(null=True, blank=True, help_text="项目成员", verbose_name="项目成员", member = models.JSONField(null=True, blank=True, help_text="项目成员", verbose_name="项目成员",
@@ -198,15 +198,12 @@ class Design(CoreModel):
dut = models.ForeignKey(to="Dut", db_constraint=False, related_name="rsField", on_delete=models.CASCADE, dut = models.ForeignKey(to="Dut", db_constraint=False, related_name="rsField", on_delete=models.CASCADE,
verbose_name='归属轮次', help_text='归属轮次', related_query_name='rsQuery') verbose_name='归属轮次', help_text='归属轮次', related_query_name='rsQuery')
# 如果是demandTye='3'则加上如下字段 # 如果是demandTye='3'则加上如下字段
source = models.CharField(max_length=64, blank=True, null=True, default='', verbose_name='接口来源', type = models.CharField(max_length=1024, blank=True, null=True, default='', verbose_name='接口类型',
help_text='接口来源')
to = models.CharField(max_length=64, blank=True, null=True, default='', verbose_name='接口目的地',
help_text='接口目的地')
type = models.CharField(max_length=64, blank=True, null=True, default='', verbose_name='接口类型',
help_text='接口类型') help_text='接口类型')
# 注意:该字段改为接口数据 is_bidirectional = models.BooleanField(
protocal = models.CharField(max_length=1024, blank=True, null=True, default='', verbose_name='接口数据', default=False,
help_text='接口数据') verbose_name="是否双向"
)
def __str__(self): def __str__(self):
return f'设计需求:{self.name}' return f'设计需求:{self.name}'
@@ -217,6 +214,29 @@ class Design(CoreModel):
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
ordering = ('key',) ordering = ('key',)
class JKDesignInfo(CoreModel):
class Direction(models.TextChoices):
FORWARD = 'forward', '正向'
REVERSE = 'reverse', '反向'
jk = models.ForeignKey(Design, on_delete=models.CASCADE, related_name="jkField", verbose_name="所属接口Design")
direction = models.CharField(
max_length=10,
choices=Direction.choices, # type: ignore
verbose_name="方向"
)
description = models.TextField(max_length=1024, blank=True, null=True, verbose_name="接口描述")
source = models.CharField(max_length=200, blank=True, null=True, verbose_name="来源")
destination = models.CharField(max_length=200, blank=True, null=True, verbose_name="目的地")
class Meta:
unique_together = [['jk', 'direction']] # 同一个方向仅一条记录
verbose_name = "接口一个方向的信息"
verbose_name_plural = "接口一个方向的信息"
def __str__(self):
return f"{self.jk.name} - {self.get_direction_display()}"
class TestDemand(CoreModel): class TestDemand(CoreModel):
"""测试项""" """测试项"""
objects = models.Manager() objects = models.Manager()

View File

@@ -1,5 +1,5 @@
from typing import Optional from typing import Optional
from apps.project.models import Design from apps.project.models import Design, JKDesignInfo
from ninja import Field, Schema, ModelSchema from ninja import Field, Schema, ModelSchema
from typing import List, Union from typing import List, Union
from pydantic import AliasChoices from pydantic import AliasChoices
@@ -30,11 +30,54 @@ class DesignModelOutSchemaOrigin(ModelSchema):
class DesignModelOutSchema(ModelSchema): class DesignModelOutSchema(ModelSchema):
# 新增字段 - 上级的dut对象 # 新增字段 - 上级的dut对象
dut: Optional[DutModelOutSchema] = None dut: Optional[DutModelOutSchema] = None
is_bidirectional: bool = Field(False, alias='is_bidirectional')
forward_source: str = Field("")
forward_destination: str = Field("")
forward_description: str = Field("")
reverse_source: str = Field("")
reverse_destination: str = Field("")
reverse_description: str = Field("")
class Meta: class Meta:
model = Design model = Design
exclude = ['project', 'round', 'dut', 'remark', 'sort'] exclude = ['project', 'round', 'dut', 'remark', 'sort']
# ---------- 解析器方法 ----------
@staticmethod
def resolve_is_bidirectional(obj: Design) -> bool:
return obj.is_bidirectional
@staticmethod
def resolve_forward_source(obj: Design) -> str:
"""从 JKDesignInfo 正向记录中获取 source"""
info = obj.jkField.filter(direction=JKDesignInfo.Direction.FORWARD).first()
return info.source if info else ""
@staticmethod
def resolve_forward_destination(obj: Design) -> str:
info = obj.jkField.filter(direction=JKDesignInfo.Direction.FORWARD).first()
return info.destination if info else ""
@staticmethod
def resolve_forward_description(obj: Design) -> str:
info = obj.jkField.filter(direction=JKDesignInfo.Direction.FORWARD).first()
return info.description if info else ""
@staticmethod
def resolve_reverse_source(obj: Design) -> str:
info = obj.jkField.filter(direction=JKDesignInfo.Direction.REVERSE).first()
return info.source if info else ""
@staticmethod
def resolve_reverse_destination(obj: Design) -> str:
info = obj.jkField.filter(direction=JKDesignInfo.Direction.REVERSE).first()
return info.destination if info else ""
@staticmethod
def resolve_reverse_description(obj: Design) -> str:
info = obj.jkField.filter(direction=JKDesignInfo.Direction.REVERSE).first()
return info.description if info else ""
# 处理树状结构的schema # 处理树状结构的schema
class DesignTreeReturnSchema(Schema): class DesignTreeReturnSchema(Schema):
title: str = Field(..., alias='title') title: str = Field(..., alias='title')
@@ -66,11 +109,15 @@ class DesignCreateInputSchema(Schema):
demandType: str = Field(None, alias="demandType") demandType: str = Field(None, alias="demandType")
description: str = Field("", alias="description") description: str = Field("", alias="description")
chapter: str = Field(None, alias='chapter') chapter: str = Field(None, alias='chapter')
# 接口独有的4个字段 # 接口类型包含
source: str = Field('', alias='source')
to: str = Field('', alias='to')
type: str = Field('', alias='type') type: str = Field('', alias='type')
protocal: str = Field('', alias='protocal') is_bidirectional: bool = Field(False, alias='is_bidirectional')
forward_source: str = Field("")
forward_destination: str = Field("")
forward_description: str = Field("")
reverse_source: str = Field("")
reverse_destination: str = Field("")
reverse_description: str = Field("")
class SingleDesignSchema(Schema): class SingleDesignSchema(Schema):
ident: str = Field(None, alias="ident") ident: str = Field(None, alias="ident")

View File

@@ -1,334 +1,8 @@
[WARNING][2026-03-14 10:35:20,046][log.py:249]Unauthorized: /api/system/getInfo [WARNING][2026-04-22 09:45:35,603][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2026-03-14 10:35:20,146][log.py:249]Unauthorized: /api/system/logout [WARNING][2026-04-22 09:45:35,677][log.py:249]Unauthorized: /api/system/logout
[WARNING][2026-03-14 10:35:24,335][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []}) [WARNING][2026-04-22 09:45:39,967][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-04-07 09:27:09,901][log.py:249]Not Found: / [WARNING][2026-04-22 11:03:49,239][operation.py:136]"PUT - DesignController[update_design] /api/project/editDesignDemand/4030" (1048, "Column 'is_bidirectional' cannot be null")
[WARNING][2026-04-07 09:27:10,065][log.py:249]Not Found: /favicon.ico [ERROR][2026-04-22 11:03:49,239][errors.py:131](1048, "Column 'is_bidirectional' cannot be null")
[WARNING][2026-04-07 18:03:09,337][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-04-15 18:38:48,504][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2026-04-15 18:38:48,566][log.py:249]Unauthorized: /api/system/logout
[WARNING][2026-04-15 18:38:55,114][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-04-16 09:18:04,544][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2026-04-16 09:18:04,605][log.py:249]Unauthorized: /api/system/logout
[WARNING][2026-04-16 09:18:08,604][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-04-16 09:27:24,231][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-04-16 09:36:04,828][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[ERROR][2026-04-16 10:57:10,857][log.py:249]Internal Server Error: /api/project/testDemand/save
[WARNING][2026-04-16 13:38:39,790][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[ERROR][2026-04-16 14:05:52,897][log.py:249]Internal Server Error: /api/project/testDemand/save
[WARNING][2026-04-16 14:28:36,656][operation.py:136]"POST - GenerateSeitaiController[create_smDocument] /api/create/smDocument" ('rId15',)
[ERROR][2026-04-16 14:28:36,656][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 105, in create_smDocument
result = generate_temp_doc('sm', payload.id, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 199, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 14:28:36,662][log.py:249]Internal Server Error: /api/create/smDocument
[WARNING][2026-04-16 14:30:45,351][operation.py:136]"POST - GenerateSeitaiController[create_hsmDocument] /api/create/hsmDocument" ('rId15',)
[ERROR][2026-04-16 14:30:45,351][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 190, in create_hsmDocument
result = generate_temp_doc('hsm', payload.id, round_num=cname, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 199, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 14:30:45,352][log.py:249]Internal Server Error: /api/create/hsmDocument
[WARNING][2026-04-16 14:31:17,977][operation.py:136]"POST - GenerateSeitaiController[create_bgDocument] /api/create/bgDocument" ('rId15',)
[ERROR][2026-04-16 14:31:17,977][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 314, in create_bgDocument
result = generate_temp_doc('bg', payload.id, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 199, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 14:31:17,978][log.py:249]Internal Server Error: /api/create/bgDocument
[WARNING][2026-04-16 15:42:36,466][operation.py:136]"POST - GenerateSeitaiController[create_smDocument] /api/create/smDocument" ('rId15',)
[ERROR][2026-04-16 15:42:36,466][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 105, in create_smDocument
result = generate_temp_doc('sm', payload.id, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 199, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 15:42:36,470][log.py:249]Internal Server Error: /api/create/smDocument
[WARNING][2026-04-16 15:53:58,706][operation.py:136]"POST - GenerateSeitaiController[create_smDocument] /api/create/smDocument" ('rId15',)
[ERROR][2026-04-16 15:53:58,706][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 105, in create_smDocument
result = generate_temp_doc('sm', payload.id, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 199, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 15:53:58,707][log.py:249]Internal Server Error: /api/create/smDocument
[WARNING][2026-04-16 15:56:20,961][operation.py:136]"POST - GenerateSeitaiController[create_smDocument] /api/create/smDocument" ('rId15',)
[ERROR][2026-04-16 15:56:20,961][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 105, in create_smDocument
result = generate_temp_doc('sm', payload.id, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 200, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 15:56:20,964][log.py:249]Internal Server Error: /api/create/smDocument
[WARNING][2026-04-16 15:56:53,464][operation.py:136]"POST - GenerateSeitaiController[create_smDocument] /api/create/smDocument" ('rId15',)
[ERROR][2026-04-16 15:56:53,464][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 105, in create_smDocument
result = generate_temp_doc('sm', payload.id, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 201, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 15:56:53,497][log.py:249]Internal Server Error: /api/create/smDocument
[WARNING][2026-04-16 16:20:18,046][operation.py:136]"POST - GenerateSeitaiController[create_smDocument] /api/create/smDocument" ('rId15',)
[ERROR][2026-04-16 16:20:18,046][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 105, in create_smDocument
result = generate_temp_doc('sm', payload.id, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 199, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 16:20:18,050][log.py:249]Internal Server Error: /api/create/smDocument
[WARNING][2026-04-16 16:23:25,686][operation.py:136]"POST - GenerateSeitaiController[create_smDocument] /api/create/smDocument" ('rId15',)
[ERROR][2026-04-16 16:23:25,686][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 105, in create_smDocument
result = generate_temp_doc('sm', payload.id, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 200, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 16:23:25,824][log.py:249]Internal Server Error: /api/create/smDocument
[WARNING][2026-04-16 16:29:41,449][operation.py:136]"POST - GenerateSeitaiController[create_smDocument] /api/create/smDocument" ('rId15',)
[ERROR][2026-04-16 16:29:41,449][errors.py:131]'rId15'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 105, in create_smDocument
result = generate_temp_doc('sm', payload.id, frag_list=payload.frag)
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\docXmlUtils.py", line 200, in generate_temp_doc
related_part: ImagePart = doc_copied.part.related_parts[embed]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
KeyError: 'rId15'
[ERROR][2026-04-16 16:29:41,452][log.py:249]Internal Server Error: /api/create/smDocument
[WARNING][2026-04-16 17:14:40,599][operation.py:136]"POST - UploadDocumentController[upload_file] /api/documentUpload/file" ("'DocumentPart' object has no attribute 'get_or_add_image_part'",)
[ERROR][2026-04-16 17:14:40,600][errors.py:131]'DocumentPart' object has no attribute 'get_or_add_image_part'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 459, in upload_file
self.get_dg_to_reuse_dir(target_dir.parent.parent / 'reuse')
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 486, in get_dg_to_reuse_dir
self._copy_element_with_images(child, src_doc, new_doc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 515, in _copy_element_with_images
new_image_part = dst_doc.part.get_or_add_image_part(image_blob)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'DocumentPart' object has no attribute 'get_or_add_image_part'. Did you mean: 'get_or_add_image'?
[ERROR][2026-04-16 17:14:40,603][log.py:249]Internal Server Error: /api/documentUpload/file
[WARNING][2026-04-16 17:15:14,670][operation.py:136]"POST - UploadDocumentController[upload_file] /api/documentUpload/file" ("'bytes' object has no attribute 'seek'",)
[ERROR][2026-04-16 17:15:14,671][errors.py:131]'bytes' object has no attribute 'seek'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 459, in upload_file
self.get_dg_to_reuse_dir(target_dir.parent.parent / 'reuse')
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 486, in get_dg_to_reuse_dir
self._copy_element_with_images(child, src_doc, new_doc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 515, in _copy_element_with_images
new_image_part = dst_doc.part.get_or_add_image(image_blob)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\parts\story.py", line 37, in get_or_add_image
image_part = package.get_or_add_image_part(image_descriptor)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\package.py", line 31, in get_or_add_image_part
return self.image_parts.get_or_add_image_part(image_descriptor)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\package.py", line 74, in get_or_add_image_part
image = Image.from_file(image_descriptor)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\image\image.py", line 47, in from_file
stream.seek(0)
^^^^^^^^^^^
AttributeError: 'bytes' object has no attribute 'seek'
[ERROR][2026-04-16 17:15:14,679][log.py:249]Internal Server Error: /api/documentUpload/file
[WARNING][2026-04-16 17:15:34,677][operation.py:136]"POST - UploadDocumentController[upload_file] /api/documentUpload/file" ("'DocumentPart' object has no attribute 'get_or_add_image_part'",)
[ERROR][2026-04-16 17:15:34,677][errors.py:131]'DocumentPart' object has no attribute 'get_or_add_image_part'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 459, in upload_file
self.get_dg_to_reuse_dir(target_dir.parent.parent / 'reuse')
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 486, in get_dg_to_reuse_dir
self._copy_element_with_images(child, src_doc, new_doc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 515, in _copy_element_with_images
new_image_part = dst_doc.part.get_or_add_image_part(image_blob)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'DocumentPart' object has no attribute 'get_or_add_image_part'. Did you mean: 'get_or_add_image'?
[ERROR][2026-04-16 17:15:34,681][log.py:249]Internal Server Error: /api/documentUpload/file
[WARNING][2026-04-16 17:17:47,027][operation.py:136]"POST - UploadDocumentController[upload_file] /api/documentUpload/file" ("BaseOxmlElement.xpath() got an unexpected keyword argument 'namespaces'",)
[ERROR][2026-04-16 17:17:47,027][errors.py:131]BaseOxmlElement.xpath() got an unexpected keyword argument 'namespaces'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 462, in upload_file
self.get_dg_to_reuse_dir(target_dir.parent.parent / 'reuse')
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 489, in get_dg_to_reuse_dir
self._copy_element_with_images(child, src_doc, new_doc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 510, in _copy_element_with_images
pic_nodes = new_element.xpath('.//pic:pic', namespaces=namespaces)
TypeError: BaseOxmlElement.xpath() got an unexpected keyword argument 'namespaces'
[ERROR][2026-04-16 17:17:47,029][log.py:249]Internal Server Error: /api/documentUpload/file
[WARNING][2026-04-16 17:19:37,022][operation.py:136]"POST - UploadDocumentController[upload_file] /api/documentUpload/file" ("'lxml.etree._Element' object has no attribute 'xml'",)
[ERROR][2026-04-16 17:19:37,022][errors.py:131]'lxml.etree._Element' object has no attribute 'xml'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 462, in upload_file
self.get_dg_to_reuse_dir(target_dir.parent.parent / 'reuse')
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 489, in get_dg_to_reuse_dir
self._copy_element_with_images(child, src_doc, new_doc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 497, in _copy_element_with_images
new_element = parse_xml(element.xml)
^^^^^^^^^^^
AttributeError: 'lxml.etree._Element' object has no attribute 'xml'
[ERROR][2026-04-16 17:19:37,024][log.py:249]Internal Server Error: /api/documentUpload/file
[WARNING][2026-04-16 17:21:20,339][operation.py:136]"POST - UploadDocumentController[upload_file] /api/documentUpload/file" ("BaseOxmlElement.xpath() got an unexpected keyword argument 'namespaces'",)
[ERROR][2026-04-16 17:21:20,339][errors.py:131]BaseOxmlElement.xpath() got an unexpected keyword argument 'namespaces'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createSeiTaiDocument\controllers.py", line 462, in upload_file
self.get_dg_to_reuse_dir(target_dir.parent.parent / 'reuse')
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 489, in get_dg_to_reuse_dir
self._copy_element_with_images(child, src_doc, new_doc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createSeiTaiDocument\controllers.py", line 511, in _copy_element_with_images
pic_nodes = new_element.xpath('.//pic:pic', namespaces=nsmap)
TypeError: BaseOxmlElement.xpath() got an unexpected keyword argument 'namespaces'
[ERROR][2026-04-16 17:21:20,341][log.py:249]Internal Server Error: /api/documentUpload/file
[WARNING][2026-04-17 13:45:31,769][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2026-04-17 13:45:31,835][log.py:249]Unauthorized: /api/system/logout
[WARNING][2026-04-17 13:45:36,826][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2026-04-17 14:20:04,514][logger.py:25][回归测试记录模块][字典数据缺失]片段:字典数据runtime数据缺失请检查相应数据是否存在
[WARNING][2026-04-17 14:20:04,518][logger.py:25][回归测试记录模块][字典数据缺失]片段:字典数据devplant数据缺失请检查相应数据是否存在
[WARNING][2026-04-17 16:18:06,060][operation.py:136]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/670" (1406, "Data too long for column 'adequacy' at row 1")
[ERROR][2026-04-17 16:18:06,060][errors.py:131](1406, "Data too long for column 'adequacy' at row 1")
Traceback (most recent call last): Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params) return self.cursor.execute(sql, params)
@@ -344,7 +18,7 @@ Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query) _mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
MySQLdb.DataError: (1406, "Data too long for column 'adequacy' at row 1") MySQLdb.IntegrityError: (1048, "Column 'is_bidirectional' cannot be null")
The above exception was the direct cause of the following exception: The above exception was the direct cause of the following exception:
@@ -357,9 +31,9 @@ Traceback (most recent call last):
) )
File "D:\programs\uv\python\cpython-3.13.11-windows-x86_64-none\Lib\contextlib.py", line 85, in inner File "D:\programs\uv\python\cpython-3.13.11-windows-x86_64-none\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds) return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 270, in update_testDemand File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\design.py", line 148, in update_design
testDemand_qs.save() design_qs.save()
~~~~~~~~~~~~~~~~~~^^ ~~~~~~~~~~~~~~^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 874, in save File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 874, in save
self.save_base( self.save_base(
~~~~~~~~~~~~~~^ ~~~~~~~~~~~~~~^
@@ -426,168 +100,10 @@ Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query) _mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
django.db.utils.DataError: (1406, "Data too long for column 'adequacy' at row 1") django.db.utils.IntegrityError: (1048, "Column 'is_bidirectional' cannot be null")
[ERROR][2026-04-17 16:18:06,071][log.py:249]Internal Server Error: /api/project/testDemand/update/670 [ERROR][2026-04-22 11:03:49,254][log.py:249]Internal Server Error: /api/project/editDesignDemand/4030
[WARNING][2026-04-17 16:35:01,341][log.py:249]Bad Request: /api/testmanage/project/save [WARNING][2026-04-22 11:23:22,342][operation.py:136]"POST - DesignController[create_design] /api/project/designDemand/save" ("Design() got unexpected keyword arguments: 'forward_source', 'forward_destination', 'forward_description', 'reverse_source', 'reverse_destination', 'reverse_description'",)
[WARNING][2026-04-17 16:45:59,963][log.py:249]Bad Request: /api/testmanage/project/save [ERROR][2026-04-22 11:23:22,342][errors.py:131]Design() got unexpected keyword arguments: 'forward_source', 'forward_destination', 'forward_description', 'reverse_source', 'reverse_destination', 'reverse_description'
[WARNING][2026-04-17 16:46:01,209][log.py:249]Bad Request: /api/testmanage/project/save
[WARNING][2026-04-17 17:01:10,991][log.py:249]Bad Request: /api/testmanage/project/save
[WARNING][2026-04-20 09:31:28,826][log.py:249]Unauthorized: /api/system/getInfo
[WARNING][2026-04-20 09:31:28,893][log.py:249]Unauthorized: /api/system/logout
[WARNING][2026-04-20 09:31:36,102][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[ERROR][2026-04-20 09:34:09,062][log.py:249]Internal Server Error: /api/project/testDemand/save
[ERROR][2026-04-20 09:34:10,386][log.py:249]Internal Server Error: /api/project/testDemand/save
[ERROR][2026-04-20 09:34:10,841][log.py:249]Internal Server Error: /api/project/testDemand/save
[WARNING][2026-04-20 10:25:04,532][operation.py:136]"GET - GenerateControllerDG[create_static_hard] /api/generate/create/static_hard" ('All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters',)
[ERROR][2026-04-20 10:25:04,532][errors.py:131]All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createDocument\controllers\dg.py", line 567, in create_static_hard
res = self.uniform_static_dynamic_response(id, '静态硬件和固件项_2.docx', '静态硬件和固件项.docx', StaticSoftHardware)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createDocument\controllers\dg.py", line 535, in uniform_static_dynamic_response
subdoc = cls.create_table_context(table_data, doc)
File "E:\pycharmProjects\cdtestplant_v1\apps\createDocument\controllers\dg.py", line 498, in create_table_context
cell.text = cell.text.replace("\n", "\a")
^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\table.py", line 284, in text
r.text = text
^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 143, in text
_RunContentAppender.append_to_run_from_text(self, text)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 279, in append_to_run_from_text
appender.add_text(text)
~~~~~~~~~~~~~~~~~^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 285, in add_text
self.flush()
~~~~~~~~~~^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 306, in flush
self._r.add_t(text)
~~~~~~~~~~~~~^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 42, in add_t
t = self._add_t(text=text)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\xmlchemy.py", line 288, in _add_child
setattr(child, key, value)
~~~~~~~^^^^^^^^^^^^^^^^^^^
File "src/lxml/etree.pyx", line 1168, in lxml.etree._Element.text.__set__
File "src/lxml/apihelpers.pxi", line 763, in lxml.etree._setNodeText
File "src/lxml/apihelpers.pxi", line 751, in lxml.etree._createTextNode
File "src/lxml/apihelpers.pxi", line 1556, in lxml.etree._utf8
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
[ERROR][2026-04-20 10:25:04,710][log.py:249]Internal Server Error: /api/generate/create/static_hard
[WARNING][2026-04-20 10:25:26,146][operation.py:136]"GET - GenerateControllerDG[create_static_hard] /api/generate/create/static_hard" ('All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters',)
[ERROR][2026-04-20 10:25:26,150][errors.py:131]All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createDocument\controllers\dg.py", line 567, in create_static_hard
res = self.uniform_static_dynamic_response(id, '静态硬件和固件项_2.docx', '静态硬件和固件项.docx', StaticSoftHardware)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createDocument\controllers\dg.py", line 535, in uniform_static_dynamic_response
subdoc = cls.create_table_context(table_data, doc)
File "E:\pycharmProjects\cdtestplant_v1\apps\createDocument\controllers\dg.py", line 498, in create_table_context
cell.text = cell.text.replace("\n", "\a")
^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\table.py", line 284, in text
r.text = text
^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 143, in text
_RunContentAppender.append_to_run_from_text(self, text)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 279, in append_to_run_from_text
appender.add_text(text)
~~~~~~~~~~~~~~~~~^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 285, in add_text
self.flush()
~~~~~~~~~~^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 306, in flush
self._r.add_t(text)
~~~~~~~~~~~~~^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 42, in add_t
t = self._add_t(text=text)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\xmlchemy.py", line 288, in _add_child
setattr(child, key, value)
~~~~~~~^^^^^^^^^^^^^^^^^^^
File "src/lxml/etree.pyx", line 1168, in lxml.etree._Element.text.__set__
File "src/lxml/apihelpers.pxi", line 763, in lxml.etree._setNodeText
File "src/lxml/apihelpers.pxi", line 751, in lxml.etree._createTextNode
File "src/lxml/apihelpers.pxi", line 1556, in lxml.etree._utf8
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
[ERROR][2026-04-20 10:25:26,215][log.py:249]Internal Server Error: /api/generate/create/static_hard
[WARNING][2026-04-20 10:25:46,224][operation.py:136]"GET - GenerateControllerDG[create_static_hard] /api/generate/create/static_hard" ('All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters',)
[ERROR][2026-04-20 10:25:46,224][errors.py:131]All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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\createDocument\controllers\dg.py", line 565, in create_static_hard
res = self.uniform_static_dynamic_response(id, '静态硬件和固件项_2.docx', '静态硬件和固件项.docx', StaticSoftHardware)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\apps\createDocument\controllers\dg.py", line 533, in uniform_static_dynamic_response
subdoc = cls.create_table_context(table_data, doc)
File "E:\pycharmProjects\cdtestplant_v1\apps\createDocument\controllers\dg.py", line 496, in create_table_context
cell.text = table_data[row][col - 1].replace("\n", "\a")
^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\table.py", line 284, in text
r.text = text
^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 143, in text
_RunContentAppender.append_to_run_from_text(self, text)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 279, in append_to_run_from_text
appender.add_text(text)
~~~~~~~~~~~~~~~~~^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 285, in add_text
self.flush()
~~~~~~~~~~^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 306, in flush
self._r.add_t(text)
~~~~~~~~~~~~~^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\text\run.py", line 42, in add_t
t = self._add_t(text=text)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\docx\oxml\xmlchemy.py", line 288, in _add_child
setattr(child, key, value)
~~~~~~~^^^^^^^^^^^^^^^^^^^
File "src/lxml/etree.pyx", line 1168, in lxml.etree._Element.text.__set__
File "src/lxml/apihelpers.pxi", line 763, in lxml.etree._setNodeText
File "src/lxml/apihelpers.pxi", line 751, in lxml.etree._createTextNode
File "src/lxml/apihelpers.pxi", line 1556, in lxml.etree._utf8
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
[ERROR][2026-04-20 10:25:46,266][log.py:249]Internal Server Error: /api/generate/create/static_hard
[WARNING][2026-04-20 10:34:26,463][operation.py:136]"POST - DesignController[create_design] /api/project/designDemand/save" (1406, "Data too long for column 'protocal' at row 1")
[ERROR][2026-04-20 10:34:26,463][errors.py:131](1406, "Data too long for column 'protocal' at row 1")
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\mysql\base.py", line 78, in execute
return self.cursor.execute(query, args)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
~~~~~~~~^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
MySQLdb.DataError: (1406, "Data too long for column 'protocal' at row 1")
The above exception was the direct cause of the following exception:
Traceback (most recent call last): Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, in run File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, in run
result = self.view_func(request, **ctx.kwargs["view_func_kwargs"]) result = self.view_func(request, **ctx.kwargs["view_func_kwargs"])
@@ -597,107 +113,21 @@ Traceback (most recent call last):
) )
File "D:\programs\uv\python\cpython-3.13.11-windows-x86_64-none\Lib\contextlib.py", line 85, in inner File "D:\programs\uv\python\cpython-3.13.11-windows-x86_64-none\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds) return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\design.py", line 100, in create_design File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\design.py", line 116, in create_design
qs = Design.objects.create(**asert_dict) qs = Design.objects.create(**asert_dict)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs) return getattr(self.get_queryset(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 669, in create File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 667, in create
obj.save(force_insert=True, using=self.db) obj = self.model(**kwargs)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 590, in __init__
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 874, in save raise TypeError(
self.save_base(
~~~~~~~~~~~~~~^
using=using,
^^^^^^^^^^^^
...<2 lines>... ...<2 lines>...
update_fields=update_fields,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
) )
^ TypeError: Design() got unexpected keyword arguments: 'forward_source', 'forward_destination', 'forward_description', 'reverse_source', 'reverse_destination', 'reverse_description'
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 966, in save_base [ERROR][2026-04-22 11:23:22,347][log.py:249]Internal Server Error: /api/project/designDemand/save
updated = self._save_table( [WARNING][2026-04-22 13:13:59,640][operation.py:136]"GET - GenerateControllerDG[create_interface] /api/generate/create/interface" ("'Design' object has no attribute 'source'",)
raw, [ERROR][2026-04-22 13:13:59,640][errors.py:131]'Design' object has no attribute 'source'
...<4 lines>...
update_fields,
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1169, in _save_table
results = self._do_insert(
cls._base_manager, using, insert_fields, returning_fields, raw
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1220, in _do_insert
return manager._insert(
~~~~~~~~~~~~~~~^
[self],
^^^^^^^
...<3 lines>...
raw=raw,
^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 1918, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\compiler.py", line 1925, in execute_sql
cursor.execute(sql, params)
~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 122, in execute
return super().execute(sql, params)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 79, in execute
return self._execute_with_wrappers(
~~~~~~~~~~~~~~~~~~~~~~~~~~~^
sql, params, many=False, executor=self._execute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 92, in _execute_with_wrappers
return executor(sql, params, many, context)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 100, in _execute
with self.db.wrap_database_errors:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\utils.py", line 94, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\mysql\base.py", line 78, in execute
return self.cursor.execute(query, args)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
~~~~~~~~^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
django.db.utils.DataError: (1406, "Data too long for column 'protocal' at row 1")
[ERROR][2026-04-20 10:34:26,484][log.py:249]Internal Server Error: /api/project/designDemand/save
[WARNING][2026-04-20 10:35:26,599][operation.py:136]"POST - DesignController[create_design] /api/project/designDemand/save" (1406, "Data too long for column 'protocal' at row 1")
[ERROR][2026-04-20 10:35:26,599][errors.py:131](1406, "Data too long for column 'protocal' at row 1")
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\mysql\base.py", line 78, in execute
return self.cursor.execute(query, args)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
~~~~~~~~^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
MySQLdb.DataError: (1406, "Data too long for column 'protocal' at row 1")
The above exception was the direct cause of the following exception:
Traceback (most recent call last): Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, in run File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, in run
result = self.view_func(request, **ctx.kwargs["view_func_kwargs"]) result = self.view_func(request, **ctx.kwargs["view_func_kwargs"])
@@ -705,307 +135,8 @@ Traceback (most recent call last):
result = self.route.view_func( result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs 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 File "E:\pycharmProjects\cdtestplant_v1\apps\createDocument\controllers\dg.py", line 417, in create_interface
return func(*args, **kwds) 'source': interface.source,
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\design.py", line 100, in create_design ^^^^^^^^^^^^^^^^
qs = Design.objects.create(**asert_dict) AttributeError: 'Design' object has no attribute 'source'
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method [ERROR][2026-04-22 13:13:59,650][log.py:249]Internal Server Error: /api/generate/create/interface
return getattr(self.get_queryset(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 669, in create
obj.save(force_insert=True, using=self.db)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 874, in save
self.save_base(
~~~~~~~~~~~~~~^
using=using,
^^^^^^^^^^^^
...<2 lines>...
update_fields=update_fields,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 966, in save_base
updated = self._save_table(
raw,
...<4 lines>...
update_fields,
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1169, in _save_table
results = self._do_insert(
cls._base_manager, using, insert_fields, returning_fields, raw
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1220, in _do_insert
return manager._insert(
~~~~~~~~~~~~~~~^
[self],
^^^^^^^
...<3 lines>...
raw=raw,
^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 1918, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\compiler.py", line 1925, in execute_sql
cursor.execute(sql, params)
~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 122, in execute
return super().execute(sql, params)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 79, in execute
return self._execute_with_wrappers(
~~~~~~~~~~~~~~~~~~~~~~~~~~~^
sql, params, many=False, executor=self._execute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 92, in _execute_with_wrappers
return executor(sql, params, many, context)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 100, in _execute
with self.db.wrap_database_errors:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\utils.py", line 94, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\mysql\base.py", line 78, in execute
return self.cursor.execute(query, args)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
~~~~~~~~^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
django.db.utils.DataError: (1406, "Data too long for column 'protocal' at row 1")
[ERROR][2026-04-20 10:35:26,608][log.py:249]Internal Server Error: /api/project/designDemand/save
[WARNING][2026-04-20 10:35:27,464][operation.py:136]"POST - DesignController[create_design] /api/project/designDemand/save" (1406, "Data too long for column 'protocal' at row 1")
[ERROR][2026-04-20 10:35:27,464][errors.py:131](1406, "Data too long for column 'protocal' at row 1")
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\mysql\base.py", line 78, in execute
return self.cursor.execute(query, args)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
~~~~~~~~^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
MySQLdb.DataError: (1406, "Data too long for column 'protocal' at row 1")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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 100, in create_design
qs = Design.objects.create(**asert_dict)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 669, in create
obj.save(force_insert=True, using=self.db)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 874, in save
self.save_base(
~~~~~~~~~~~~~~^
using=using,
^^^^^^^^^^^^
...<2 lines>...
update_fields=update_fields,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 966, in save_base
updated = self._save_table(
raw,
...<4 lines>...
update_fields,
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1169, in _save_table
results = self._do_insert(
cls._base_manager, using, insert_fields, returning_fields, raw
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1220, in _do_insert
return manager._insert(
~~~~~~~~~~~~~~~^
[self],
^^^^^^^
...<3 lines>...
raw=raw,
^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 1918, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\compiler.py", line 1925, in execute_sql
cursor.execute(sql, params)
~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 122, in execute
return super().execute(sql, params)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 79, in execute
return self._execute_with_wrappers(
~~~~~~~~~~~~~~~~~~~~~~~~~~~^
sql, params, many=False, executor=self._execute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 92, in _execute_with_wrappers
return executor(sql, params, many, context)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 100, in _execute
with self.db.wrap_database_errors:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\utils.py", line 94, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\mysql\base.py", line 78, in execute
return self.cursor.execute(query, args)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
~~~~~~~~^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
django.db.utils.DataError: (1406, "Data too long for column 'protocal' at row 1")
[ERROR][2026-04-20 10:35:27,473][log.py:249]Internal Server Error: /api/project/designDemand/save
[WARNING][2026-04-20 10:35:27,981][operation.py:136]"POST - DesignController[create_design] /api/project/designDemand/save" (1406, "Data too long for column 'protocal' at row 1")
[ERROR][2026-04-20 10:35:27,981][errors.py:131](1406, "Data too long for column 'protocal' at row 1")
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\mysql\base.py", line 78, in execute
return self.cursor.execute(query, args)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
~~~~~~~~^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
MySQLdb.DataError: (1406, "Data too long for column 'protocal' at row 1")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 217, 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 100, in create_design
qs = Design.objects.create(**asert_dict)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 669, in create
obj.save(force_insert=True, using=self.db)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 874, in save
self.save_base(
~~~~~~~~~~~~~~^
using=using,
^^^^^^^^^^^^
...<2 lines>...
update_fields=update_fields,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 966, in save_base
updated = self._save_table(
raw,
...<4 lines>...
update_fields,
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1169, in _save_table
results = self._do_insert(
cls._base_manager, using, insert_fields, returning_fields, raw
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1220, in _do_insert
return manager._insert(
~~~~~~~~~~~~~~~^
[self],
^^^^^^^
...<3 lines>...
raw=raw,
^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 1918, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\compiler.py", line 1925, in execute_sql
cursor.execute(sql, params)
~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 122, in execute
return super().execute(sql, params)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 79, in execute
return self._execute_with_wrappers(
~~~~~~~~~~~~~~~~~~~~~~~~~~~^
sql, params, many=False, executor=self._execute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 92, in _execute_with_wrappers
return executor(sql, params, many, context)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 100, in _execute
with self.db.wrap_database_errors:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\utils.py", line 94, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\backends\mysql\base.py", line 78, in execute
return self.cursor.execute(query, args)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
~~~~~~~~^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\MySQLdb\connections.py", line 286, in query
_mysql.connection.query(self, query)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
django.db.utils.DataError: (1406, "Data too long for column 'protocal' at row 1")
[ERROR][2026-04-20 10:35:27,991][log.py:249]Internal Server Error: /api/project/designDemand/save
[WARNING][2026-04-20 10:45:28,053][log.py:249]Bad Request: /api/project/editDesignDemand/4028
[ERROR][2026-04-20 17:05:17,173][log.py:249]Internal Server Error: /api/project/case/create_by_demand

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