Rendre demo non destructive

- creer Groupe Resilience sans remise a zero

- corriger l avertissement sysadmin de demonstration
This commit is contained in:
Daniel Allaire 2026-05-31 20:37:39 -04:00
parent 1ee392e25d
commit 0f69e80c77
2 changed files with 40 additions and 19 deletions

View file

@ -5,7 +5,7 @@ import csv
from datetime import date, datetime, time, timedelta, timezone
from pathlib import Path
from sqlalchemy import text
from sqlalchemy import select, text
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.database import Base
@ -107,18 +107,30 @@ async def remettre_a_zero(db: AsyncSession) -> dict:
async def initialiser_demo(db: AsyncSession) -> dict:
await remettre_a_zero(db)
groupe = await _premier_groupe(db)
membres = await _membres_par_courriel(db)
postes = await _postes_par_nom(db, groupe.id)
litterature = await _litterature(db)
existant = (await db.execute(select(Groupe).where(Groupe.nom == "Groupe Résilience"))).scalar_one_or_none()
if existant:
membres_existants = await _membres_par_courriel(db, existant.id)
return {
"message": "Le groupe de démonstration existe déjà. Aucune donnée existante n'a été modifiée.",
"groupe_id": existant.id,
"membres": len(membres_existants),
"periode_mois": 12,
"rencontres": 52,
"assemblees": 12,
}
groupe, sysadmin, postes, litterature = await _creer_base(
nom_groupe="Groupe Résilience",
adresse_local="Salle communautaire Saint-Louis, Montréal",
)
membres = {sysadmin.courriel: sysadmin}
await _ajouter_membres_demo(db, groupe, membres, postes)
membres = await _membres_par_courriel(db)
membres = await _membres_par_courriel(db, groupe.id)
await _ajouter_historique_demo(db, groupe, membres, postes, litterature)
await db.flush()
return {
"message": "Base remise à zéro et données de démonstration installées",
"message": "Groupe de démonstration installé sans modifier les autres groupes",
"groupe_id": groupe.id,
"membres": len(membres),
"periode_mois": 12,
@ -127,12 +139,16 @@ async def initialiser_demo(db: AsyncSession) -> dict:
}
async def _creer_base(db: AsyncSession):
async def _creer_base(
db: AsyncSession,
nom_groupe: str = "Groupe Méditation",
adresse_local: str = "Salle communautaire, Montréal",
):
groupe = Groupe(
nom="Groupe Résilience",
nom=nom_groupe,
district="87-16",
region="87",
adresse_local="Salle communautaire Saint-Louis, Montréal",
adresse_local=adresse_local,
jour_reunion="mardi",
heure_reunion=time(19, 30),
assemblee_affaires_ordre="premiere",
@ -623,10 +639,13 @@ async def _premier_groupe(db: AsyncSession) -> Groupe:
return result.scalar_one()
async def _membres_par_courriel(db: AsyncSession) -> dict[str, Membre]:
async def _membres_par_courriel(db: AsyncSession, groupe_id=None) -> dict[str, Membre]:
from sqlalchemy import select
result = await db.execute(select(Membre))
query = select(Membre)
if groupe_id is not None:
query = query.where(Membre.groupe_id == groupe_id)
result = await db.execute(query)
return {m.courriel: m for m in result.scalars().all()}

View file

@ -150,17 +150,19 @@ export default function Profil() {
};
const operationAdminBd = async (mode) => {
const libelle = mode === 'demo' ? 'initialiser la base de démonstration' : 'remettre la base à zéro';
const confirmation = window.prompt(`Cette action va ${libelle} et effacer les données actuelles. Tapez CONFIRMER pour continuer.`);
const message = mode === 'demo'
? 'Cette action va créer le groupe de démonstration "Groupe Résilience" sans effacer les groupes existants. Tapez CONFIRMER pour continuer.'
: 'Cette action va remettre la base à zéro et effacer les données actuelles. Tapez CONFIRMER pour continuer.';
const confirmation = window.prompt(message);
if (confirmation !== 'CONFIRMER') return;
setAdminBusy(true);
setError('');
try {
await api.post(mode === 'demo' ? '/admin/demo' : '/admin/reset');
alert(mode === 'demo'
? 'Base de démonstration installée. Reconnectez-vous avec Sysadmin / 0000.'
? 'Groupe de démonstration installé. Vous pouvez le choisir à la page de connexion.'
: 'Base remise à zéro. Reconnectez-vous avec Sysadmin / 0000.');
logout();
if (mode === 'reset') logout();
} catch (e) {
setError(e.message);
} finally {
@ -365,7 +367,7 @@ export default function Profil() {
<div>
<h2 className="font-bold text-red-700">Administration sysadmin</h2>
<p className="text-sm text-gray-500 mt-1">
Ces actions effacent la base courante. Elles recréent le compte Sysadmin avec le PIN 0000.
La remise à zéro efface la base courante. Le groupe de démonstration est ajouté séparément, sans remplacer les données existantes.
</p>
</div>
<button
@ -380,7 +382,7 @@ export default function Profil() {
disabled={adminBusy}
className="w-full min-h-[44px] p-3 bg-aa-blue text-white rounded-xl font-bold disabled:opacity-40"
>
Initialiser une BD de démonstration
Installer le groupe de démonstration
</button>
</div>
)}