Files
cdtestplant_v1/apps/dict/controllers/fragment.py

97 lines
3.5 KiB
Python
Raw Normal View History

2025-04-29 18:09:00 +08:00
from typing import List,Optional
from ninja_extra import api_controller, ControllerBase, route
from ninja import Schema, Field, Query, ModelSchema
from ninja.errors import HttpError
from ninja_jwt.authentication import JWTAuth
from ninja_extra.permissions import IsAuthenticated
from pydantic import model_validator
# 小工具函数
from utils.smallTools.interfaceTools import model_retrieve
from ninja.pagination import paginate
from utils.chen_pagination import MyPagination
from utils.chen_crud import updateWithoutRequestParam, multi_delete, createWithOutRequestParam
# ORM模型
from apps.dict.models import Fragment
# Schemas
## 查询fragment的输入
class FragementListSchema(Schema):
name: Optional[str] = None # 片段名称
is_main: Optional[bool] = None # 是否替换磁盘的片段
project_id: int = Field(None, alias='projectId')
## 查询结果
class FragmentOutSchema(ModelSchema):
class Meta:
model = Fragment
fields = ['id', 'name', 'project', 'is_main', 'content']
## 新增
class FragmentAddSchema(Schema):
name: str # 必填
is_main: bool = False # 后端直接设置为False
project_id: int = Field(None, alias='projectId')
content: str = ""
# username判重
@model_validator(mode='after')
def unique_name(self):
if Fragment.objects.filter(name=self.name, project_id=self.project_id).exists():
raise HttpError(400, "文档片段名称重复")
return self
## 更新文档片段
class FragmentUpdateSchema(Schema):
name: Optional[str] = None
is_main: Optional[bool] = None
project_id: int = Field(None, alias='projectId')
content: str = Field(None, alias='content')
def validate_unique_update_fragName(self, id: int):
frag_filters = Fragment.objects.filter(name=self.name)
if len(frag_filters) > 1:
raise HttpError(400, "文档片段名称重复")
elif len(frag_filters) == 1:
if frag_filters[0].id == id:
return
else:
raise HttpError(400, "文档片段名称重复")
else:
return
# 删除schema
class FragmentDeleteSchema(Schema):
ids: List[int]
# 全局静态变量
PIC_URL_PREFIX = "/uploads/"
# Controller
@api_controller("/system/userField", tags=['文档片段'], auth=JWTAuth(), permissions=[IsAuthenticated])
class UserFiledController(ControllerBase):
@route.get("/getFragment", response=List[FragmentOutSchema], url_name='fragment-list')
@paginate(MyPagination)
def get_fragement(self, condition: Query[FragementListSchema]):
fragment_qs = Fragment.objects.filter(project_id=condition.project_id)
res_qs = model_retrieve(condition, fragment_qs, ['project_id', 'is_main'])
res_qs = res_qs.filter(project_id=condition.project_id)
return res_qs
@route.post("/add", url_name='fragment-add', response=FragmentOutSchema)
def add_fragement(self, data: FragmentAddSchema):
return createWithOutRequestParam(data, Fragment)
@route.delete("/delete", url_name="fragment-delete")
def delete_fragment(self, data: FragmentDeleteSchema):
try:
multi_delete(data.ids, Fragment)
except Exception:
raise HttpError(500, "删除失败")
@route.put("/update/{int:id}", url_name='fragment-update')
def update_fragment(self, id: int, data: FragmentUpdateSchema):
update_obj = updateWithoutRequestParam(id, data, Fragment)
if update_obj:
return '更新成功'
raise HttpError(500, "设置替换磁盘文件渲染失败")