2026-05-26 13:21:16 -04:00
|
|
|
"""Routes d'administration reservees au sysadmin."""
|
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
2026-05-31 22:10:09 -04:00
|
|
|
from sqlalchemy import func, select
|
2026-05-26 13:21:16 -04:00
|
|
|
|
|
|
|
|
from app.core.database import get_db
|
|
|
|
|
from app.core.security import get_current_membre, is_sysadmin
|
|
|
|
|
from app.services.admin_database import initialiser_demo, remettre_a_zero
|
2026-05-31 22:10:09 -04:00
|
|
|
from app.models.groupe import Groupe
|
|
|
|
|
from app.models.membre import Membre
|
|
|
|
|
from app.models.reunion import Reunion
|
|
|
|
|
from app.models.historique_modification import HistoriqueModification
|
2026-05-26 13:21:16 -04:00
|
|
|
|
|
|
|
|
router = APIRouter(prefix="/admin", tags=["Administration"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def require_sysadmin(membre=Depends(get_current_membre)):
|
|
|
|
|
if not is_sysadmin(membre):
|
|
|
|
|
raise HTTPException(status_code=403, detail="Réservé au sysadmin")
|
|
|
|
|
return membre
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/reset")
|
|
|
|
|
async def reset_database(
|
|
|
|
|
_sysadmin=Depends(require_sysadmin),
|
|
|
|
|
db: AsyncSession = Depends(get_db),
|
|
|
|
|
):
|
|
|
|
|
return await remettre_a_zero(db)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/demo")
|
|
|
|
|
async def demo_database(
|
|
|
|
|
_sysadmin=Depends(require_sysadmin),
|
|
|
|
|
db: AsyncSession = Depends(get_db),
|
|
|
|
|
):
|
|
|
|
|
return await initialiser_demo(db)
|
2026-05-31 22:10:09 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/groupes")
|
|
|
|
|
async def liste_groupes_admin(
|
|
|
|
|
_sysadmin=Depends(require_sysadmin),
|
|
|
|
|
db: AsyncSession = Depends(get_db),
|
|
|
|
|
):
|
|
|
|
|
groupes = (await db.execute(select(Groupe).order_by(Groupe.nom))).scalars().all()
|
|
|
|
|
out = []
|
|
|
|
|
for groupe in groupes:
|
|
|
|
|
nb_membres = (await db.execute(
|
|
|
|
|
select(func.count()).select_from(Membre).where(Membre.groupe_id == groupe.id)
|
|
|
|
|
)).scalar_one()
|
|
|
|
|
nb_reunions = (await db.execute(
|
|
|
|
|
select(func.count()).select_from(Reunion).where(Reunion.groupe_id == groupe.id)
|
|
|
|
|
)).scalar_one()
|
|
|
|
|
nb_traces = (await db.execute(
|
|
|
|
|
select(func.count()).select_from(HistoriqueModification).where(HistoriqueModification.groupe_id == groupe.id)
|
|
|
|
|
)).scalar_one()
|
|
|
|
|
out.append({
|
|
|
|
|
"id": str(groupe.id),
|
|
|
|
|
"nom": groupe.nom,
|
|
|
|
|
"district": groupe.district,
|
|
|
|
|
"region": groupe.region,
|
|
|
|
|
"adresse_local": groupe.adresse_local,
|
|
|
|
|
"jour_reunion": groupe.jour_reunion,
|
|
|
|
|
"heure_reunion": groupe.heure_reunion.strftime("%H:%M") if groupe.heure_reunion else None,
|
|
|
|
|
"assemblee_affaires_ordre": groupe.assemblee_affaires_ordre,
|
|
|
|
|
"format_reunion": groupe.format_reunion,
|
|
|
|
|
"cree_le": groupe.cree_le,
|
|
|
|
|
"membres": nb_membres,
|
|
|
|
|
"reunions": nb_reunions,
|
|
|
|
|
"traces": nb_traces,
|
|
|
|
|
})
|
|
|
|
|
return out
|