新增:静态、动态环境内容
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -14,9 +14,10 @@ from ninja.errors import HttpError
|
||||
from ninja import Query
|
||||
from utils.chen_response import ChenResponse
|
||||
from utils.chen_crud import create, multi_delete_project
|
||||
from apps.project.models import Project, Round, ProjectSoftSummary, StuctSortData
|
||||
from apps.project.models import Project, Round, ProjectSoftSummary, StuctSortData, StaticSoftItem, StaticSoftHardware, DynamicSoftTable, \
|
||||
DynamicHardwareTable
|
||||
from apps.project.schemas.project import ProjectRetrieveSchema, ProjectFilterSchema, ProjectCreateInput, \
|
||||
DeleteSchema, SoftSummarySchema, DataSchema
|
||||
DeleteSchema, SoftSummarySchema, DataSchema, StaticDynamicData
|
||||
from utils.util import get_str_dict
|
||||
# 时间处理模块
|
||||
from apps.project.tool.timeList import time_return_to
|
||||
@@ -277,6 +278,10 @@ class ProjectController(ControllerBase):
|
||||
all_status = {
|
||||
"soft_summary": False,
|
||||
"interface_image": False,
|
||||
"static_soft_item": False,
|
||||
"static_soft_hardware": False,
|
||||
"dynamic_soft_item": False,
|
||||
"dynamic_soft_hardware": False,
|
||||
}
|
||||
# 1.查看软件概述是否填写
|
||||
project_obj = self.get_project_by_id(id)
|
||||
@@ -289,6 +294,22 @@ class ProjectController(ControllerBase):
|
||||
image_qs = StuctSortData.objects.filter(project=project_obj)
|
||||
if image_qs.exists():
|
||||
all_status['interface_image'] = True
|
||||
# 3.查看静态软件项是否填写
|
||||
static_item_qs = StaticSoftItem.objects.filter(project=project_obj)
|
||||
if static_item_qs.exists():
|
||||
all_status['static_soft_item'] = True
|
||||
# 4.静态硬件项
|
||||
static_hardware_qs = StaticSoftHardware.objects.filter(project=project_obj)
|
||||
if static_hardware_qs.exists():
|
||||
all_status['static_soft_hardware'] = True
|
||||
# 5.动态软件项
|
||||
dynamic_soft_item_qs = DynamicSoftTable.objects.filter(project=project_obj)
|
||||
if dynamic_soft_item_qs.exists():
|
||||
all_status['dynamic_soft_item'] = True
|
||||
# 5.动态软件项
|
||||
dynamic_hardware_qs = DynamicHardwareTable.objects.filter(project=project_obj)
|
||||
if dynamic_hardware_qs.exists():
|
||||
all_status['dynamic_soft_hardware'] = True
|
||||
return ChenResponse(status=200, code=20000, data=all_status, message='查询成功')
|
||||
|
||||
@classmethod
|
||||
@@ -351,7 +372,7 @@ class ProjectController(ControllerBase):
|
||||
"content": item.content,
|
||||
"fontnote": item.fontnote,
|
||||
} for item in dataSchem_qs])
|
||||
return ChenResponse(status=200, code=25002, data=None)
|
||||
return ChenResponse(status=200, code=25002, data=[])
|
||||
|
||||
# ~~~接口图新增或修改~~~
|
||||
@route.post("/interface_image/")
|
||||
@@ -361,9 +382,7 @@ class ProjectController(ControllerBase):
|
||||
image_qs = StuctSortData.objects.filter(project=project_obj)
|
||||
if image_qs.exists():
|
||||
image_qs.delete()
|
||||
self.bulk_create_data_schemas(project_obj, [dataSchema])
|
||||
else:
|
||||
self.bulk_create_data_schemas(project_obj, [dataSchema])
|
||||
self.bulk_create_data_schemas(project_obj, [dataSchema])
|
||||
|
||||
# ~~~接口图-获取数据~~~
|
||||
@route.get("/get_interface_image/", response=DataSchema)
|
||||
@@ -380,3 +399,36 @@ class ProjectController(ControllerBase):
|
||||
"fontnote": image_obj.fontnote,
|
||||
})
|
||||
return ChenResponse(status=200, code=25002, data=None)
|
||||
|
||||
@classmethod
|
||||
def get_model_from_category(cls, category: str):
|
||||
mapDict = {
|
||||
'静态软件项': StaticSoftItem,
|
||||
'静态硬件项': StaticSoftHardware,
|
||||
'动态软件项': DynamicSoftTable,
|
||||
'动态硬件项': DynamicHardwareTable
|
||||
}
|
||||
return mapDict[category]
|
||||
|
||||
# ~~~静态软件项、静态硬件项、动态软件项、动态硬件项 - 获取~~~
|
||||
@route.get("/get_static_dynamic_items/")
|
||||
def get_static_dynamic_items(self, id: int, category: str):
|
||||
project_obj = self.get_project_by_id(id)
|
||||
item_qs = self.get_model_from_category(category).objects.filter(project=project_obj)
|
||||
if item_qs.exists():
|
||||
item_obj = item_qs.first()
|
||||
return ChenResponse(status=200, code=25001, data={"table": item_obj.table, "fontnote": item_obj.fontnote})
|
||||
return ChenResponse(status=200, code=25002, data=None)
|
||||
|
||||
# ~~~静态软件项、静态硬件项、动态软件项、动态硬件项 - 新增或修改~~~
|
||||
@route.post("/post_static_dynamic_item/")
|
||||
@transaction.atomic
|
||||
def post_static_dynamic_item(self, data: StaticDynamicData):
|
||||
print(data)
|
||||
project_obj = self.get_project_by_id(data.id)
|
||||
model = self.get_model_from_category(data.category)
|
||||
item_qs = model.objects.filter(project=project_obj)
|
||||
if item_qs.exists():
|
||||
# 如果存在则修改
|
||||
item_qs.delete()
|
||||
model.objects.create(project=project_obj, table=data.table, fontnote=data.fontnote)
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# Generated by Django 6.0.2 on 2026-02-05 09:45
|
||||
|
||||
import apps.project.models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('project', '0021_alter_stuctsortdata_project'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='DynamicHardwareTable',
|
||||
fields=[
|
||||
('project', models.OneToOneField(db_constraint=False, help_text='关联项目', on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='dynamic_hardware', serialize=False, to='project.project', verbose_name='关联项目')),
|
||||
('table', models.JSONField(default=apps.project.models.default_json_value, help_text='储存表格二维数组', verbose_name='储存表格二维数组')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '动态硬件项表',
|
||||
'verbose_name_plural': '动态硬件项表',
|
||||
'db_table': 'project_dynamic_hardware',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DynamicSoftTable',
|
||||
fields=[
|
||||
('project', models.OneToOneField(db_constraint=False, help_text='关联项目', on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='dynamic_soft_item', serialize=False, to='project.project', verbose_name='关联项目')),
|
||||
('table', models.JSONField(default=apps.project.models.default_json_value, help_text='储存表格二维数组', verbose_name='储存表格二维数组')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '动态软件项表',
|
||||
'verbose_name_plural': '动态软件项表',
|
||||
'db_table': 'project_dynamic_soft_item',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='StaticSoftHardware',
|
||||
fields=[
|
||||
('project', models.OneToOneField(db_constraint=False, help_text='关联项目', on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='static_hardware', serialize=False, to='project.project', verbose_name='关联项目')),
|
||||
('table', models.JSONField(default=apps.project.models.default_json_value, help_text='储存表格二维数组', verbose_name='储存表格二维数组')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '静态硬件项表',
|
||||
'verbose_name_plural': '静态硬件项表',
|
||||
'db_table': 'project_static_hardware',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='StaticSoftItem',
|
||||
fields=[
|
||||
('project', models.OneToOneField(db_constraint=False, help_text='关联项目', on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='static_soft_item', serialize=False, to='project.project', verbose_name='关联项目')),
|
||||
('table', models.JSONField(default=apps.project.models.default_json_value, help_text='储存表格二维数组', verbose_name='储存表格二维数组')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '静态软件项表',
|
||||
'verbose_name_plural': '静态软件项表',
|
||||
'db_table': 'project_static_soft_item',
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,33 @@
|
||||
# Generated by Django 6.0.2 on 2026-02-05 11:10
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('project', '0022_dynamichardwaretable_dynamicsofttable_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='dynamichardwaretable',
|
||||
name='fontnote',
|
||||
field=models.CharField(default='', help_text='数据的题注说明', max_length=256, null=True, verbose_name='题注'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='dynamicsofttable',
|
||||
name='fontnote',
|
||||
field=models.CharField(default='', help_text='数据的题注说明', max_length=256, null=True, verbose_name='题注'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='staticsofthardware',
|
||||
name='fontnote',
|
||||
field=models.CharField(default='', help_text='数据的题注说明', max_length=256, null=True, verbose_name='题注'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='staticsoftitem',
|
||||
name='fontnote',
|
||||
field=models.CharField(default='', help_text='数据的题注说明', max_length=256, null=True, verbose_name='题注'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,30 @@
|
||||
# Generated by Django 6.0.2 on 2026-02-05 17:48
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('project', '0023_dynamichardwaretable_fontnote_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ProjectDynamicDescription',
|
||||
fields=[
|
||||
('project', models.OneToOneField(db_constraint=False, help_text='关联项目', on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='dynamic_des', serialize=False, to='project.project', verbose_name='关联项目')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '动态环境描述',
|
||||
'verbose_name_plural': '动态环境描述',
|
||||
'db_table': 'project_dynamic_description',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='stuctsortdata',
|
||||
name='dynamic_description',
|
||||
field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='data_schemas', to='project.projectdynamicdescription', verbose_name='所属动态环境描述'),
|
||||
),
|
||||
]
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -466,6 +466,9 @@ class Contact(CoreModel):
|
||||
ordering = ('create_datetime',)
|
||||
|
||||
# ~~~~~2024年2月27日新增~~~~~
|
||||
def default_json_value():
|
||||
return ""
|
||||
|
||||
class Abbreviation(models.Model):
|
||||
objects = models.Manager()
|
||||
title = models.CharField(max_length=64, verbose_name="缩略语", help_text="缩略语")
|
||||
@@ -489,8 +492,64 @@ class ProjectSoftSummary(models.Model):
|
||||
verbose_name = "软件概述表"
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
def default_json_value():
|
||||
return ""
|
||||
# 一对一项目model:动态测试环境描述
|
||||
class ProjectDynamicDescription(models.Model):
|
||||
project = models.OneToOneField(to="Project", primary_key=True, db_constraint=False, related_name="dynamic_des", on_delete=models.CASCADE,
|
||||
verbose_name="关联项目", help_text="关联项目")
|
||||
|
||||
class Meta:
|
||||
db_table = 'project_dynamic_description'
|
||||
verbose_name = "动态环境描述"
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
# 一对一项目model:静态软件项表
|
||||
class StaticSoftItem(models.Model):
|
||||
project = models.OneToOneField(to="Project", primary_key=True, db_constraint=False, related_name="static_soft_item", on_delete=models.CASCADE,
|
||||
verbose_name="关联项目", help_text="关联项目")
|
||||
table = models.JSONField(verbose_name="储存表格二维数组", help_text="储存表格二维数组", default=default_json_value)
|
||||
fontnote = models.CharField(max_length=256, null=True, default="", verbose_name="题注", help_text="数据的题注说明")
|
||||
|
||||
class Meta:
|
||||
db_table = 'project_static_soft_item'
|
||||
verbose_name = "静态软件项表"
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
# 一对一项目model:静态硬件项表
|
||||
class StaticSoftHardware(models.Model):
|
||||
project = models.OneToOneField(to="Project", primary_key=True, db_constraint=False, related_name="static_hardware", on_delete=models.CASCADE,
|
||||
verbose_name="关联项目", help_text="关联项目")
|
||||
table = models.JSONField(verbose_name="储存表格二维数组", help_text="储存表格二维数组", default=default_json_value)
|
||||
fontnote = models.CharField(max_length=256, null=True, default="", verbose_name="题注", help_text="数据的题注说明")
|
||||
|
||||
class Meta:
|
||||
db_table = 'project_static_hardware'
|
||||
verbose_name = "静态硬件项表"
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
# 一对一项目model:动态软件项表
|
||||
class DynamicSoftTable(models.Model):
|
||||
project = models.OneToOneField(to="Project", primary_key=True, db_constraint=False, related_name="dynamic_soft_item", on_delete=models.CASCADE,
|
||||
verbose_name="关联项目", help_text="关联项目")
|
||||
table = models.JSONField(verbose_name="储存表格二维数组", help_text="储存表格二维数组", default=default_json_value)
|
||||
fontnote = models.CharField(max_length=256, null=True, default="", verbose_name="题注", help_text="数据的题注说明")
|
||||
|
||||
class Meta:
|
||||
db_table = 'project_dynamic_soft_item'
|
||||
verbose_name = "动态软件项表"
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
# 一对一项目model:动态硬件项
|
||||
class DynamicHardwareTable(models.Model):
|
||||
project = models.OneToOneField(to="Project", primary_key=True, db_constraint=False, related_name="dynamic_hardware", on_delete=models.CASCADE,
|
||||
verbose_name="关联项目", help_text="关联项目")
|
||||
|
||||
table = models.JSONField(verbose_name="储存表格二维数组", help_text="储存表格二维数组", default=default_json_value)
|
||||
fontnote = models.CharField(max_length=256, null=True, default="", verbose_name="题注", help_text="数据的题注说明")
|
||||
|
||||
class Meta:
|
||||
db_table = 'project_dynamic_hardware'
|
||||
verbose_name = "动态硬件项表"
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
# 结构化排序数据
|
||||
class StuctSortData(CoreModel):
|
||||
@@ -502,7 +561,12 @@ class StuctSortData(CoreModel):
|
||||
on_delete=models.CASCADE, null=True, blank=True)
|
||||
# 接口图
|
||||
project = models.OneToOneField(Project, db_constraint=False, related_name="data_schemas", on_delete=models.CASCADE, null=True, blank=True,
|
||||
verbose_name="该接口图所属的项目")
|
||||
verbose_name="该接口图所属的项目")
|
||||
# 动态环境描述
|
||||
dynamic_description = models.ForeignKey(ProjectDynamicDescription, db_constraint=False, related_name="data_schemas",
|
||||
verbose_name="所属动态环境描述",
|
||||
on_delete=models.CASCADE, null=True, blank=True)
|
||||
|
||||
type = models.CharField(
|
||||
max_length=20,
|
||||
choices=(('text', '文本'), ('table', '表格'), ('image', '图片')),
|
||||
|
||||
Binary file not shown.
@@ -54,4 +54,11 @@ class SoftSummarySchema(Schema):
|
||||
data: list[DataSchema]
|
||||
|
||||
# ~~~软件接口图~~~
|
||||
## 复用DataSchema
|
||||
## 复用DataSchema
|
||||
|
||||
# ~~~静态软件项、静态硬件项、动态软件项、动态硬件项~~~
|
||||
class StaticDynamicData(Schema):
|
||||
id: int
|
||||
category: str
|
||||
table: list[list[str]]
|
||||
fontnote: Optional[str] = ""
|
||||
|
||||
Reference in New Issue
Block a user