保存修订

This commit is contained in:
2025-11-18 10:52:10 +08:00
parent e6c593c920
commit a396a8fcfa
57 changed files with 373 additions and 59 deletions

View File

@@ -3,7 +3,7 @@ from pathlib import Path
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
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.db.models import Q from django.db.models import Q, QuerySet
from docxtpl import DocxTemplate from docxtpl import DocxTemplate
from typing import Optional from typing import Optional
from docx import Document from docx import Document
@@ -16,7 +16,8 @@ from apps.createDocument.extensions import util
from utils.chen_response import ChenResponse from utils.chen_response import ChenResponse
from apps.createDocument.extensions.util import create_bg_docx, get_round1_problem from apps.createDocument.extensions.util import create_bg_docx, get_round1_problem
from utils.util import get_str_dict, get_list_dict, create_problem_grade_str, create_str_testType_list, \ from utils.util import get_str_dict, get_list_dict, create_problem_grade_str, create_str_testType_list, \
create_demand_summary, create_problem_type_str, create_problem_table, create_problem_type_table, get_str_abbr create_demand_summary, create_problem_type_str, create_problem_table, create_problem_type_table, \
get_str_abbr
# 根据轮次生成测评内容文档context # 根据轮次生成测评内容文档context
from apps.createDocument.extensions.content_result_tool import create_round_context from apps.createDocument.extensions.content_result_tool import create_round_context
from apps.createDocument.extensions.zhui import create_bg_round1_zhui from apps.createDocument.extensions.zhui import create_bg_round1_zhui
@@ -62,9 +63,11 @@ class GenerateControllerBG(ControllerBase):
'publish_date': timer.dg_cover_time, 'source': project_obj.test_unit} 'publish_date': timer.dg_cover_time, 'source': project_obj.test_unit}
std_documents.append(dg_duty) std_documents.append(dg_duty)
# 需要添加说明、记录 # 需要添加说明、记录
sm_duty = {'doc_name': f'{project_obj.name}软件测试说明', 'ident_version': f'PT-{project_obj.ident}-TD-1.00', sm_duty = {'doc_name': f'{project_obj.name}软件测试说明',
'ident_version': f'PT-{project_obj.ident}-TD-1.00',
'publish_date': timer.sm_cover_time, 'source': project_obj.test_unit} 'publish_date': timer.sm_cover_time, 'source': project_obj.test_unit}
jl_duty = {'doc_name': f'{project_obj.name}软件测试记录', 'ident_version': f'PT-{project_obj.ident}-TN', jl_duty = {'doc_name': f'{project_obj.name}软件测试记录',
'ident_version': f'PT-{project_obj.ident}-TN',
'publish_date': timer.jl_cover_time, 'source': project_obj.test_unit} 'publish_date': timer.jl_cover_time, 'source': project_obj.test_unit}
# 循环所有轮次,除了第一轮 # 循环所有轮次,除了第一轮
std_documents.extend([sm_duty, jl_duty]) std_documents.extend([sm_duty, jl_duty])
@@ -144,7 +147,8 @@ class GenerateControllerBG(ControllerBase):
for case in round1_case_qs: for case in round1_case_qs:
demand: TestDemand = case.test demand: TestDemand = case.test
test_type_set.add(demand.testType) test_type_set.add(demand.testType)
round1_testType_list = list(map(lambda x: x['ident_version'], get_list_dict('testType', list(test_type_set)))) round1_testType_list = list(
map(lambda x: x['ident_version'], get_list_dict('testType', list(test_type_set))))
# 这里找出第一轮,源代码被测件,并获取版本 # 这里找出第一轮,源代码被测件,并获取版本
so_dut = round1.rdField.filter(type='SO').first() so_dut = round1.rdField.filter(type='SO').first()
so_dut_verson = "$请添加第一轮的源代码信息$" so_dut_verson = "$请添加第一轮的源代码信息$"
@@ -158,7 +162,8 @@ class GenerateControllerBG(ControllerBase):
# 找所属dut的so-dut # 找所属dut的so-dut
so_dut = r.rdField.filter(type='SO').first() so_dut = r.rdField.filter(type='SO').first()
# 找出上一轮dut的so-dut # 找出上一轮dut的so-dut
last_problem_count = Problem.objects.filter(case__round__key=str(int(r.key) - 1)).distinct().count() last_problem_count = Problem.objects.filter(
case__round__key=str(int(r.key) - 1)).distinct().count()
current_round_problem_count = Problem.objects.filter(case__round__key=r.key).distinct().count() current_round_problem_count = Problem.objects.filter(case__round__key=r.key).distinct().count()
if current_round_problem_count > 0: if current_round_problem_count > 0:
current_round_description = f'引入新问题{current_round_problem_count}' current_round_description = f'引入新问题{current_round_problem_count}'
@@ -294,14 +299,16 @@ class GenerateControllerBG(ControllerBase):
static_problems = problems_r1.filter(case__test__testType='15') static_problems = problems_r1.filter(case__test__testType='15')
# 6.第一轮动态测试用例个数(动态测试-非静态分析、文档审查、代码审查、代码走查4个) # 6.第一轮动态测试用例个数(动态测试-非静态分析、文档审查、代码审查、代码走查4个)
case_r1_qs = round1.rcField.filter(~Q(test__testType='2'), ~Q(test__testType='3'), ~Q(test__testType='8'), case_r1_qs = round1.rcField.filter(~Q(test__testType='2'), ~Q(test__testType='3'),
~Q(test__testType='8'),
~Q(test__testType='15'), ~Q(test__testType='15'),
round__key='0') # !warning:中变量-第一轮动态测试用例qs round__key='0') # !warning:中变量-第一轮动态测试用例qs
testType_list, testType_count = create_str_testType_list(case_r1_qs) testType_list, testType_count = create_str_testType_list(case_r1_qs)
## 动态测试(第一轮)各个类型测试用例执行表/各个测试需求表 ## 动态测试(第一轮)各个类型测试用例执行表/各个测试需求表
demand_r1_dynamic_qs = round1.rtField.filter(~Q(testType='2'), ~Q(testType='3'), ~Q(testType='8'), demand_r1_dynamic_qs = round1.rtField.filter(~Q(testType='2'), ~Q(testType='3'), ~Q(testType='8'),
~Q(testType='15')) # !warning:中变量:第一轮动态测试的测试项 ~Q(testType='15')) # !warning:中变量:第一轮动态测试的测试项
summary_r1_demand_info, summry_r1_demandType_info = create_demand_summary(demand_r1_dynamic_qs, project_ident) summary_r1_demand_info, summry_r1_demandType_info = create_demand_summary(demand_r1_dynamic_qs,
project_ident)
# N.第一轮所有动态问题统计 # N.第一轮所有动态问题统计
problems_dynamic_r1 = problems_r1.filter(~Q(case__test__testType='2'), ~Q(case__test__testType='3'), problems_dynamic_r1 = problems_r1.filter(~Q(case__test__testType='2'), ~Q(case__test__testType='3'),
@@ -450,7 +457,8 @@ class GenerateControllerBG(ControllerBase):
for design in round1_design_yz_qs: for design in round1_design_yz_qs:
rich_parser2 = RichParser(design.description) rich_parser2 = RichParser(design.description)
p_list = rich_parser2.get_final_p_list() p_list = rich_parser2.get_final_p_list()
design_dict = {'yz_des': "".join([design.chapter, '章节:', design.name, '\a', '\a'.join(p_list)])} design_dict = {
'yz_des': "".join([design.chapter, '章节:', design.name, '\a', '\a'.join(p_list)])}
# 找出其中所有demand # 找出其中所有demand
demand_qs = design.dtField.all() demand_qs = design.dtField.all()
if not demand_qs.exists(): if not demand_qs.exists():
@@ -545,7 +553,7 @@ class GenerateControllerBG(ControllerBase):
last_dut_so = dut_so last_dut_so = dut_so
break break
# 找出所有被测件协议XY、需求规格说明XQ、设计说明SJ # 找出所有被测件协议XY、需求规格说明XQ、设计说明SJ
duties_qs: list[Dut] = project_obj.pdField.filter(Q(type='XQ') | Q(type='SJ') | Q(type='XY')) duties_qs = project_obj.pdField.filter(Q(type='XQ') | Q(type='SJ') | Q(type='XY'))
# ***Inspect-start*** # ***Inspect-start***
if not last_dut_so: if not last_dut_so:
self.logger.model = '测评报告' self.logger.model = '测评报告'

View File

@@ -110,8 +110,9 @@ class TestDemandController(ControllerBase):
# ident判重 # ident判重
project_qs = Project.objects.filter(id=payload.project_id).first() project_qs = Project.objects.filter(id=payload.project_id).first()
if payload.ident and project_qs: if payload.ident and project_qs:
exists = project_qs.ptField.filter(ident=payload.ident).exists() old_obj = project_qs.ptField.filter(ident=payload.ident).first()
if exists: # 2025/06/24修改现在运行不同测试类型有相同的标识
if old_obj and old_obj.testType == payload.testType:
return ChenResponse(code=500, status=500, return ChenResponse(code=500, status=500,
message='测试项标识和其他测试项重复,请更换测试项标识!!!') message='测试项标识和其他测试项重复,请更换测试项标识!!!')
# 构造design_key # 构造design_key
@@ -161,9 +162,11 @@ class TestDemandController(ControllerBase):
for attr, value in payload.dict().items(): for attr, value in payload.dict().items():
# 判重复 # 判重复
if attr == 'ident': if attr == 'ident':
if testDemand_qs.ident != value: # 如果ident不和原来相等则要判重复 # 先判断是否和原标识一样,且测试类型改变
exists = project_qs.ptField.filter(ident=payload.ident).exists() if payload.dict()['testType'] != testDemand_qs.testType and value == old_ident:
if exists: old_obj = project_qs.ptField.filter(ident=payload.ident).first()
# 2025/06/24修改不同类型可以相同
if old_obj and old_obj.testType == payload.dict()['testType']:
return ChenResponse(code=500, status=500, message='更换的标识和其他测试项重复') return ChenResponse(code=500, status=500, message='更换的标识和其他测试项重复')
if attr == 'project_id' or attr == 'round_key' or attr == 'dut_key' or attr == 'design_key': if attr == 'project_id' or attr == 'round_key' or attr == 'dut_key' or attr == 'design_key':
continue # 如果发现是key则不处理 continue # 如果发现是key则不处理

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.3 on 2025-06-20 19:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0016_dutmetrics'),
]
operations = [
migrations.AlterField(
model_name='testdemandcontentstep',
name='id',
field=models.BigAutoField(help_text='Id', primary_key=True, serialize=False, verbose_name='Id'),
),
]

View File

@@ -258,7 +258,6 @@ class TestDemandContent(CoreModel):
# 4月17日新增因为测试项需要测试子项step # 4月17日新增因为测试项需要测试子项step
class TestDemandContentStep(CoreModel): class TestDemandContentStep(CoreModel):
objects = models.Manager() objects = models.Manager()
id = ShortUUIDField(primary_key=True, help_text="Id", verbose_name="Id")
operation = models.CharField(max_length=3072, blank=True, null=True, verbose_name='测试子项操作') operation = models.CharField(max_length=3072, blank=True, null=True, verbose_name='测试子项操作')
expect = models.CharField(max_length=1024, blank=True, null=True, verbose_name='期望') expect = models.CharField(max_length=1024, blank=True, null=True, verbose_name='期望')
testDemandContent = models.ForeignKey(to="TestDemandContent", db_constraint=False, related_name="testStepField", testDemandContent = models.ForeignKey(to="TestDemandContent", db_constraint=False, related_name="testStepField",

View File

@@ -14,7 +14,8 @@ from ninja_jwt.controller import TokenObtainPairController
from ninja_jwt import schema from ninja_jwt import schema
from typing import List from typing import List
from utils.chen_response import ChenResponse from utils.chen_response import ChenResponse
from apps.user.schema import UserInfoOutSchema, CreateUserSchema, CreateUserOutSchema, UserRetrieveInputSchema, \ from apps.user.schema import UserInfoOutSchema, CreateUserSchema, CreateUserOutSchema, \
UserRetrieveInputSchema, \
UserRetrieveOutSchema, UpdateDeleteUserSchema, UpdateDeleteUserOutSchema, DeleteUserSchema, LogOutSchema, \ UserRetrieveOutSchema, UpdateDeleteUserSchema, UpdateDeleteUserOutSchema, DeleteUserSchema, LogOutSchema, \
LogInputSchema, LogDeleteInSchema, AdminModifyPasswordSchema LogInputSchema, LogDeleteInSchema, AdminModifyPasswordSchema
from apps.user.models import TableOperationLog, Users as UserClass from apps.user.models import TableOperationLog, Users as UserClass
@@ -102,7 +103,8 @@ class UserManageController(ControllerBase):
create_datetime__range=date_list).order_by('-create_datetime') create_datetime__range=date_list).order_by('-create_datetime')
return qs return qs
@route.put("/update/{user_id}", response=UpdateDeleteUserOutSchema, permissions=[IsAuthenticated, IsAdminUser], @route.put("/update/{user_id}", response=UpdateDeleteUserOutSchema,
permissions=[IsAuthenticated, IsAdminUser],
url_name="user-update") url_name="user-update")
def update_user(self, user_id: int, payload: UpdateDeleteUserSchema): def update_user(self, user_id: int, payload: UpdateDeleteUserSchema):
if payload.username == "superAdmin": if payload.username == "superAdmin":
@@ -122,7 +124,8 @@ class UserManageController(ControllerBase):
return ChenResponse(code=200, status=200, message="删除成功") return ChenResponse(code=200, status=200, message="删除成功")
# 管理员改变用户状态是否停用/启用 # 管理员改变用户状态是否停用/启用
@route.get('/change_status', auth=JWTAuth(), permissions=[IsAuthenticated, IsAdminUser], url_name='user-change') @route.get('/change_status', auth=JWTAuth(), permissions=[IsAuthenticated, IsAdminUser],
url_name='user-change')
def change_user_status(self, user_status: str, userId: int): def change_user_status(self, user_status: str, userId: int):
user = Users.objects.filter(id=userId).first() user = Users.objects.filter(id=userId).first()
if not user: if not user:
@@ -144,6 +147,7 @@ class UserManageController(ControllerBase):
user.set_password(payload.newPassword) user.set_password(payload.newPassword)
user.save() user.save()
return ChenResponse(status=200, code=200, message='管理员修改密码成功') return ChenResponse(status=200, code=200, message='管理员修改密码成功')
return None
# 用户登录后动态读取LDAP用户录入数据 # 用户登录后动态读取LDAP用户录入数据
@route.get("/ldap", url_name='user-ldap') @route.get("/ldap", url_name='user-ldap')
@@ -171,7 +175,8 @@ class LogController(ControllerBase):
logs = logs.filter(user__username__icontains=data.user, create_datetime__range=data.create_datetime) logs = logs.filter(user__username__icontains=data.user, create_datetime__range=data.create_datetime)
return logs return logs
@route.get('/operation_delete', url_name='log_delete', permissions=[IsAuthenticated, IsAdminUser], auth=JWTAuth()) @route.get('/operation_delete', url_name='log_delete', permissions=[IsAuthenticated, IsAdminUser],
auth=JWTAuth())
def log_delete(self, data: LogDeleteInSchema = Query(...)): def log_delete(self, data: LogDeleteInSchema = Query(...)):
time = datetime.now() - timedelta(days=data.day) time = datetime.now() - timedelta(days=data.day)
log_qs = TableOperationLog.objects.filter(create_datetime__lt=time) log_qs = TableOperationLog.objects.filter(create_datetime__lt=time)

View File

@@ -1,7 +1,15 @@
import ldap import ldap
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
import environ
def load_ldap_users(url='ldap://dns.paisat.cn:389', # 1. 环境变量读取
env = environ.Env()
# 2. LDAP服务器host和port
server_uri = env('AUTH_LDAP_SERVER_URI', default='ldap://dns.paisat.cn:389')
# 3. 连接LDAP服务器进行操作
def load_ldap_users(url=server_uri,
dn="CN=Administrator,CN=Users,DC=sstc,DC=ctu", dn="CN=Administrator,CN=Users,DC=sstc,DC=ctu",
pwd="WXWX2019!!!!!!", pwd="WXWX2019!!!!!!",
search_dn="OU=ALL,DC=sstc,DC=ctu", search_dn="OU=ALL,DC=sstc,DC=ctu",

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -43,3 +43,292 @@
[WARNING][2025-05-28 09:24:26,068][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []}) [WARNING][2025-05-28 09:24:26,068][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-05-28 18:35:30,083][log.py:248]Not Found: /api/project/testDemand/priorityReplace/ [WARNING][2025-05-28 18:35:30,083][log.py:248]Not Found: /api/project/testDemand/priorityReplace/
[WARNING][2025-05-28 18:35:42,929][log.py:248]Not Found: /api/project/testDemand/priorityReplace/ [WARNING][2025-05-28 18:35:42,929][log.py:248]Not Found: /api/project/testDemand/priorityReplace/
[WARNING][2025-05-29 09:22:57,248][log.py:248]Unauthorized: /api/system/getInfo
[WARNING][2025-05-29 09:22:57,316][log.py:248]Unauthorized: /api/system/logout
[WARNING][2025-05-29 09:23:05,519][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-05-29 15:36:46,411][log.py:248]Unauthorized: /api/system/getInfo
[WARNING][2025-05-29 15:36:46,430][log.py:248]Unauthorized: /api/system/logout
[WARNING][2025-05-29 15:36:55,727][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-05-29 15:42:40,386][operation.py:133]"GET - CaseController[copy_move_case_to_demand] /api/project/case/copy_or_move_to_demand" (500, '无法移动到自己所属测试项里面')
[ERROR][2025-05-29 15:42:40,395][log.py:248]Internal Server Error: /api/project/case/copy_or_move_to_demand
[WARNING][2025-06-12 19:52:28,194][log.py:248]Unauthorized: /api/system/getInfo
[WARNING][2025-06-12 19:52:28,229][log.py:248]Unauthorized: /api/system/logout
[WARNING][2025-06-12 19:52:39,174][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-06-16 18:40:17,570][log.py:248]Unauthorized: /api/system/getInfo
[WARNING][2025-06-16 18:40:17,629][log.py:248]Unauthorized: /api/system/logout
[WARNING][2025-06-16 18:40:25,246][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-06-17 18:40:34,724][log.py:248]Unauthorized: /api/system/getInfo
[WARNING][2025-06-17 18:40:34,779][log.py:248]Unauthorized: /api/system/logout
[WARNING][2025-06-17 18:40:44,206][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-06-17 19:06:24,482][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-06-17 19:28:33,023][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-06-17 19:34:34,074][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-06-17 19:35:56,384][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[ERROR][2025-06-17 19:38:35,896][log.py:248]Internal Server Error: /api/project/case/create_by_demand
[WARNING][2025-06-17 19:39:08,972][operation.py:133]"GET - CaseController[copy_move_case_to_demand] /api/project/case/copy_or_move_to_demand" (500, '无法移动到自己所属测试项里面')
[ERROR][2025-06-17 19:39:08,982][log.py:248]Internal Server Error: /api/project/case/copy_or_move_to_demand
[ERROR][2025-06-17 19:50:34,107][log.py:248]Internal Server Error: /api/testmanage/project/update/37
[ERROR][2025-06-17 19:51:22,090][log.py:248]Internal Server Error: /api/testmanage/project/update/37
[WARNING][2025-06-17 19:55:44,124][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-06-17 20:00:39,048][operation.py:133]"GET - CaseController[copy_move_case_to_demand] /api/project/case/copy_or_move_to_demand" (500, '无法移动到自己所属测试项里面')
[ERROR][2025-06-17 20:00:39,059][log.py:248]Internal Server Error: /api/project/case/copy_or_move_to_demand
[WARNING][2025-06-20 18:31:43,742][log.py:253]Unauthorized: /api/system/getInfo
[WARNING][2025-06-20 18:31:43,795][log.py:253]Unauthorized: /api/system/logout
[WARNING][2025-06-20 18:31:55,956][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-06-20 19:13:50,800][operation.py:133]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/538" ('QuerySet.create() takes 1 positional argument but 2 were given',)
[ERROR][2025-06-20 19:13:50,800][errors.py:131]QuerySet.create() takes 1 positional argument but 2 were given
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, 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 99, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\python13\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 195, in update_testDemand
TestDemandContentStep.objects.create(step)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
TypeError: QuerySet.create() takes 1 positional argument but 2 were given
[ERROR][2025-06-20 19:13:50,825][log.py:253]Internal Server Error: /api/project/testDemand/update/538
[WARNING][2025-06-20 19:14:14,201][operation.py:133]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/538" ('QuerySet.create() takes 1 positional argument but 2 were given',)
[ERROR][2025-06-20 19:14:14,201][errors.py:131]QuerySet.create() takes 1 positional argument but 2 were given
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, 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 99, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\python13\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 196, in update_testDemand
TestDemandContentStep.objects.create(step)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
TypeError: QuerySet.create() takes 1 positional argument but 2 were given
[ERROR][2025-06-20 19:14:14,204][log.py:253]Internal Server Error: /api/project/testDemand/update/538
[WARNING][2025-06-20 19:22:54,908][operation.py:133]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/538" ("Field 'id' expected a number but got 'akExxrjyerVcPhHsAsRBcB'.",)
[ERROR][2025-06-20 19:22:54,908][errors.py:131]Field 'id' expected a number but got 'akExxrjyerVcPhHsAsRBcB'.
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\fields\__init__.py", line 2128, in get_prep_value
return int(value)
ValueError: invalid literal for int() with base 10: 'akExxrjyerVcPhHsAsRBcB'
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 214, 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 99, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\python13\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 177, in update_testDemand
content_single.delete()
~~~~~~~~~~~~~~~~~~~~~^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\base.py", line 1281, in delete
return collector.delete()
~~~~~~~~~~~~~~~~^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\deletion.py", line 501, in delete
count = query.delete_batch(pk_list, self.using)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\subqueries.py", line 38, in delete_batch
self.add_filter(
~~~~~~~~~~~~~~~^
f"{field.attname}__in",
^^^^^^^^^^^^^^^^^^^^^^^
pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\query.py", line 1626, in add_filter
self.add_q(Q((filter_lhs, filter_rhs)))
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\query.py", line 1646, in add_q
clause, _ = self._add_q(q_object, can_reuse)
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\query.py", line 1678, in _add_q
child_clause, needed_inner = self.build_filter(
~~~~~~~~~~~~~~~~~^
child,
^^^^^^
...<7 lines>...
update_join_types=update_join_types,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\query.py", line 1588, in build_filter
condition = self.build_lookup(lookups, col, value)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\sql\query.py", line 1415, in build_lookup
lookup = lookup_class(lhs, rhs)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\lookups.py", line 38, in __init__
self.rhs = self.get_prep_lookup()
~~~~~~~~~~~~~~~~~~~~^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\lookups.py", line 536, in get_prep_lookup
return super().get_prep_lookup()
~~~~~~~~~~~~~~~~~~~~~~~^^
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\lookups.py", line 321, in get_prep_lookup
rhs_value = self.lhs.output_field.get_prep_value(rhs_value)
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\django\db\models\fields\__init__.py", line 2130, in get_prep_value
raise e.__class__(
"Field '%s' expected a number but got %r." % (self.name, value),
) from e
ValueError: Field 'id' expected a number but got 'akExxrjyerVcPhHsAsRBcB'.
[ERROR][2025-06-20 19:22:54,954][log.py:253]Internal Server Error: /api/project/testDemand/update/538
[WARNING][2025-06-23 09:38:48,076][log.py:253]Unauthorized: /api/system/getInfo
[WARNING][2025-06-23 09:38:48,135][log.py:253]Unauthorized: /api/system/logout
[WARNING][2025-06-23 09:39:01,200][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[ERROR][2025-06-23 09:39:40,070][log.py:253]Internal Server Error: /api/project/testDemand/save
[WARNING][2025-06-23 15:50:09,104][log.py:253]Not Found: /
[WARNING][2025-06-23 15:50:09,106][log.py:253]Not Found: /
[WARNING][2025-06-23 15:50:09,228][log.py:253]Not Found: /favicon.ico
[WARNING][2025-06-24 10:48:24,474][log.py:253]Unauthorized: /api/system/getInfo
[WARNING][2025-06-24 10:48:24,540][log.py:253]Unauthorized: /api/system/logout
[WARNING][2025-06-24 10:48:31,280][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[ERROR][2025-06-24 13:23:43,307][log.py:253]Internal Server Error: /api/project/testDemand/save
[ERROR][2025-06-24 13:25:24,728][log.py:253]Internal Server Error: /api/project/testDemand/update/554
[WARNING][2025-06-24 13:30:41,064][operation.py:133]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/554" ("'str' object has no attribute 'testType'",)
[ERROR][2025-06-24 13:30:41,064][errors.py:131]'str' object has no attribute 'testType'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, 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 99, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\python13\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 167, in update_testDemand
if old_obj and old_ident.testType == payload.dict().items()['testType']:
^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'testType'
[ERROR][2025-06-24 13:30:41,088][log.py:253]Internal Server Error: /api/project/testDemand/update/554
[WARNING][2025-06-24 13:31:40,139][operation.py:133]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/554" ("'str' object has no attribute 'testType'",)
[ERROR][2025-06-24 13:31:40,139][errors.py:131]'str' object has no attribute 'testType'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, 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 99, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\python13\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 167, in update_testDemand
if old_obj and old_ident.testType == payload.dict()['testType']:
^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'testType'
[ERROR][2025-06-24 13:31:40,141][log.py:253]Internal Server Error: /api/project/testDemand/update/554
[WARNING][2025-06-24 13:32:21,173][operation.py:133]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/554" ("'str' object has no attribute 'testType'",)
[ERROR][2025-06-24 13:32:21,173][errors.py:131]'str' object has no attribute 'testType'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, 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 99, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\python13\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 168, in update_testDemand
if old_obj and old_ident.testType == payload.dict()['testType']:
^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'testType'
[ERROR][2025-06-24 13:32:21,177][log.py:253]Internal Server Error: /api/project/testDemand/update/554
[WARNING][2025-06-24 13:32:54,351][operation.py:133]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/554" ("'str' object has no attribute 'testType'",)
[ERROR][2025-06-24 13:32:54,351][errors.py:131]'str' object has no attribute 'testType'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, 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 99, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\python13\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 168, in update_testDemand
if old_obj and old_ident.testType == payload.dict()['testType']:
^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'testType'
[ERROR][2025-06-24 13:32:54,355][log.py:253]Internal Server Error: /api/project/testDemand/update/554
[WARNING][2025-06-24 13:33:28,458][operation.py:133]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/554" ("'str' object has no attribute 'testType'",)
[ERROR][2025-06-24 13:33:28,459][errors.py:131]'str' object has no attribute 'testType'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, 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 99, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\python13\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 168, in update_testDemand
if old_obj and old_ident.testType == payload.dict()['testType']:
^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'testType'
[ERROR][2025-06-24 13:33:28,461][log.py:253]Internal Server Error: /api/project/testDemand/update/554
[WARNING][2025-06-24 13:34:49,241][operation.py:133]"PUT - TestDemandController[update_testDemand] /api/project/testDemand/update/554" ("'str' object has no attribute 'testType'",)
[ERROR][2025-06-24 13:34:49,242][errors.py:131]'str' object has no attribute 'testType'
Traceback (most recent call last):
File "E:\pycharmProjects\cdtestplant_v1\.venv\Lib\site-packages\ninja_extra\operation.py", line 214, 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 99, in as_view
result = self.route.view_func(
ctx.controller_instance, *args, **ctx.view_func_kwargs
)
File "D:\python13\Lib\contextlib.py", line 85, in inner
return func(*args, **kwds)
File "E:\pycharmProjects\cdtestplant_v1\apps\project\controllers\testDemand.py", line 168, in update_testDemand
if old_obj and old_ident.testType == payload.dict()['testType']:
^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'testType'
[ERROR][2025-06-24 13:34:49,243][log.py:253]Internal Server Error: /api/project/testDemand/update/554
[ERROR][2025-06-24 13:37:25,218][log.py:253]Internal Server Error: /api/project/testDemand/update/554
[ERROR][2025-06-24 13:45:28,405][log.py:253]Internal Server Error: /api/project/testDemand/update/538
[ERROR][2025-06-24 13:45:37,820][log.py:253]Internal Server Error: /api/project/testDemand/update/538
[ERROR][2025-06-24 13:54:04,108][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 13:54:21,656][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 13:54:51,291][log.py:253]Internal Server Error: /api/project/testDemand/update/554
[ERROR][2025-06-24 13:57:11,927][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 13:58:49,636][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 13:59:26,395][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 13:59:35,647][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 14:00:17,238][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 14:00:20,458][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 14:00:20,967][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 14:00:32,875][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 14:00:33,431][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 14:03:50,425][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 14:03:52,007][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 14:03:52,376][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[ERROR][2025-06-24 14:03:52,509][log.py:253]Internal Server Error: /api/project/testDemand/update/574
[WARNING][2025-06-25 19:59:39,817][log.py:253]Unauthorized: /api/system/getInfo
[WARNING][2025-06-25 19:59:39,875][log.py:253]Unauthorized: /api/system/logout
[WARNING][2025-06-25 19:59:48,452][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-07-11 20:26:09,493][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-08-02 23:11:38,217][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-08-11 10:51:01,112][log.py:253]Not Found: /
[WARNING][2025-08-11 10:51:01,115][log.py:253]Not Found: /
[WARNING][2025-08-11 10:51:01,229][log.py:253]Not Found: /favicon.ico
[WARNING][2025-08-11 10:51:01,234][log.py:253]Not Found: /favicon.ico
[WARNING][2025-08-11 10:54:44,310][log.py:253]Not Found: /
[WARNING][2025-08-26 15:32:42,233][log.py:253]Unauthorized: /api/system/getInfo
[WARNING][2025-08-26 15:32:42,307][log.py:253]Unauthorized: /api/system/logout
[WARNING][2025-08-26 15:32:54,673][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-08-29 23:36:57,981][log.py:253]Unauthorized: /api/system/getInfo
[WARNING][2025-08-29 23:36:58,051][log.py:253]Unauthorized: /api/system/logout
[WARNING][2025-08-29 23:37:10,653][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-11-06 15:52:18,257][log.py:253]Unauthorized: /api/system/getInfo
[WARNING][2025-11-06 15:52:18,312][log.py:253]Unauthorized: /api/system/logout
[WARNING][2025-11-06 15:52:27,134][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-11-06 16:03:42,332][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
[WARNING][2025-11-17 16:45:54,859][log.py:253]Unauthorized: /api/system/getInfo
[WARNING][2025-11-17 16:45:54,926][log.py:253]Unauthorized: /api/system/logout
[WARNING][2025-11-17 16:46:10,800][backend.py:91]Caught LDAPError looking up user: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,37 +1,37 @@
Django~=5.2.1 Django~=5.2.8
django-auth-ldap~=5.2.0 django-auth-ldap~=5.2.0
asgiref~=3.8.1 asgiref~=3.10.0
sqlparse~=0.5.3 sqlparse~=0.5.3
# 基础包 # 基础包
mysqlclient~=2.2.7 mysqlclient~=2.2.7
orjson~=3.10.18 orjson~=3.11.4
lxml~=5.4.0 lxml~=6.0.2
typing_extensions~=4.13.2 typing_extensions~=4.15.0
# 必须whl安装的包 # 必须whl安装的包
python-ldap~=3.4.4 python-ldap~=3.4.4
# 项目包 # 项目包
django-environ~=0.12.0 django-environ~=0.12.0
django-ninja~=1.4.1 django-ninja~=1.4.5
pydantic~=2.11.4 pydantic~=2.12.4
pydantic-core~=2.33.2 pydantic-core~=2.41.5
django-ninja-extra~=0.30.0 django-ninja-extra~=0.30.2
django-ninja-jwt~=5.3.7 django-ninja-jwt~=5.4.0
django-tinymce~=4.1.0 django-tinymce~=5.0.0
PyJWT~=2.10.1 PyJWT~=2.10.1
cryptography~=45.0.3 cryptography~=45.0.6
ninja-schema~=0.14.2 ninja-schema~=0.14.3
user-agents~=2.2.0 user-agents~=2.2.0
numpy~=2.2.5 numpy~=2.3.4
docxtpl~=0.20.0 docxtpl~=0.20.1
python-docx~=1.1.2 python-docx~=1.2.0
Jinja2~=3.1.6 Jinja2~=3.1.6
django-redis~=5.4.0 django-redis~=6.0.0
pandas~=2.2.3 pandas~=2.3.3
beautifulsoup4~=4.13.4 beautifulsoup4~=4.14.2
python-dateutil~=2.9.0.post0 python-dateutil~=2.9.0.post0
redis~=6.1.0 redis~=7.0.1
waitress~=3.0.2 waitress~=3.0.2
django-shortuuidfield~=0.1.3 django-shortuuidfield~=0.1.3
lizard~=1.17.30 lizard~=1.19.0
Pygments~=2.19.1 Pygments~=2.19.2
pydash~=8.0.5 pydash~=8.0.5

View File

@@ -1,4 +0,0 @@
import pydash as _
res = _.compact([1, 2, 3, 0, False, ""])
print(res)

View File

@@ -1,4 +0,0 @@
#os.system(command)
import os,time
os.system("git pull")
os.system("pause")

View File

@@ -1,7 +0,0 @@
#os.system(command)
import os,time
comment = input('请输入提交的标记名称:')
os.system("git add .")
os.system(f"git commit -m {comment}")
os.system("git push origin main --force")
os.system("pause")