97 lines
3.5 KiB
Python
97 lines
3.5 KiB
Python
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, "设置替换磁盘文件渲染失败")
|