添加主题列表增删改查,主题文件模板增删改查,主题文件上传修改接口
This commit is contained in:
parent
b1fa11fc9f
commit
65e1d6c84e
|
@ -102,3 +102,5 @@ email_tool = EmailTool(**dict(conf['email_tool']))
|
|||
|
||||
# 邮箱验证码工具类
|
||||
email_verify_code = EmailVerifyCode(redis_pool, email_tool)
|
||||
|
||||
static_path = Path('static')
|
||||
|
|
|
@ -5,7 +5,7 @@ from random import random
|
|||
from typing import Set
|
||||
from sqlalchemy import String, DateTime, func, Boolean, JSON, ForeignKey, Enum, TEXT, Double, Integer, create_engine
|
||||
from sqlalchemy.orm import mapped_column, Mapped, declarative_base, relationship
|
||||
from mods.rate.schemas import ReceiveSubjectState, ReceiveOrderState, NoticeType
|
||||
from .schemas import ReceiveSubjectState, ReceiveOrderState, NoticeType
|
||||
from utils.random_utils import get_random_letter_and_num_code, get_random_num_code, time_now_to_code
|
||||
from utils.sqlalchemy_common_utils import SalBase
|
||||
from .common import Base
|
||||
|
@ -23,8 +23,7 @@ class ReceiveSubjectFile(Base, SalBase):
|
|||
"""
|
||||
__tablename__ = "receive_subject_file"
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment='id')
|
||||
subject_id: Mapped[int] = mapped_column(ForeignKey("receive_subject.id", ondelete="CASCADE", onupdate="CASCADE"),
|
||||
comment="主题ID", nullable=False)
|
||||
subject_id: Mapped[int] = mapped_column(ForeignKey("receive_subject.id", ondelete="CASCADE", onupdate="CASCADE"),comment="主题ID", nullable=False)
|
||||
name: Mapped[str] = mapped_column(String(255), nullable=False, comment='名称')
|
||||
type: Mapped[str] = mapped_column(String(255), nullable=False, comment='类型')
|
||||
des: Mapped[str] = mapped_column(TEXT, nullable=True, comment='说明')
|
||||
|
@ -39,6 +38,7 @@ class ReceiveSubject(Base, SalBase):
|
|||
__tablename__ = "receive_subject"
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment='主题ID')
|
||||
name: Mapped[str] = mapped_column(String(255), nullable=False, unique=True, comment='主题名称')
|
||||
receiver: Mapped[str] = mapped_column(String(255), nullable=False, comment='接收人')
|
||||
start_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), nullable=True,
|
||||
comment='开始时间')
|
||||
finish_time: Mapped[datetime] = mapped_column(DateTime, nullable=True,
|
||||
|
|
|
@ -10,14 +10,15 @@ class ReceiveSubjectId(BaseModel):
|
|||
|
||||
|
||||
class ReceiveSubjectAdd(BaseModel):
|
||||
name: str
|
||||
start_time: Optional[datetime]= None
|
||||
finish_time: Optional[datetime]= None
|
||||
state: Any
|
||||
folder_name: Optional[str]= None
|
||||
create_time: Optional[datetime]= None
|
||||
des: Any
|
||||
files: Optional[List[Any]]= None
|
||||
name: str
|
||||
start_time: Optional[datetime] = None
|
||||
finish_time: Optional[datetime] = None
|
||||
receiver: str
|
||||
state: Any
|
||||
folder_name: Optional[str] = None
|
||||
create_time: Optional[datetime] = None
|
||||
des: Any
|
||||
files: Optional[List[Any]] = None
|
||||
|
||||
|
||||
class ReceiveSubjectAddOptional(ReceiveSubjectAdd, metaclass=AllOptional):
|
||||
|
|
|
@ -34,3 +34,4 @@ def receive_subject_file_get(db: Session, data: schemas.ReceiveSubjectFileId) ->
|
|||
def receive_subject_file_all(db: Session):
|
||||
return db.query(ReceiveSubjectFile).all()
|
||||
|
||||
|
||||
|
|
|
@ -1,9 +1,14 @@
|
|||
from fastapi import APIRouter, Depends, HTTPException
|
||||
import json
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Form
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from context.common import static_path
|
||||
from ...common import get_db
|
||||
from . import crud
|
||||
from . import schemas
|
||||
from ...models import ReceiveSubject
|
||||
from ...utils import get_upload_file_type, file_upload
|
||||
|
||||
router = APIRouter(tags=["主题文件模板"], prefix='/receive_subject_file')
|
||||
|
||||
|
@ -43,11 +48,34 @@ def receive_subject_file_query(req: schemas.ReceiveSubjectFileQueryReq, db: Sess
|
|||
return schemas.ReceiveSubjectFileQueryRes(count=count, items=items)
|
||||
|
||||
|
||||
@router.post("/all", summary="获取所有主题文件模板", response_model=schemas.ReceiveSubjectFileAllRes)
|
||||
def receive_subject_file_all(req: schemas.ReceiveSubjectFileAllReq, db: Session = Depends(get_db)):
|
||||
query = crud.receive_subject_file_all(db)
|
||||
items = [schemas.ReceiveSubjectFileInfo(**item.to_full_dict(include=req.include,
|
||||
ex_include=req.ex_include,
|
||||
relation_use_id=req.relation_use_id)) for item in query]
|
||||
return schemas.ReceiveSubjectFileAllRes(items=items)
|
||||
@router.post("/add_with_file", summary="添加主题文件模板附带文件")
|
||||
def receive_subject_file_add_with_file(file: UploadFile = File(...), data: str = Form(...),
|
||||
db: Session = Depends(get_db)):
|
||||
file_type = get_upload_file_type(file)
|
||||
data = json.loads(data)
|
||||
data['template_path'] = ''
|
||||
data['type'] = file_type
|
||||
req = schemas.ReceiveSubjectFileAddReq(**data)
|
||||
subject: ReceiveSubject = db.query(ReceiveSubject).filter(ReceiveSubject.id == req.D).first()
|
||||
folder_name = subject.folder_name
|
||||
file_path = file_upload(file, static_path / folder_name, db)
|
||||
req.template_path = file_path
|
||||
item = crud.receive_subject_file_add(db, req)
|
||||
return schemas.ReceiveSubjectFileAddRes(**item.to_dict())
|
||||
|
||||
|
||||
@router.post("/update_file", summary="修改主题文件模板附带文件")
|
||||
def receive_subject_file_update_file(file: UploadFile = File(...), data: str = Form(...),
|
||||
db: Session = Depends(get_db)):
|
||||
data = json.loads(data)
|
||||
file_type = get_upload_file_type(file)
|
||||
req = schemas.ReceiveSubjectFileUpdate(
|
||||
**{'id': data['id'], 'template_path': '', 'type': file_type, 'subject_id': data['subject_id']})
|
||||
subject: ReceiveSubject = db.query(ReceiveSubject).filter(ReceiveSubject.id == req.subject_id).first()
|
||||
folder_name = subject.folder_name
|
||||
file_path = file_upload(file, static_path / folder_name, db)
|
||||
req.template_path = file_path
|
||||
item = crud.receive_subject_file_update(db, req)
|
||||
return schemas.ReceiveSubjectFileUpdateRes(**item.to_dict())
|
||||
|
||||
#########
|
||||
|
|
|
@ -12,7 +12,7 @@ class ReceiveSubjectFileId(BaseModel):
|
|||
class ReceiveSubjectFileAdd(BaseModel):
|
||||
name: str
|
||||
subject_id: int
|
||||
type: str
|
||||
type: Optional[str] = None
|
||||
des: Any
|
||||
template_path: Optional[str] = None
|
||||
file_size_limit: Optional[float] = None
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,28 +1,28 @@
|
|||
from enum import Enum
|
||||
|
||||
|
||||
class RateServeState(Enum):
|
||||
class ReceiveSubjectState(Enum):
|
||||
"""
|
||||
评级服务状态类型
|
||||
接收主题状态
|
||||
"""
|
||||
examining = 'examining' # 审核中
|
||||
rating = 'rating' # 评级中
|
||||
cancel = 'cancel' # 取消
|
||||
receiving = 'receiving' # 接收种
|
||||
examining = 'examining' # 处理种
|
||||
finish = 'finish' # 完成
|
||||
|
||||
|
||||
class NodeState(Enum):
|
||||
class ReceiveOrderState(Enum):
|
||||
"""
|
||||
节点状态
|
||||
接收主题状态
|
||||
"""
|
||||
incomplete = "incomplete" # 未完成
|
||||
finish = "finish" # 完成
|
||||
receiving = 'receiving' # 接收种
|
||||
examining = 'examining' # 处理种
|
||||
finish = 'finish' # 完成
|
||||
|
||||
|
||||
class FileSubType:
|
||||
class NoticeType(Enum):
|
||||
"""
|
||||
文件分类,不使用Enum,因为类型不限制
|
||||
通知类型
|
||||
"""
|
||||
report = 'report' # 报告
|
||||
cert = 'cert' # 证书
|
||||
fill_sheet = 'fill_sheet' # 企业填报文件
|
||||
phone = 'phone'
|
||||
email = 'email'
|
||||
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from fastapi import UploadFile
|
||||
from sqlalchemy.orm import Session
|
||||
from mimetypes import types_map
|
||||
|
||||
from utils.common_utils import file_md5
|
||||
|
||||
types_map['.xlsx'] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||
types_map['.docx'] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
|
||||
types_dic = {key[1:]: item for key, item in types_map.items()}
|
||||
types_dic_rev = {item: key[1:] for key, item in types_map.items()}
|
||||
|
||||
|
||||
def get_upload_file_type(file: UploadFile, ):
|
||||
file_type = types_dic_rev.get(file.content_type)
|
||||
return file_type
|
||||
|
||||
|
||||
def file_upload(file: UploadFile, save_path: str, db: Session, user_id=None, sub_type=''):
|
||||
content = b""
|
||||
while True:
|
||||
byte = file.file.read(10240)
|
||||
if byte:
|
||||
content += byte
|
||||
else:
|
||||
break
|
||||
content_type = file.content_type
|
||||
file_type = get_upload_file_type(file)
|
||||
common_type, _ = content_type.split('/')
|
||||
content_start = content[0:10240]
|
||||
file_md = file_md5(content_start)
|
||||
file_save_name = file_md + f".{file_type}"
|
||||
save_path = Path(save_path)
|
||||
file_save_path = save_path / file_save_name
|
||||
file_url = file_save_path.__str__()
|
||||
if not os.path.exists(save_path):
|
||||
os.makedirs(save_path)
|
||||
if not os.path.exists(file_save_path):
|
||||
with open(file_save_path, 'wb') as f:
|
||||
f.write(content)
|
||||
return file_url
|
Loading…
Reference in New Issue