- scoper les postes et permissions par groupe - retirer les lectures district du calendrier, des evenements et anniversaires - documenter les regles d isolation multi-groupe
95 lines
3.1 KiB
Python
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,
|
|
}
|