groupe-meditation/backend/app/routers/calendrier.py
Daniel Allaire 393f9243cb Renforcer isolation multi-tenant
- scoper les postes et permissions par groupe

- retirer les lectures district du calendrier, des evenements et anniversaires

- documenter les regles d isolation multi-groupe
2026-05-31 18:12:26 -04:00

95 lines
3.1 KiB
Python

"""Routes C2 — Calendrier du groupe."""
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from app.core.database import get_db
from app.core.security import get_current_membre
from app.models.groupe import Groupe
from app.models.affectation import Affectation
from app.models.poste import Poste
from app.models.membre import Membre
from app.schemas.phase2 import CalendrierEntry
router = APIRouter(prefix="/calendrier", tags=["C2 — Calendrier"])
@router.get("/", response_model=list[CalendrierEntry])
async def calendrier_groupe_courant(
membre=Depends(get_current_membre),
db: AsyncSession = Depends(get_db),
):
"""C2 — Calendrier des serviteurs du groupe courant."""
groupe = await db.get(Groupe, membre.groupe_id)
if not groupe:
return []
result = await db.execute(
select(Affectation).where(
Affectation.groupe_id == membre.groupe_id,
Affectation.statut == "actif",
)
)
affectations = result.scalars().all()
entries = []
for a in affectations:
poste = await db.get(Poste, a.poste_id)
mbr = await db.get(Membre, a.membre_id)
if poste and poste.groupe_id == membre.groupe_id and mbr and mbr.groupe_id == membre.groupe_id:
entries.append(CalendrierEntry(
groupe_nom=groupe.nom,
groupe_id=groupe.id,
jour_reunion=groupe.jour_reunion,
poste_nom=poste.nom,
membre_prenom=mbr.prenom,
date_debut=a.date_debut,
))
entries.sort(key=lambda e: (e.groupe_nom, e.poste_nom))
return entries
@router.get("/groupe/{groupe_id}")
async def calendrier_groupe(
groupe_id: str,
membre=Depends(get_current_membre),
db: AsyncSession = Depends(get_db),
):
"""Détail des serviteurs du groupe courant uniquement."""
if str(groupe_id) != str(membre.groupe_id):
return {"groupe": None, "serviteurs": []}
groupe = await db.get(Groupe, membre.groupe_id)
if not groupe:
return {"groupe": None, "serviteurs": []}
result = await db.execute(
select(Affectation).where(
Affectation.groupe_id == membre.groupe_id,
Affectation.statut == "actif",
)
)
affectations = result.scalars().all()
serviteurs = []
for a in affectations:
poste = await db.get(Poste, a.poste_id)
mbr = await db.get(Membre, a.membre_id)
if poste and poste.groupe_id == membre.groupe_id and mbr and mbr.groupe_id == membre.groupe_id:
serviteurs.append({
"poste": poste.nom,
"categorie": poste.categorie,
"prenom": mbr.prenom,
"depuis": str(a.date_debut),
})
serviteurs.sort(key=lambda s: s.get("poste", ""))
return {
"groupe": {
"id": str(groupe.id),
"nom": groupe.nom,
"jour_reunion": groupe.jour_reunion,
"adresse": groupe.adresse_local,
},
"serviteurs": serviteurs,
}