UX: texte valorise, vote discret, inertie visuelle, genese repliable

- EngagementCard: texte agrandi (15-16px), vote board discret (opacity, scale)
- MiniVoteBoard: badge Adopte/En attente apres "Vote permanent :", board compact
- InertiaSlider: labels descriptifs (inertie pour le remplacement), schema SVG
  avec courbe de seuil, formule simplifiee et legende parametres
- GenesisBlock: toggle repliement individuel par section (source, outils,
  forum, processus, contributeurs)
- Votes varies dans Conseils et bonnes pratiques (non-adoptes inclus)
- Seed: Certification responsable → Reciprocite, ordonnancement inertie standard,
  notes variables K1/K2 (vote porte sur l'inclusion, pas les valeurs),
  init_db() dans seed.py pour DB vierge

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-03-02 08:52:56 +01:00
parent 62808b974d
commit 0b230483d9
5 changed files with 469 additions and 149 deletions

View File

@@ -27,7 +27,7 @@ from datetime import datetime, timedelta, timezone
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import async_session, engine, Base
from app.database import async_session, engine, Base, init_db
from app.models.protocol import FormulaConfig, VotingProtocol
from app.models.document import Document, DocumentItem
from app.models.decision import Decision, DecisionStep
@@ -351,7 +351,7 @@ ENGAGEMENT_CERTIFICATION_ITEMS: list[dict] = [
{
"position": "E2",
"item_type": "clause",
"title": "Certification responsable",
"title": "Reciprocite",
"sort_order": 5,
"section_tag": "fondamental",
"inertia_preset": "standard",
@@ -534,7 +534,10 @@ ENGAGEMENT_CERTIFICATION_ITEMS: list[dict] = [
"- Sentinelle : membre ayant recu et emis >= Y[N] certifs "
"(Y = ceil(N^(1/5)))\n"
"- Certifications actives valables **2 ans**\n"
"- Renouvellement de l'accord tous les **12 mois**"
"- Renouvellement de l'accord tous les **12 mois**\n\n"
"*Note : le vote porte sur l'inclusion de ces regles dans le document, "
"pas sur les valeurs des variables protocolaires elles-memes, "
"qui sont fixees par le protocole Duniter.*"
),
},
{
@@ -549,7 +552,10 @@ ENGAGEMENT_CERTIFICATION_ITEMS: list[dict] = [
"- 1 Dividende Universel (DU) par personne par jour\n"
"- Reevaluation a chaque equinoxe : "
"`DU(n+1) = DU(n) + c² × (M/N) / 182.625` avec c = 4.88%\n"
"- DU(0) = 10.00 G1"
"- DU(0) = 10.00 G1\n\n"
"*Note : le vote porte sur l'inclusion de ces parametres dans le document, "
"pas sur les valeurs monetaires elles-memes, "
"qui decoulent de la TRM et du bloc 0.*"
),
},
# ===================================================================
@@ -790,11 +796,11 @@ ENGAGEMENT_CERTIFICATION_ITEMS: list[dict] = [
"title": "Ordonnancement du document",
"sort_order": 33,
"section_tag": "ordonnancement",
"inertia_preset": "high",
"inertia_preset": "standard",
"current_text": (
"L'ordre de presentation des items dans le document est "
"lui-meme soumis au vote. Toute proposition de reorganisation "
"doit atteindre le seuil d'adoption avec l'inertie haute."
"doit atteindre le seuil d'adoption avec l'inertie standard."
),
},
]
@@ -1442,6 +1448,10 @@ async def run_seed():
print("Glibredecision - Seed Database")
print("=" * 60)
# Ensure tables exist
await init_db()
print("[0/7] Tables created.\n")
async with async_session() as session:
async with session.begin():
print("\n[1/7] Formula Configs...")