You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-System/iti_system/routes/dept.py

71 lines
2.6 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Depends
from sqlalchemy import select
from sqlalchemy.orm import Session
from iti.auth import require_permission
from iti.db import get_db
from iti.responses import ok, page
from iti_system.models import SysDept
from iti_system.schemas import DeptCreate, DeptQuery, DeptUpdate
from iti_system.services import apply_keyword, build_tree, dump_dept, get_or_404, paginate_query
router = APIRouter(prefix="/sys/dept", tags=["system.dept"])
@router.get("/list", dependencies=[Depends(require_permission("system:dept:list"))])
def list_dept(query: DeptQuery = Depends(), db: Session = Depends(get_db)):
return ok([dump_dept(dept) for dept in db.scalars(_query_depts(query)).all()])
@router.get("/page", dependencies=[Depends(require_permission("system:dept:list"))])
def page_dept(query: DeptQuery = Depends(), db: Session = Depends(get_db)):
result = paginate_query(db, _query_depts(query), page=query.page, size=query.size)
return page([dump_dept(dept) for dept in result["items"]], result["page"])
@router.get("/tree", dependencies=[Depends(require_permission("system:dept:list"))])
def tree_dept(db: Session = Depends(get_db)):
depts = db.scalars(select(SysDept).order_by(SysDept.sort, SysDept.name)).all()
return ok(build_tree(depts, dump_dept))
@router.post("", dependencies=[Depends(require_permission("system:dept:create"))])
def create_dept(payload: DeptCreate, db: Session = Depends(get_db)):
dept = SysDept(**payload.model_dump())
db.add(dept)
db.commit()
db.refresh(dept)
return ok(dump_dept(dept))
@router.put("/{id}", dependencies=[Depends(require_permission("system:dept:edit"))])
def update_dept(id: str, payload: DeptUpdate, db: Session = Depends(get_db)):
dept = get_or_404(db, SysDept, id, "部门不存在")
for key, value in payload.model_dump(exclude_unset=True).items():
setattr(dept, key, value)
db.commit()
db.refresh(dept)
return ok(dump_dept(dept))
@router.delete("/{id}", dependencies=[Depends(require_permission("system:dept:delete"))])
def delete_dept(id: str, db: Session = Depends(get_db)):
dept = get_or_404(db, SysDept, id, "部门不存在")
db.delete(dept)
db.commit()
return ok()
def _query_depts(query: DeptQuery):
stmt = select(SysDept).order_by(SysDept.sort, SysDept.created_at.desc())
stmt = apply_keyword(stmt, query.keyword, SysDept.name, SysDept.desc)
if query.name:
stmt = stmt.where(SysDept.name.like(f"%{query.name}%"))
if query.status:
stmt = stmt.where(SysDept.status == query.status)
return stmt