Refonte design : 4 humeurs, onboarding, sections avec boite a outils

- Systeme de themes adaptatifs : Peps (light chaud), Zen (light calme),
  Chagrine (dark violet), Grave (dark ambre) avec CSS custom properties
- Dashboard d'accueil orienté onboarding avec cartes-portes et teaser
  boite a outils
- SectionLayout reutilisable : liste + sidebar toolbox + status pills
  cliquables (En prepa / En vote / En vigueur / Clos)
- ToolboxVignette : vignettes Contexte / Tutos / Choisir / Demarrer
- Seed : Acte engagement certification + forgeron, Runtime Upgrade
  (decision on-chain), 3 modalites de vote (majoritaire, quadratique,
  permanent)
- Backend adapte SQLite (Uuid portable, 204 fix, pool conditionnel)
- Correction noms composants (pathPrefix: false), pinia/nuxt ^0.11

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-02-28 17:44:48 +01:00
parent 403b94fa2c
commit 77dceb49c3
49 changed files with 20628 additions and 1180 deletions

View File

@@ -101,39 +101,45 @@ async def seed_formula_configs(session: AsyncSession) -> dict[str, FormulaConfig
# ---------------------------------------------------------------------------
# Seed: VotingProtocols
# Seed: VotingProtocols (premier pack de modalites)
# ---------------------------------------------------------------------------
async def seed_voting_protocols(
session: AsyncSession,
formulas: dict[str, FormulaConfig],
) -> dict[str, VotingProtocol]:
"""Create the 4 base voting protocols."""
"""Create the first pack of voting modalities (3 protocols)."""
protocols: dict[str, dict] = {
"Standard G1": {
"description": "Protocole binaire standard pour la Licence G1.",
"Vote majoritaire": {
"description": (
"Vote binaire a majorite simple. Le seuil d'adoption "
"s'adapte dynamiquement au taux de participation via "
"la formule d'inertie WoT."
),
"vote_type": "binary",
"formula_config_id": formulas["Standard Licence G1"].id,
"mode_params": "D30M50B.1G.2",
},
"Forgeron Smith": {
"description": "Protocole binaire avec critere Smith pour les forgerons.",
"Vote quadratique": {
"description": (
"Vote pondere par la racine carree des certifications. "
"Reduit l'influence des gros certificateurs et favorise "
"une participation large et diversifiee."
),
"vote_type": "binary",
"formula_config_id": formulas["Forgeron avec Smith"].id,
"mode_params": "D30M50B.1G.2S.1",
},
"Comite Tech": {
"description": "Protocole binaire avec critere Comite Technique.",
"Vote permanent": {
"description": (
"Vote continu sans date de fin. Le resultat evolue en "
"temps reel avec chaque nouveau vote. Adapte aux documents "
"de reference sous revision permanente."
),
"vote_type": "binary",
"formula_config_id": formulas["Comite Tech"].id,
"mode_params": "D30M50B.1G.2T.1",
},
"Vote Nuance 6 niveaux": {
"description": "Protocole de vote nuance a 6 niveaux.",
"vote_type": "nuanced",
"formula_config_id": formulas["Vote Nuance"].id,
"mode_params": None,
},
}
result: dict[str, VotingProtocol] = {}
@@ -149,143 +155,134 @@ async def seed_voting_protocols(
# ---------------------------------------------------------------------------
# Seed: Document - Licence G1
# Seed: Document - Acte d'engagement certification
# ---------------------------------------------------------------------------
LICENCE_G1_ITEMS: list[dict] = [
ENGAGEMENT_CERTIFICATION_ITEMS: list[dict] = [
{
"position": "1",
"item_type": "preamble",
"title": "Preambule",
"title": "Objet",
"sort_order": 1,
"current_text": (
"Licence de la monnaie libre et engagement de responsabilite. "
"La monnaie libre G1 (June) est co-produite par ses membres."
"Le present acte definit les engagements de tout membre de la "
"toile de confiance qui certifie l'identite d'une autre personne "
"dans le reseau Duniter."
),
},
{
"position": "2",
"item_type": "section",
"title": "Avertissement TdC",
"item_type": "clause",
"title": "Connaissance personnelle",
"sort_order": 2,
"current_text": (
"Certifier n'est pas uniquement s'assurer de l'identite unique "
"de la personne (son unicite). C'est aussi affirmer que vous la "
"connaissez bien et que vous saurez la joindre facilement."
"Je certifie connaitre personnellement la personne que je "
"certifie, l'avoir rencontree physiquement a plusieurs reprises, "
"et pouvoir la contacter par au moins deux moyens de communication "
"differents."
),
},
{
"position": "3",
"item_type": "clause",
"title": "Conseils",
"title": "Verification d'identite",
"sort_order": 3,
"current_text": (
"Connaitre la personne par plusieurs moyens de communication differents "
"(physique, electronique, etc.). Connaitre son lieu de vie principal. "
"Avoir echange avec elle en utilisant des moyens de communication "
"susceptibles d'identifier un humain vivant."
"Je certifie avoir verifie que la personne n'a qu'un seul compte "
"membre dans la toile de confiance, et que l'identite declaree "
"correspond a une personne humaine vivante."
),
},
{
"position": "4",
"item_type": "verification",
"title": "Verifications",
"item_type": "clause",
"title": "Engagement de suivi",
"sort_order": 4,
"current_text": (
"De suffisamment bien connaitre la personne pour pouvoir la contacter, "
"echanger avec elle. De s'assurer que la personne a bien le controle "
"de son compte Duniter."
"Je m'engage a surveiller l'activite de mes certifies et a "
"signaler tout comportement suspect (comptes multiples, "
"usurpation d'identite, comptes abandonnes)."
),
},
{
"position": "5",
"item_type": "rule",
"title": "Regles TdC",
"item_type": "verification",
"title": "Delai entre certifications",
"sort_order": 5,
"current_text": (
"Chaque membre dispose de 100 certifications possibles. "
"Il est possible de certifier 1 nouveau membre tous les 5 jours. "
"Un membre doit avoir au moins 5 certifications pour devenir membre. "
"Un membre doit renouveler son adhesion tous les 2 ans."
"Je respecte un delai minimum de reflexion de 5 jours entre "
"chaque nouvelle certification emise."
),
},
{
"position": "6",
"item_type": "rule",
"title": "Production DU",
"title": "Renouvellement",
"sort_order": 6,
"current_text": (
"1 DU (Dividende Universel) est produit par personne et par jour. "
"Le DU est la monnaie de base co-produite par chaque membre."
"Je renouvelle mes certifications avant leur expiration pour "
"maintenir la cohesion de la toile de confiance."
),
},
{
"position": "7",
"item_type": "rule",
"title": "Code monetaire",
"item_type": "clause",
"title": "Responsabilite",
"sort_order": 7,
"current_text": (
"DU formule : DU(t+1) = DU(t) + c^2 * M/N. "
"c = 4.88% / an. Le DU est re-evalue chaque equinoxe."
"Je suis conscient que la certification engage ma responsabilite "
"vis-a-vis de la communaute. Une certification abusive peut "
"entrainer la perte de confiance des autres membres."
),
},
{
"position": "8",
"item_type": "clause",
"title": "Logiciels",
"item_type": "rule",
"title": "Revocation",
"sort_order": 8,
"current_text": (
"Les logiciels G1 doivent transmettre cette licence integralement "
"aux utilisateurs et developper un acces libre au code source."
),
},
{
"position": "9",
"item_type": "clause",
"title": "Modification",
"sort_order": 9,
"current_text": (
"Proposants, soutiens et votants doivent etre membres de la TdC. "
"Toute modification de cette licence doit etre soumise au vote "
"des membres selon le protocole en vigueur."
"Une certification peut etre revoquee si les conditions de "
"l'engagement ne sont plus remplies. La revocation est soumise "
"au protocole de vote en vigueur."
),
},
]
async def seed_document_licence_g1(session: AsyncSession) -> Document:
"""Create the Licence G1 document with its items."""
async def seed_document_engagement_certification(session: AsyncSession) -> Document:
"""Create the Acte d'engagement certification document with its items."""
doc, created = await get_or_create(
session,
Document,
"slug",
"licence-g1",
title="Licence G1",
doc_type="licence",
version="0.3.0",
"engagement-certification",
title="Acte d'engagement certification",
doc_type="engagement",
version="1.0.0",
status="active",
description=(
"Licence de la monnaie libre G1 (June). "
"Definit les regles de la toile de confiance et du Dividende Universel."
"Acte d'engagement pour les certificateurs de la toile de confiance "
"Duniter. Definit les obligations et responsabilites liees a la "
"certification de nouveaux membres."
),
)
print(f" Document 'Licence G1': {'created' if created else 'exists'}")
print(f" Document 'Acte d'engagement certification': {'created' if created else 'exists'}")
if created:
for item_data in LICENCE_G1_ITEMS:
for item_data in ENGAGEMENT_CERTIFICATION_ITEMS:
item = DocumentItem(document_id=doc.id, **item_data)
session.add(item)
await session.flush()
print(f" -> {len(LICENCE_G1_ITEMS)} items created")
print(f" -> {len(ENGAGEMENT_CERTIFICATION_ITEMS)} items created")
return doc
# ---------------------------------------------------------------------------
# Seed: Document - Engagement Forgeron v2.0.0
# Seed: Document - Acte d'engagement forgeron v2.0.0
# ---------------------------------------------------------------------------
FORGERON_ITEMS: list[dict] = [
ENGAGEMENT_FORGERON_ITEMS: list[dict] = [
{
"position": "1",
"item_type": "preamble",
@@ -387,36 +384,36 @@ FORGERON_ITEMS: list[dict] = [
]
async def seed_document_forgeron(session: AsyncSession) -> Document:
"""Create the Engagement Forgeron v2.0.0 document with its items."""
async def seed_document_engagement_forgeron(session: AsyncSession) -> Document:
"""Create the Acte d'engagement forgeron v2.0.0 document with its items."""
doc, created = await get_or_create(
session,
Document,
"slug",
"engagement-forgeron",
title="Engagement Forgeron v2.0.0",
title="Acte d'engagement forgeron",
doc_type="engagement",
version="2.0.0",
status="active",
description=(
"Engagement des forgerons (validateurs) pour Duniter V2. "
"Adopte en fevrier 2026 (97 pour / 23 contre)."
"Acte d'engagement des forgerons (validateurs de blocs) pour "
"Duniter V2. Adopte en fevrier 2026 (97 pour / 23 contre)."
),
)
print(f" Document 'Engagement Forgeron v2.0.0': {'created' if created else 'exists'}")
print(f" Document 'Acte d'engagement forgeron': {'created' if created else 'exists'}")
if created:
for item_data in FORGERON_ITEMS:
for item_data in ENGAGEMENT_FORGERON_ITEMS:
item = DocumentItem(document_id=doc.id, **item_data)
session.add(item)
await session.flush()
print(f" -> {len(FORGERON_ITEMS)} items created")
print(f" -> {len(ENGAGEMENT_FORGERON_ITEMS)} items created")
return doc
# ---------------------------------------------------------------------------
# Seed: Decision template - Processus Runtime Upgrade
# Seed: Decision template - Runtime Upgrade
# ---------------------------------------------------------------------------
RUNTIME_UPGRADE_STEPS: list[dict] = [
@@ -474,15 +471,16 @@ async def seed_decision_runtime_upgrade(session: AsyncSession) -> Decision:
session,
Decision,
"title",
"Processus Runtime Upgrade",
"Runtime Upgrade",
description=(
"Template de decision pour les mises a jour du runtime Duniter V2. "
"5 etapes : qualification, revue, vote, execution, suivi."
"Processus de mise a jour du runtime Duniter V2 on-chain. "
"Chaque upgrade suit un protocole strict en 5 etapes. "
"(Decision on-chain)"
),
decision_type="runtime_upgrade",
status="draft",
)
print(f" Decision 'Processus Runtime Upgrade': {'created' if created else 'exists'}")
print(f" Decision 'Runtime Upgrade': {'created' if created else 'exists'}")
if created:
for step_data in RUNTIME_UPGRADE_STEPS:
@@ -509,16 +507,16 @@ async def run_seed():
print("\n[1/5] Formula Configs...")
formulas = await seed_formula_configs(session)
print("\n[2/5] Voting Protocols...")
print("\n[2/5] Voting Protocols (premier pack de modalites)...")
await seed_voting_protocols(session, formulas)
print("\n[3/5] Document: Licence G1...")
await seed_document_licence_g1(session)
print("\n[3/5] Document: Acte d'engagement certification...")
await seed_document_engagement_certification(session)
print("\n[4/5] Document: Engagement Forgeron v2.0.0...")
await seed_document_forgeron(session)
print("\n[4/5] Document: Acte d'engagement forgeron...")
await seed_document_engagement_forgeron(session)
print("\n[5/5] Decision: Processus Runtime Upgrade...")
print("\n[5/5] Decision: Runtime Upgrade...")
await seed_decision_runtime_upgrade(session)
print("\n" + "=" * 60)