日常修复内容

This commit is contained in:
2026-04-20 18:00:55 +08:00
parent 518f2f43a7
commit dffc1d5872
188 changed files with 3969 additions and 3175 deletions

View File

@@ -105,6 +105,10 @@ class GenerateControllerBG(ControllerBase):
language_list = [] language_list = []
for language in languages: for language in languages:
language_list.append(language.get('ident_version')) language_list.append(language.get('ident_version'))
runtimes = get_list_dict('runtime', project_obj.runtime)
runtime_list = [item['ident_version'] for item in runtimes]
devplants = get_list_dict('devplant', project_obj.devplant)
devplant_list = [item['ident_version'] for item in devplants]
# 获取轮次 # 获取轮次
rounds = project_obj.pField.all() rounds = project_obj.pField.all()
@@ -112,7 +116,7 @@ class GenerateControllerBG(ControllerBase):
for r in rounds: for r in rounds:
round_dict = {} round_dict = {}
# 获取SO的dut # 获取SO的dut
so_dut: Dut = r.rdField.filter(type='SO').first() so_dut: Dut | None = r.rdField.filter(type='SO').first()
if so_dut: if so_dut:
round_dict['version'] = so_dut.version round_dict['version'] = so_dut.version
round_dict['line_count'] = int(so_dut.total_lines) round_dict['line_count'] = int(so_dut.total_lines)
@@ -123,8 +127,8 @@ class GenerateControllerBG(ControllerBase):
'project_name': project_obj.name, 'project_name': project_obj.name,
'soft_type': project_obj.get_soft_type_display(), 'soft_type': project_obj.get_soft_type_display(),
'security_level': get_str_dict(project_obj.security_level, 'security_level'), 'security_level': get_str_dict(project_obj.security_level, 'security_level'),
'runtime': get_str_dict(project_obj.runtime, 'runtime'), 'runtime': "\a".join(runtime_list),
'devplant': get_str_dict(project_obj.devplant, 'devplant'), 'devplant': "\a".join(devplant_list),
'language': "\a".join(language_list), 'language': "\a".join(language_list),
'recv_date': project_obj.beginTime.strftime("%Y-%m-%d"), 'recv_date': project_obj.beginTime.strftime("%Y-%m-%d"),
'dev_unit': project_obj.dev_unit, 'dev_unit': project_obj.dev_unit,

View File

@@ -472,51 +472,68 @@ class GenerateControllerDG(ControllerBase, FragementToolsMixin):
# 通用生成静态软件项、静态硬件项、动态软件项、动态硬件信息的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):
"""注意:该函数会增加一列序号列""" """注意:该函数会增加一列序号列,并且支持单元格内回车换行(段落换行)"""
subdoc = doc.new_subdoc() subdoc = doc.new_subdoc()
rows = len(table_data) rows = len(table_data)
cols = len(table_data[0]) + 1 # 多渲染一个序号列 cols = len(table_data[0]) + 1
table = subdoc.add_table(rows=rows, cols=cols) table = subdoc.add_table(rows=rows, cols=cols)
# 单元格处理 # 单元格处理
for row in range(rows): for row in range(rows):
for col in range(cols): for col in range(cols):
cell = table.cell(row, col) # 单元格数据 cell = table.cell(row, col)
# 设置边距 - 所有单元格
set_cell_margins(cell, left=100, right=100, top=100, bottom=100) set_cell_margins(cell, left=100, right=100, top=100, bottom=100)
pa = cell.paragraphs[0]
# 处理第一列 - 要居中 # 获取要显示的文本内容(字符串或按行拆分后的列表)
if col == 0: if col == 0:
if row == 0: # 序号列
cell.text = "序号" lines = ["序号"] if row == 0 else [str(row)]
else:
cell.text = str(row)
pa.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 处理非第一列
else: else:
cell.text = table_data[row][col - 1] raw_text = table_data[row][col - 1]
# 按换行符 \n 拆分为多个段落
lines = raw_text.split('\n') if raw_text else ['']
# 清空单元格原有段落add_table 默认有一个段落)
cell.text = ""
# 删除默认段落,稍后统一添加
for para in cell.paragraphs:
p = para._element
p.getparent().remove(p)
# 逐个添加段落
for i, line in enumerate(lines):
if i == 0:
para = cell.add_paragraph(line)
else:
para = cell.add_paragraph(line)
# 设置段落对齐(第一列居中,其他左对齐,可根据需要调整)
if col == 0:
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
else:
para.alignment = WD_ALIGN_PARAGRAPH.LEFT
# 对第一行(表头)设置黑体字体
if row == 0:
for run in para.runs:
run.font.name = '黑体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
run.font.bold = False
# 表头段落居中(覆盖前面的 left
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 垂直居中 # 垂直居中
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
# 单独处理第一行
for col in range(cols): # 设置序号列宽度
cell = table.cell(0, col)
cell.text = ""
pa = cell.paragraphs[0]
if col == 0:
run = pa.add_run("序号")
else:
run = pa.add_run(str(table_data[0][col - 1]))
run.font.name = '黑体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
run.font.bold = False
pa.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 设置序号列宽度 - 先自动调整为False然后设置True
for cell in table.columns[0].cells: for cell in table.columns[0].cells:
cell.width = Mm(15) cell.width = Mm(15)
pa = cell.paragraphs[0] for para in cell.paragraphs:
pa.alignment = WD_ALIGN_PARAGRAPH.CENTER para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 表格居中 # 表格居中
table.alignment = WD_ALIGN_PARAGRAPH.CENTER table.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 最后设置表格外边框 # 设置表格外边框
set_table_border_by_cell_position(table) set_table_border_by_cell_position(table)
return subdoc return subdoc
@@ -690,11 +707,13 @@ class GenerateControllerDG(ControllerBase, FragementToolsMixin):
project_qs = get_object_or_404(Project, id=id) project_qs = get_object_or_404(Project, id=id)
security = get_str_dict(project_qs.security_level, 'security_level') security = get_str_dict(project_qs.security_level, 'security_level')
languages = get_list_dict('language', project_qs.language) languages = get_list_dict('language', project_qs.language)
runtime = get_str_dict(project_qs.runtime, 'runtime')
devplant = get_str_dict(project_qs.devplant, 'devplant')
language_list = [] language_list = []
for language in languages: for language in languages:
language_list.append(language.get('ident_version')) language_list.append(language.get('ident_version'))
runtimes = get_list_dict('runtime', project_qs.runtime)
runtime_list = [item['ident_version'] for item in runtimes]
devplants = get_list_dict('devplant', project_qs.devplant)
devplant_list = [item['ident_version'] for item in devplants]
# 版本先找第一轮 # 版本先找第一轮
project_round = project_qs.pField.filter(key=0).first() project_round = project_qs.pField.filter(key=0).first()
first_round_SO = project_round.rdField.filter(type='SO').first() first_round_SO = project_round.rdField.filter(type='SO').first()
@@ -715,8 +734,8 @@ class GenerateControllerDG(ControllerBase, FragementToolsMixin):
'recv_date': project_qs.beginTime.strftime("%Y-%m-%d"), 'recv_date': project_qs.beginTime.strftime("%Y-%m-%d"),
'dev_unit': dev_unit, 'dev_unit': dev_unit,
'soft_type': project_qs.get_soft_type_display(), 'soft_type': project_qs.get_soft_type_display(),
'runtime': runtime, 'runtime': "\a".join(runtime_list),
'devplant': devplant 'devplant': "\a".join(devplant_list),
} }
return create_dg_docx('被测软件基本信息.docx', context, id) return create_dg_docx('被测软件基本信息.docx', context, id)

View File

@@ -48,6 +48,10 @@ class GenerateControllerHJL(ControllerBase):
round1_so_dut: Union[Dut, None] = round1_obj.rdField.filter(type='SO').first() round1_so_dut: Union[Dut, None] = round1_obj.rdField.filter(type='SO').first()
languages = get_list_dict('language', project_obj.language) languages = get_list_dict('language', project_obj.language)
language_list = [item['ident_version'] for item in languages] language_list = [item['ident_version'] for item in languages]
runtimes = get_list_dict('runtime', project_obj.runtime)
runtime_list = [item['ident_version'] for item in runtimes]
devplants = get_list_dict('devplant', project_obj.devplant)
devplant_list = [item['ident_version'] for item in devplants]
# 取非第一轮次 # 取非第一轮次
hround_list: QuerySet = project_obj.pField.exclude(key='0') hround_list: QuerySet = project_obj.pField.exclude(key='0')
if len(hround_list) < 1: if len(hround_list) < 1:
@@ -62,8 +66,8 @@ class GenerateControllerHJL(ControllerBase):
'language': "".join(language_list), 'language': "".join(language_list),
'soft_type': project_obj.get_soft_type_display(), 'soft_type': project_obj.get_soft_type_display(),
'security_level': get_str_dict(project_obj.security_level, 'security_level'), 'security_level': get_str_dict(project_obj.security_level, 'security_level'),
'runtime': get_str_dict(project_obj.runtime, 'runtime'), 'runtime': "".join(runtime_list),
'devplant': get_str_dict(project_obj.devplant, 'devplant'), 'devplant': "".join(devplant_list),
'recv_date': project_obj.beginTime.strftime("%Y-%m-%d"), 'recv_date': project_obj.beginTime.strftime("%Y-%m-%d"),
'dev_unit': project_obj.dev_unit, 'dev_unit': project_obj.dev_unit,
} }

View File

@@ -57,6 +57,10 @@ class GenerateControllerHSM(ControllerBase):
round1_so_dut: Union[Dut, None] = round1_obj.rdField.filter(type='SO').first() round1_so_dut: Union[Dut, None] = round1_obj.rdField.filter(type='SO').first()
languages = get_list_dict('language', project_obj.language) languages = get_list_dict('language', project_obj.language)
language_list = [item['ident_version'] for item in languages] language_list = [item['ident_version'] for item in languages]
runtimes = get_list_dict('runtime', project_obj.runtime)
runtime_list = [item['ident_version'] for item in runtimes]
devplants = get_list_dict('devplant', project_obj.devplant)
devplant_list = [item['ident_version'] for item in devplants]
# 取非第一轮次 # 取非第一轮次
hround_list: QuerySet = project_obj.pField.exclude(key='0') hround_list: QuerySet = project_obj.pField.exclude(key='0')
if len(hround_list) < 1: if len(hround_list) < 1:
@@ -71,8 +75,8 @@ class GenerateControllerHSM(ControllerBase):
'language': "".join(language_list), 'language': "".join(language_list),
'soft_type': project_obj.get_soft_type_display(), 'soft_type': project_obj.get_soft_type_display(),
'security_level': get_str_dict(project_obj.security_level, 'security_level'), 'security_level': get_str_dict(project_obj.security_level, 'security_level'),
'runtime': get_str_dict(project_obj.runtime, 'runtime'), 'runtime': "".join(runtime_list),
'devplant': get_str_dict(project_obj.devplant, 'devplant'), 'devplant': "".join(devplant_list),
'recv_date': project_obj.beginTime.strftime("%Y-%m-%d"), 'recv_date': project_obj.beginTime.strftime("%Y-%m-%d"),
'dev_unit': project_obj.dev_unit, 'dev_unit': project_obj.dev_unit,
} }

View File

@@ -1,5 +1,6 @@
# 导入内置模块 # 导入内置模块
from pathlib import Path from pathlib import Path
from django.db.models import QuerySet
# 导入django、ninja等模块 # 导入django、ninja等模块
from ninja_extra import api_controller, ControllerBase, route from ninja_extra import api_controller, ControllerBase, route
from django.db import transaction from django.db import transaction
@@ -7,7 +8,7 @@ from django.shortcuts import get_object_or_404
# 导入文档处理模块 # 导入文档处理模块
from docxtpl import DocxTemplate, InlineImage from docxtpl import DocxTemplate, InlineImage
# 导入ORM模型 # 导入ORM模型
from apps.project.models import Project from apps.project.models import Project, Case
# 导入工具 # 导入工具
from utils.util import get_str_abbr, get_str_dict from utils.util import get_str_abbr, get_str_dict
from utils.chen_response import ChenResponse from utils.chen_response import ChenResponse
@@ -35,7 +36,7 @@ class GenerateControllerWtd(ControllerBase):
for problem in problem_list: for problem in problem_list:
problem_dict = {'ident': problem.ident, 'name': problem.name} problem_dict = {'ident': problem.ident, 'name': problem.name}
# 1.生成被测对象名称、被测对象标识、被测对象版本 # 1.生成被测对象名称、被测对象标识、被测对象版本
cases = problem.case.all() cases: QuerySet[Case] = problem.case.all()
# generate_log:无关联问题单进入生成日志 # generate_log:无关联问题单进入生成日志
if cases.count() < 1: if cases.count() < 1:
gloger.write_warning_log('单个问题单表格', f'问题单{problem.ident}未关联用例,请检查') gloger.write_warning_log('单个问题单表格', f'问题单{problem.ident}未关联用例,请检查')
@@ -70,9 +71,7 @@ class GenerateControllerWtd(ControllerBase):
continue continue
else: else:
p_list.append(rich) p_list.append(rich)
case_design_list.append("-".join([case.dut.name, case.design.chapter + '章节' + ":" + ''.join(p_list)]))
case_design_list.append(
"-".join([case.dut.name, case.design.chapter + '章节' + ":" + ''.join(p_list)]))
# 2.用例标识修改-YL_测试项类型_测试项标识_用例key+1 # 2.用例标识修改-YL_测试项类型_测试项标识_用例key+1
demand = case.test # 中间变量 demand = case.test # 中间变量
demand_testType = demand.testType # 中间变量 demand_testType = demand.testType # 中间变量
@@ -86,12 +85,13 @@ class GenerateControllerWtd(ControllerBase):
for i in range(len(str_dut_name_list)): for i in range(len(str_dut_name_list)):
temp_name_version.append( temp_name_version.append(
"".join([str_dut_name_list[i] + str_dut_ident_list[i], '/V', str_dut_version_list[i]])) "".join([str_dut_name_list[i] + str_dut_ident_list[i], '/V', str_dut_version_list[i]]))
problem_dict['dut_name_version'] = "\a".join(temp_name_version) problem_dict['dut_name_version'] = "\a".join(set(temp_name_version))
problem_dict['case_ident'] = "".join(set(case_ident_list)) problem_dict['case_ident'] = "".join(set(case_ident_list))
problem_dict['type'] = get_str_dict(problem.type, 'problemType') problem_dict['type'] = get_str_dict(problem.type, 'problemType')
problem_dict['grade'] = get_str_dict(problem.grade, 'problemGrade') problem_dict['grade'] = get_str_dict(problem.grade, 'problemGrade')
# 依据要求-获取其设计需求 # 依据要求-获取其设计需求
print(case_design_list)
problem_dict['yaoqiu'] = "\a".join(case_design_list) problem_dict['yaoqiu'] = "\a".join(case_design_list)
# 问题操作 - HTML解析 # 问题操作 - HTML解析
desc_list = ['【问题操作】'] desc_list = ['【问题操作】']

View File

@@ -91,6 +91,8 @@ class RichParser:
inline_image = InlineImage(doc, io.BytesIO(base64_bytes), width=Mm(img_size), height=Mm(height)) inline_image = InlineImage(doc, io.BytesIO(base64_bytes), width=Mm(img_size), height=Mm(height))
final_list.append(inline_image) final_list.append(inline_image)
else: else:
# ~~~新增:将\xa0修改为普通空格~~~
oneline = oneline.replace('\xa0', ' ')
final_list.append(oneline) final_list.append(oneline)
if len(final_list) <= 0: if len(final_list) <= 0:
final_list.append("") final_list.append("")
@@ -116,9 +118,9 @@ class RichParser:
else: else:
# 2.和上面区别:如果<p>带有“图”则居中 # 2.和上面区别:如果<p>带有“图”则居中
if re.match(r"[表图]\d.*", oneline): if re.match(r"[表图]\d.*", oneline):
final_list.append({"isCenter": True, "data": oneline}) final_list.append({"isCenter": True, "data": oneline.replace('\xa0', ' ')})
else: else:
final_list.append({"isCenter": False, "data": oneline}) final_list.append({"isCenter": False, "data": oneline.replace('\xa0', ' ')})
if len(final_list) <= 0: if len(final_list) <= 0:
final_list.append("") final_list.append("")
return final_list return final_list

View File

@@ -257,7 +257,7 @@ class CaseController(ControllerBase):
single_qs.key = case_key single_qs.key = case_key
index = index + 1 index = index + 1
single_qs.save() single_qs.save()
return ChenResponse(message="测试用例删除成功!") return ChenResponse(message="测试用例删除成功!影响域分析中如果有该关联用例则被删除。")
# 右键测试项,根据测试子项生成用例 # 右键测试项,根据测试子项生成用例
@route.post("/case/create_by_demand", url_name='case-create-by-demand') @route.post("/case/create_by_demand", url_name='case-create-by-demand')

View File

@@ -0,0 +1,24 @@
# Generated by Django 6.0.4 on 2026-04-17 13:57
import apps.project.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0029_influenceitem_change_influ'),
]
operations = [
migrations.AlterField(
model_name='project',
name='devplant',
field=models.JSONField(blank=True, default=apps.project.models.create_list, help_text='开发环境', null=True, verbose_name='开发环境'),
),
migrations.AlterField(
model_name='project',
name='runtime',
field=models.JSONField(blank=True, default=apps.project.models.create_list, help_text='运行环境', null=True, verbose_name='运行环境'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.4 on 2026-04-17 16:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0030_alter_project_devplant_alter_project_runtime'),
]
operations = [
migrations.AlterField(
model_name='testdemand',
name='adequacy',
field=models.CharField(blank=True, help_text='充分条件', max_length=2048, null=True, verbose_name='充分条件'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.4 on 2026-04-20 10:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0031_alter_testdemand_adequacy'),
]
operations = [
migrations.AlterField(
model_name='design',
name='protocal',
field=models.CharField(blank=True, default='', help_text='接口数据', max_length=1024, null=True, verbose_name='接口数据'),
),
]

View File

@@ -27,50 +27,29 @@ class Project(CoreModel):
vise_person = models.CharField(max_length=64, verbose_name="质量监督员", help_text="质量监督员") vise_person = models.CharField(max_length=64, verbose_name="质量监督员", help_text="质量监督员")
config_person = models.CharField(max_length=64, verbose_name="配置管理员", help_text="配置管理员") config_person = models.CharField(max_length=64, verbose_name="配置管理员", help_text="配置管理员")
# ~~~~~~~~~~~ # ~~~~~~~~~~~
security_level = models.CharField(max_length=8, blank=True, null=True, verbose_name="安全等级", security_level = models.CharField(max_length=8, blank=True, null=True, verbose_name="安全等级", help_text="安全等级")
help_text="安全等级") test_level = models.JSONField(null=True, blank=True, help_text="测试级别", verbose_name="测试级别", default=create_list)
test_level = models.JSONField(null=True, blank=True, help_text="测试级别", verbose_name="测试级别", plant_type = models.JSONField(null=True, blank=True, help_text="平台类型", verbose_name="平台类型", default=create_list)
default=create_list) report_type = models.CharField(max_length=64, blank=True, null=True, verbose_name="报告类型", help_text="报告类型")
plant_type = models.JSONField(null=True, blank=True, help_text="平台类型", verbose_name="平台类型", language = models.JSONField(null=True, blank=True, help_text="被测语言", verbose_name="被测语言", default=create_list)
default=create_list) standard = models.JSONField(null=True, blank=True, help_text="依据标准", verbose_name="依据标准", default=create_list)
report_type = models.CharField(max_length=64, blank=True, null=True, verbose_name="报告类型",
help_text="报告类型")
language = models.JSONField(null=True, blank=True, help_text="被测语言", verbose_name="被测语言",
default=create_list)
standard = models.JSONField(null=True, blank=True, help_text="依据标准", verbose_name="依据标准",
default=create_list)
entrust_unit = models.CharField(max_length=64, verbose_name="委托方单位", help_text="委托方单位") entrust_unit = models.CharField(max_length=64, verbose_name="委托方单位", help_text="委托方单位")
entrust_contact = models.CharField(max_length=64, blank=True, null=True, verbose_name="委托方联系人", entrust_contact = models.CharField(max_length=64, blank=True, null=True, verbose_name="委托方联系人", help_text="委托方联系人")
help_text="委托方联系人") entrust_contact_phone = models.CharField(max_length=64, blank=True, null=True, verbose_name="委托方电话", help_text="委托方电话")
entrust_contact_phone = models.CharField(max_length=64, blank=True, null=True, verbose_name="委托方电话", entrust_email = models.CharField(max_length=64, blank=True, null=True, verbose_name="委托方邮箱", help_text="委托方邮箱")
help_text="委托方电话")
entrust_email = models.CharField(max_length=64, blank=True, null=True, verbose_name="委托方邮箱",
help_text="委托方邮箱")
dev_unit = models.CharField(max_length=64, verbose_name="开发方单位", help_text="开发方单位") dev_unit = models.CharField(max_length=64, verbose_name="开发方单位", help_text="开发方单位")
dev_contact = models.CharField(max_length=64, blank=True, null=True, verbose_name="研制方联系人", dev_contact = models.CharField(max_length=64, blank=True, null=True, verbose_name="研制方联系人", help_text="研制方联系人")
help_text="研制方联系人") dev_contact_phone = models.CharField(max_length=64, blank=True, null=True, verbose_name="研制方电话", help_text="研制方电话")
dev_contact_phone = models.CharField(max_length=64, blank=True, null=True, verbose_name="研制方电话", dev_email = models.CharField(max_length=64, blank=True, null=True, verbose_name="研制方邮箱", help_text="研制方邮箱")
help_text="研制方电话")
dev_email = models.CharField(max_length=64, blank=True, null=True, verbose_name="研制方邮箱",
help_text="研制方邮箱")
test_unit = models.CharField(max_length=64, verbose_name="测试方单位", help_text="测试方单位") test_unit = models.CharField(max_length=64, verbose_name="测试方单位", help_text="测试方单位")
test_contact = models.CharField(max_length=64, blank=True, null=True, verbose_name="测评中心联系人", test_contact = models.CharField(max_length=64, blank=True, null=True, verbose_name="测评中心联系人", help_text="测评中心联系人")
help_text="测评中心联系人") test_contact_phone = models.CharField(max_length=64, blank=True, null=True, verbose_name="测评中心电话", help_text="测评中心电话")
test_contact_phone = models.CharField(max_length=64, blank=True, null=True, verbose_name="测评中心电话", test_email = models.CharField(max_length=64, blank=True, null=True, verbose_name="测评中心邮箱", help_text="测评中心邮箱")
help_text="测评中心电话") step = models.CharField(max_length=8, blank=True, null=True, verbose_name="项目阶段", help_text="项目阶段")
test_email = models.CharField(max_length=64, blank=True, null=True, verbose_name="测评中心邮箱", abbreviation = models.JSONField(null=True, blank=True, help_text="缩略语", verbose_name="缩略语", default=create_list)
help_text="测评中心邮箱") soft_type = models.SmallIntegerField(verbose_name='软件类型', choices=((1, '新研'), (2, '改造'), (3, '沿用')), default=1)
step = models.CharField(max_length=8, blank=True, null=True, verbose_name="项目阶段", runtime = models.JSONField(null=True, blank=True, help_text="运行环境", verbose_name="运行环境", default=create_list)
help_text="项目阶段") devplant = models.JSONField(null=True, blank=True, help_text="开发环境", verbose_name="开发环境", default=create_list)
abbreviation = models.JSONField(null=True, blank=True, help_text="缩略语", verbose_name="缩略语",
default=create_list)
soft_type = models.SmallIntegerField(verbose_name='软件类型',
choices=((1, '新研'), (2, '改造'), (3, '沿用')),
default=1)
runtime = models.CharField(max_length=8, blank=True, null=True, verbose_name="运行环境",
help_text="运行环境")
devplant = models.CharField(max_length=8, blank=True, null=True, verbose_name="开发环境",
help_text="开发环境")
# 9月2日新增字段密级 # 9月2日新增字段密级
secret = models.CharField(max_length=30, default='1', verbose_name='密级', help_text='密级') secret = models.CharField(max_length=30, default='1', verbose_name='密级', help_text='密级')
@@ -226,7 +205,7 @@ class Design(CoreModel):
type = models.CharField(max_length=64, blank=True, null=True, default='', verbose_name='接口类型', type = models.CharField(max_length=64, blank=True, null=True, default='', verbose_name='接口类型',
help_text='接口类型') help_text='接口类型')
# 注意:该字段改为接口数据 # 注意:该字段改为接口数据
protocal = models.CharField(max_length=64, blank=True, null=True, default='', verbose_name='接口数据', protocal = models.CharField(max_length=1024, blank=True, null=True, default='', verbose_name='接口数据',
help_text='接口数据') help_text='接口数据')
def __str__(self): def __str__(self):
@@ -239,23 +218,15 @@ class Design(CoreModel):
ordering = ('key',) ordering = ('key',)
class TestDemand(CoreModel): class TestDemand(CoreModel):
objects = models.Manager()
"""测试项""" """测试项"""
ident = models.CharField(max_length=64, blank=True, null=True, verbose_name="测试需求标识", objects = models.Manager()
help_text="测试需求标识") ident = models.CharField(max_length=64, blank=True, null=True, verbose_name="测试需求标识", help_text="测试需求标识")
name = models.CharField(max_length=64, blank=True, null=True, verbose_name="测试需求名称", name = models.CharField(max_length=64, blank=True, null=True, verbose_name="测试需求名称", help_text="测试需求名称")
help_text="测试需求名称") adequacy = models.CharField(max_length=2048, blank=True, null=True, verbose_name="充分条件", help_text="充分条件")
adequacy = models.CharField(max_length=256, blank=True, null=True, verbose_name="充分条件", priority = models.CharField(max_length=8, blank=True, null=True, verbose_name="优先级", help_text="优先级")
help_text="充分条件") testType = models.CharField(max_length=8, null=True, blank=True, help_text="测试类型", verbose_name="测试类型", default="1")
priority = models.CharField(max_length=8, blank=True, null=True, verbose_name="优先级", testMethod = models.JSONField(blank=True, help_text="测试方法", verbose_name="测试方法", default=create_list)
help_text="优先级") title = models.CharField(max_length=64, blank=True, null=True, verbose_name="树-名称", help_text="树-名称")
testType = models.CharField(max_length=8, null=True, blank=True, help_text="测试类型",
verbose_name="测试类型",
default="1")
testMethod = models.JSONField(blank=True, help_text="测试方法", verbose_name="测试方法",
default=create_list)
title = models.CharField(max_length=64, blank=True, null=True, verbose_name="树-名称",
help_text="树-名称")
key = models.CharField(max_length=64, blank=True, null=True, key = models.CharField(max_length=64, blank=True, null=True,
verbose_name="round-dut-designkey-testdemand", verbose_name="round-dut-designkey-testdemand",
help_text="round-dut-designkey-testdemand") help_text="round-dut-designkey-testdemand")

View File

@@ -5,6 +5,8 @@ from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.functional import SimpleLazyObject from django.utils.functional import SimpleLazyObject
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
# 导入用例和影响域分析Model-设计信号当删除用例对应影响域分析删除关联用例
from apps.project.models import Case, InfluenceItem
# 导入日志的模型 # 导入日志的模型
from apps.user.models import TableOperationLog, Users from apps.user.models import TableOperationLog, Users
# 导入其他模型用于排除 # 导入其他模型用于排除
@@ -89,3 +91,42 @@ def post_delete_handler(sender, instance, **kwargs):
'operate_des': '删除' 'operate_des': '删除'
} }
log_manager.create(user=user, **ope_dict) log_manager.create(user=user, **ope_dict)
# 信号:删除影响域分析关联的用例,将影响域分析管理用例删除
@receiver(post_delete, sender=Case)
def clean_up_deleted_case_reference_from_influence(sender, instance, **kwargs):
"""
监听 Case 的删除信号。
仅在同一个 Project 范围内,从 InfluenceItem 的 effect_cases 中移除被删用例的 key。
"""
deleted_key = instance.key
project_id = instance.project_id
if not deleted_key or not project_id:
return
# 查询当前项目的影响域分析并且包含该用例
items = InfluenceItem.objects.filter(
influence__round__project_id=project_id, # 外键链锁定项目
effect_cases__contains=[deleted_key] # JSON 字段包含该 key
)
# 未发现有关联的影响域分析则不处理
if not items.exists():
return
# 更新影响域分析的关联用例
updated_items = []
for item in items:
original_keys = item.effect_cases
# 过滤掉被删除的 key保留其他
new_keys = [k for k in original_keys if k != deleted_key]
if len(new_keys) != len(original_keys):
item.effect_cases = new_keys
updated_items.append(item)
if updated_items:
InfluenceItem.objects.bulk_update(updated_items, ['effect_cases'])
else:
print("⚠️ 查询到记录但未发生变更,可能数据有误")

Binary file not shown.

View File

@@ -15,7 +15,7 @@ env.read_env(env_file=Path(__file__).resolve().parent.parent / env_file)
# 数据库地址 # 数据库地址
DATABASE_HOST = "127.0.0.1" DATABASE_HOST = "127.0.0.1"
# 数据库端口 # 数据库端口
DATABASE_PORT = 3307 # 生成环境配置 DATABASE_PORT = 3306 # 生成环境配置-注意打包时务必需改为3307!!!!!!
# 数据库用户名 # 数据库用户名
DATABASE_USER = "root" DATABASE_USER = "root"
# 数据库密码 # 数据库密码

View File

@@ -0,0 +1,2 @@
[WARNING][2026-04-17 14:20:04,514][logger.py:25][回归测试记录模块][字典数据缺失]片段:字典数据runtime数据缺失请检查相应数据是否存在
[WARNING][2026-04-17 14:20:04,518][logger.py:25][回归测试记录模块][字典数据缺失]片段:字典数据devplant数据缺失请检查相应数据是否存在

View File

@@ -322,3 +322,690 @@ Traceback (most recent call last):
pic_nodes = new_element.xpath('.//pic:pic', namespaces=nsmap) pic_nodes = new_element.xpath('.//pic:pic', namespaces=nsmap)
TypeError: BaseOxmlElement.xpath() got an unexpected keyword argument 'namespaces' 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 [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):
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 'adequacy' 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\testDemand.py", line 270, in update_testDemand
testDemand_qs.save()
~~~~~~~~~~~~~~~~~~^^
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 1110, in _save_table
results = self._do_update(
base_qs,
...<5 lines>...
returning_fields,
)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1213, in _do_update
return filtered._update(values, returning_fields)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\query.py", line 1327, in _update
return query.get_compiler(self.db).execute_returning_sql(returning_fields)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\compiler.py", line 2140, in execute_returning_sql
row_count = self.execute_sql(ROW_COUNT)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\compiler.py", line 2111, in execute_sql
row_count = super().execute_sql(result_type)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\compiler.py", line 1624, 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 'adequacy' at row 1")
[ERROR][2026-04-17 16:18:06,071][log.py:249]Internal Server Error: /api/project/testDemand/update/670
[WARNING][2026-04-17 16:35:01,341][log.py:249]Bad Request: /api/testmanage/project/save
[WARNING][2026-04-17 16:45:59,963][log.py:249]Bad Request: /api/testmanage/project/save
[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):
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: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):
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: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

Binary file not shown.

Binary file not shown.

Binary file not shown.

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