departments.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from uuid import UUID
  2. from fastapi import APIRouter, Depends, HTTPException
  3. from sqlalchemy import select
  4. from sqlalchemy.ext.asyncio import AsyncSession
  5. from backend.app.core.dependencies import require_any_permissions, require_permissions
  6. from backend.app.db.session import get_db
  7. from backend.app.models import Department, User
  8. from backend.app.schemas.department import DepartmentCreate, DepartmentResponse, DepartmentUpdate
  9. router = APIRouter(prefix="/departments", tags=["departments"])
  10. def is_limited_scope(user: User) -> bool:
  11. return user.role and user.role.name not in {"管理员", "排班员"}
  12. @router.get("", response_model=list[DepartmentResponse])
  13. async def list_departments(
  14. db: AsyncSession = Depends(get_db),
  15. current_user: User = Depends(require_any_permissions(["users.view", "schedule.view"])),
  16. ):
  17. query = select(Department)
  18. if is_limited_scope(current_user):
  19. if current_user.dept_id:
  20. query = query.where(Department.id == current_user.dept_id)
  21. elif current_user.campus_id:
  22. query = query.where(Department.campus_id == current_user.campus_id)
  23. else:
  24. return []
  25. result = await db.execute(query.order_by(Department.name))
  26. return result.scalars().all()
  27. @router.post("", response_model=DepartmentResponse, dependencies=[Depends(require_permissions(["users.edit"]))])
  28. async def create_department(payload: DepartmentCreate, db: AsyncSession = Depends(get_db)):
  29. dept = Department(campus_id=payload.campus_id, name=payload.name)
  30. db.add(dept)
  31. await db.commit()
  32. await db.refresh(dept)
  33. return dept
  34. @router.put("/{dept_id}", response_model=DepartmentResponse, dependencies=[Depends(require_permissions(["users.edit"]))])
  35. async def update_department(dept_id: UUID, payload: DepartmentUpdate, db: AsyncSession = Depends(get_db)):
  36. result = await db.execute(select(Department).where(Department.id == dept_id))
  37. dept = result.scalar_one_or_none()
  38. if not dept:
  39. raise HTTPException(status_code=404, detail="科室不存在")
  40. dept.campus_id = payload.campus_id
  41. dept.name = payload.name
  42. await db.commit()
  43. await db.refresh(dept)
  44. return dept
  45. @router.delete("/{dept_id}", dependencies=[Depends(require_permissions(["users.delete"]))])
  46. async def delete_department(dept_id: UUID, db: AsyncSession = Depends(get_db)):
  47. result = await db.execute(select(Department).where(Department.id == dept_id))
  48. dept = result.scalar_one_or_none()
  49. if not dept:
  50. raise HTTPException(status_code=404, detail="科室不存在")
  51. await db.delete(dept)
  52. await db.commit()
  53. return {"success": True}