"""CRUD des postes.""" import uuid from fastapi import APIRouter, Depends, Response, status from sqlmodel import Session, select from app.api._common import owned_or_404 from app.api.deps import get_edition from app.api.schemas import PositionCreate, PositionRead, PositionUpdate from app.auth.deps import ( current_account_in_edition, ensure_can_write_position, require_coordinator, require_staff, ) from app.db import get_session from app.models import Account, Edition, Position router = APIRouter( prefix="/editions/{edition_id}/positions", tags=["positions"] ) @router.post("", response_model=PositionRead, status_code=status.HTTP_201_CREATED) def create_position( payload: PositionCreate, edition: Edition = Depends(get_edition), _guard: Account = Depends(require_coordinator), session: Session = Depends(get_session), ) -> Position: position = Position(edition_id=edition.id, **payload.model_dump()) session.add(position) session.commit() session.refresh(position) return position @router.get("", response_model=list[PositionRead]) def list_positions( edition: Edition = Depends(get_edition), _guard: Account = Depends(require_staff), session: Session = Depends(get_session), ) -> list[Position]: return list( session.exec( select(Position) .where(Position.edition_id == edition.id) .order_by(Position.name) ) ) @router.get("/{position_id}", response_model=PositionRead) def get_position( position_id: uuid.UUID, edition: Edition = Depends(get_edition), _guard: Account = Depends(require_staff), session: Session = Depends(get_session), ) -> Position: return owned_or_404(session.get(Position, position_id), edition.id) @router.patch("/{position_id}", response_model=PositionRead) def update_position( position_id: uuid.UUID, payload: PositionUpdate, edition: Edition = Depends(get_edition), account: Account = Depends(current_account_in_edition), session: Session = Depends(get_session), ) -> Position: position = owned_or_404(session.get(Position, position_id), edition.id) ensure_can_write_position(account, position) for field, value in payload.model_dump(exclude_unset=True).items(): setattr(position, field, value) session.commit() session.refresh(position) return position @router.delete("/{position_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_position( position_id: uuid.UUID, edition: Edition = Depends(get_edition), _guard: Account = Depends(require_coordinator), session: Session = Depends(get_session), ) -> Response: position = owned_or_404(session.get(Position, position_id), edition.id) session.delete(position) session.commit() return Response(status_code=status.HTTP_204_NO_CONTENT)