groupe-meditation/backend/app/schemas/schemas.py
Daniel Allaire 69309acd13 Intégrer rencontres et assemblées pilotées par tuiles
Refond les pages Rencontres et Assemblées autour de tuiles ouvrables avec actions locales, PDF serveur, ventes, collectes, présences, décisions, postes et contributions.

Ajoute les invitations publiques d'assemblée en lecture seule avec lien expirant, l'adoption formelle du rapport du trésorier avec proposeur/secondeur, et bloque les contributions tant que ce rapport n'est pas adopté.

Uniformise la navigation et les entêtes, retire les modules redondants des contextes, ajoute la création de comptes membres par exécutif et les données démo reliées aux nouveaux processus.

Ce commit capture un lot fonctionnel important; une refactorisation ciblée du module Assemblées, puis Trésorerie/Gouvernance, est maintenant pertinente pour isoler les règles métier et faciliter les tests.
2026-05-31 09:02:02 -04:00

173 lines
3.7 KiB
Python

"""Schémas Pydantic pour validation et sérialisation."""
from pydantic import BaseModel
from datetime import date, datetime
from uuid import UUID
from typing import Optional
# ── Auth ──
class ConnexionRequest(BaseModel):
courriel: str
pin: str
groupe_id: UUID
se_souvenir: bool = False
class InscriptionRequest(BaseModel):
prenom: str
nom: Optional[str] = None
pin: str
code_invitation: str
telephone: str
courriel: str
date_abstinence: Optional[date] = None
class TokenResponse(BaseModel):
access_token: str
token_type: str = "bearer"
membre: "MembrePublic"
# ── Membre ──
class MembrePublic(BaseModel):
id: UUID
prenom: str
courriel: str
groupe_id: UUID
date_abstinence: Optional[date] = None
is_sysadmin: bool = False
model_config = {"from_attributes": True}
class MembreComplet(MembrePublic):
nom: Optional[str] = None
telephone: str
actif: bool
cree_le: datetime
model_config = {"from_attributes": True}
class MembreUpdate(BaseModel):
prenom: Optional[str] = None
nom: Optional[str] = None
telephone: Optional[str] = None
courriel: Optional[str] = None
date_abstinence: Optional[date] = None
class MembreCreateAdmin(BaseModel):
prenom: str
nom: Optional[str] = None
telephone: str
courriel: str
pin: str
date_abstinence: Optional[date] = None
class ChangerPinRequest(BaseModel):
ancien_pin: str
nouveau_pin: str
# ── Poste / Affectation ──
class PosteCreate(BaseModel):
nom: str
categorie: str # executif, service, physique
description: Optional[str] = None
prerequis: Optional[str] = None
informations: Optional[str] = None
ordre_affichage: Optional[int] = None
class PosteUpdate(BaseModel):
nom: Optional[str] = None
categorie: Optional[str] = None
description: Optional[str] = None
prerequis: Optional[str] = None
informations: Optional[str] = None
ordre_affichage: Optional[int] = None
class PosteOut(BaseModel):
id: UUID
nom: str
categorie: str
description: Optional[str] = None
prerequis: Optional[str] = None
informations: Optional[str] = None
ordre_affichage: Optional[int] = None
actif: bool = True
model_config = {"from_attributes": True}
class AffectationOut(BaseModel):
id: UUID
membre_id: UUID
poste_id: UUID
poste_nom: Optional[str] = None
poste_categorie: Optional[str] = None
date_debut: date
date_fin: Optional[date] = None
statut: str
model_config = {"from_attributes": True}
class AffectationCreate(BaseModel):
membre_id: UUID
poste_id: UUID
date_debut: date
proposeur_id: UUID
secondeur_id: UUID
class TerminerMandatRequest(BaseModel):
note_transition: Optional[str] = None
successeur_id: Optional[UUID] = None
# ── Accueil ──
class ModuleTuile(BaseModel):
code: str
nom: str
description: str
icone: str
couleur: str
class AccueilResponse(BaseModel):
membre: MembrePublic
postes: list[str]
est_executif: bool = False
modules_consultation: list[ModuleTuile]
modules_saisie: list[ModuleTuile]
modules_gestion: list[ModuleTuile]
groupe: Optional[dict] = None
# ── Invitation ──
class InvitationCreate(BaseModel):
pass # groupe_id vient du token
class InvitationOut(BaseModel):
code: str
expire_le: datetime
model_config = {"from_attributes": True}
# ── Groupe ──
class GroupeOut(BaseModel):
id: UUID
nom: str
district: str
region: str
jour_reunion: Optional[str] = None
assemblee_affaires_ordre: Optional[str] = "premiere"
model_config = {"from_attributes": True}