campuses.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 Campus, Department, User
  8. from backend.app.schemas.campus import CampusCreate, CampusResponse, CampusUpdate
  9. router = APIRouter(prefix="/campuses", tags=["campuses"])
  10. def is_limited_scope(user: User) -> bool:
  11. return user.role and user.role.name not in {"管理员", "排班员"}
  12. @router.get("", response_model=list[CampusResponse])
  13. async def list_campuses(
  14. db: AsyncSession = Depends(get_db),
  15. current_user: User = Depends(require_any_permissions(["users.view", "schedule.view"])),
  16. ):
  17. query = select(Campus)
  18. if is_limited_scope(current_user):
  19. if current_user.campus_id:
  20. query = query.where(Campus.id == current_user.campus_id)
  21. elif current_user.dept_id:
  22. dept_result = await db.execute(select(Department).where(Department.id == current_user.dept_id))
  23. dept = dept_result.scalar_one_or_none()
  24. if dept:
  25. query = query.where(Campus.id == dept.campus_id)
  26. else:
  27. return []
  28. else:
  29. return []
  30. result = await db.execute(query.order_by(Campus.name))
  31. return result.scalars().all()
  32. @router.post("", response_model=CampusResponse, dependencies=[Depends(require_permissions(["users.edit"]))])
  33. async def create_campus(payload: CampusCreate, db: AsyncSession = Depends(get_db)):
  34. campus = Campus(name=payload.name)
  35. db.add(campus)
  36. await db.commit()
  37. await db.refresh(campus)
  38. return campus
  39. @router.put("/{campus_id}", response_model=CampusResponse, dependencies=[Depends(require_permissions(["users.edit"]))])
  40. async def update_campus(campus_id: UUID, payload: CampusUpdate, db: AsyncSession = Depends(get_db)):
  41. result = await db.execute(select(Campus).where(Campus.id == campus_id))
  42. campus = result.scalar_one_or_none()
  43. if not campus:
  44. raise HTTPException(status_code=404, detail="院区不存在")
  45. campus.name = payload.name
  46. await db.commit()
  47. await db.refresh(campus)
  48. return campus
  49. @router.delete("/{campus_id}", dependencies=[Depends(require_permissions(["users.delete"]))])
  50. async def delete_campus(campus_id: UUID, db: AsyncSession = Depends(get_db)):
  51. result = await db.execute(select(Campus).where(Campus.id == campus_id))
  52. campus = result.scalar_one_or_none()
  53. if not campus:
  54. raise HTTPException(status_code=404, detail="院区不存在")
  55. await db.delete(campus)
  56. await db.commit()
  57. return {"success": True}