diff --git a/backend/app/services/admin_database.py b/backend/app/services/admin_database.py index 8d2653f..37ba7c8 100644 --- a/backend/app/services/admin_database.py +++ b/backend/app/services/admin_database.py @@ -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()} diff --git a/frontend/src/pages/Profil.jsx b/frontend/src/pages/Profil.jsx index 916ce33..c9b4ae0 100644 --- a/frontend/src/pages/Profil.jsx +++ b/frontend/src/pages/Profil.jsx @@ -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() {
- 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.