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.
71 lines
2.6 KiB
Python
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
|