Rendre demo non destructive
- creer Groupe Resilience sans remise a zero - corriger l avertissement sysadmin de demonstration
This commit is contained in:
parent
1ee392e25d
commit
0f69e80c77
2 changed files with 40 additions and 19 deletions
|
|
@ -5,7 +5,7 @@ import csv
|
||||||
from datetime import date, datetime, time, timedelta, timezone
|
from datetime import date, datetime, time, timedelta, timezone
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from sqlalchemy import text
|
from sqlalchemy import select, text
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
from app.core.database import Base
|
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:
|
async def initialiser_demo(db: AsyncSession) -> dict:
|
||||||
await remettre_a_zero(db)
|
existant = (await db.execute(select(Groupe).where(Groupe.nom == "Groupe Résilience"))).scalar_one_or_none()
|
||||||
groupe = await _premier_groupe(db)
|
if existant:
|
||||||
membres = await _membres_par_courriel(db)
|
membres_existants = await _membres_par_courriel(db, existant.id)
|
||||||
postes = await _postes_par_nom(db, groupe.id)
|
return {
|
||||||
litterature = await _litterature(db)
|
"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)
|
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 _ajouter_historique_demo(db, groupe, membres, postes, litterature)
|
||||||
await db.flush()
|
await db.flush()
|
||||||
return {
|
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,
|
"groupe_id": groupe.id,
|
||||||
"membres": len(membres),
|
"membres": len(membres),
|
||||||
"periode_mois": 12,
|
"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(
|
groupe = Groupe(
|
||||||
nom="Groupe Résilience",
|
nom=nom_groupe,
|
||||||
district="87-16",
|
district="87-16",
|
||||||
region="87",
|
region="87",
|
||||||
adresse_local="Salle communautaire Saint-Louis, Montréal",
|
adresse_local=adresse_local,
|
||||||
jour_reunion="mardi",
|
jour_reunion="mardi",
|
||||||
heure_reunion=time(19, 30),
|
heure_reunion=time(19, 30),
|
||||||
assemblee_affaires_ordre="premiere",
|
assemblee_affaires_ordre="premiere",
|
||||||
|
|
@ -623,10 +639,13 @@ async def _premier_groupe(db: AsyncSession) -> Groupe:
|
||||||
return result.scalar_one()
|
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
|
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()}
|
return {m.courriel: m for m in result.scalars().all()}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -150,17 +150,19 @@ export default function Profil() {
|
||||||
};
|
};
|
||||||
|
|
||||||
const operationAdminBd = async (mode) => {
|
const operationAdminBd = async (mode) => {
|
||||||
const libelle = mode === 'demo' ? 'initialiser la base de démonstration' : 'remettre la base à zéro';
|
const message = mode === 'demo'
|
||||||
const confirmation = window.prompt(`Cette action va ${libelle} et effacer les données actuelles. Tapez CONFIRMER pour continuer.`);
|
? '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;
|
if (confirmation !== 'CONFIRMER') return;
|
||||||
setAdminBusy(true);
|
setAdminBusy(true);
|
||||||
setError('');
|
setError('');
|
||||||
try {
|
try {
|
||||||
await api.post(mode === 'demo' ? '/admin/demo' : '/admin/reset');
|
await api.post(mode === 'demo' ? '/admin/demo' : '/admin/reset');
|
||||||
alert(mode === 'demo'
|
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.');
|
: 'Base remise à zéro. Reconnectez-vous avec Sysadmin / 0000.');
|
||||||
logout();
|
if (mode === 'reset') logout();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
setError(e.message);
|
setError(e.message);
|
||||||
} finally {
|
} finally {
|
||||||
|
|
@ -365,7 +367,7 @@ export default function Profil() {
|
||||||
<div>
|
<div>
|
||||||
<h2 className="font-bold text-red-700">Administration sysadmin</h2>
|
<h2 className="font-bold text-red-700">Administration sysadmin</h2>
|
||||||
<p className="text-sm text-gray-500 mt-1">
|
<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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
|
|
@ -380,7 +382,7 @@ export default function Profil() {
|
||||||
disabled={adminBusy}
|
disabled={adminBusy}
|
||||||
className="w-full min-h-[44px] p-3 bg-aa-blue text-white rounded-xl font-bold disabled:opacity-40"
|
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>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue