2026-03-04 14:01:00 -05:00
|
|
|
"""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):
|
2026-04-17 04:04:04 -04:00
|
|
|
courriel: str
|
2026-03-04 14:01:00 -05:00
|
|
|
pin: str
|
|
|
|
|
groupe_id: UUID
|
2026-04-17 04:04:04 -04:00
|
|
|
se_souvenir: bool = False
|
2026-03-04 14:01:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class InscriptionRequest(BaseModel):
|
|
|
|
|
prenom: str
|
2026-04-17 04:04:04 -04:00
|
|
|
nom: Optional[str] = None
|
2026-03-04 14:01:00 -05:00
|
|
|
pin: str
|
|
|
|
|
code_invitation: str
|
2026-04-17 04:04:04 -04:00
|
|
|
telephone: str
|
|
|
|
|
courriel: str
|
2026-03-04 14:01:00 -05:00
|
|
|
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
|
2026-04-17 04:04:04 -04:00
|
|
|
courriel: str
|
2026-03-04 14:01:00 -05:00
|
|
|
groupe_id: UUID
|
|
|
|
|
date_abstinence: Optional[date] = None
|
2026-05-25 17:39:38 -04:00
|
|
|
is_sysadmin: bool = False
|
2026-03-04 14:01:00 -05:00
|
|
|
|
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MembreComplet(MembrePublic):
|
2026-04-17 04:04:04 -04:00
|
|
|
nom: Optional[str] = None
|
|
|
|
|
telephone: str
|
2026-03-04 14:01:00 -05:00
|
|
|
actif: bool
|
|
|
|
|
cree_le: datetime
|
|
|
|
|
|
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MembreUpdate(BaseModel):
|
2026-04-17 04:04:04 -04:00
|
|
|
prenom: Optional[str] = None
|
|
|
|
|
nom: Optional[str] = None
|
2026-03-04 14:01:00 -05:00
|
|
|
telephone: Optional[str] = None
|
|
|
|
|
courriel: Optional[str] = None
|
|
|
|
|
date_abstinence: Optional[date] = None
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
class MembreCreateAdmin(BaseModel):
|
|
|
|
|
prenom: str
|
|
|
|
|
nom: Optional[str] = None
|
|
|
|
|
telephone: str
|
|
|
|
|
courriel: str
|
|
|
|
|
pin: str
|
|
|
|
|
date_abstinence: Optional[date] = None
|
|
|
|
|
|
|
|
|
|
|
2026-03-04 14:01:00 -05:00
|
|
|
class ChangerPinRequest(BaseModel):
|
|
|
|
|
ancien_pin: str
|
|
|
|
|
nouveau_pin: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ── Poste / Affectation ──
|
2026-04-17 04:04:04 -04:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2026-05-26 08:15:28 -04:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2026-03-04 14:01:00 -05:00
|
|
|
class PosteOut(BaseModel):
|
|
|
|
|
id: UUID
|
|
|
|
|
nom: str
|
|
|
|
|
categorie: str
|
|
|
|
|
description: Optional[str] = None
|
2026-04-17 04:04:04 -04:00
|
|
|
prerequis: Optional[str] = None
|
|
|
|
|
informations: Optional[str] = None
|
2026-03-04 14:01:00 -05:00
|
|
|
ordre_affichage: Optional[int] = None
|
2026-04-17 04:04:04 -04:00
|
|
|
actif: bool = True
|
2026-03-04 14:01:00 -05:00
|
|
|
|
|
|
|
|
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
|
2026-05-15 16:41:17 -04:00
|
|
|
proposeur_id: UUID
|
|
|
|
|
secondeur_id: UUID
|
2026-03-04 14:01:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
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]
|
2026-05-25 17:39:38 -04:00
|
|
|
est_executif: bool = False
|
2026-03-04 14:01:00 -05:00
|
|
|
modules_consultation: list[ModuleTuile]
|
|
|
|
|
modules_saisie: list[ModuleTuile]
|
|
|
|
|
modules_gestion: list[ModuleTuile]
|
2026-04-17 04:04:04 -04:00
|
|
|
groupe: Optional[dict] = None
|
2026-03-04 14:01:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# ── 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
|
2026-05-25 17:39:38 -04:00
|
|
|
assemblee_affaires_ordre: Optional[str] = "premiere"
|
2026-03-04 14:01:00 -05:00
|
|
|
|
|
|
|
|
model_config = {"from_attributes": True}
|