110 lines
2.6 KiB
Python
110 lines
2.6 KiB
Python
"""Schémas Phase 4 — PV, Présences, Services."""
|
|
from pydantic import BaseModel
|
|
from datetime import date, datetime
|
|
from uuid import UUID
|
|
from typing import Optional
|
|
|
|
|
|
# ── M2 Présences (réunion d'affaires) ──
|
|
class PresenceItem(BaseModel):
|
|
membre_id: UUID
|
|
present: bool = True
|
|
|
|
|
|
class PresencesBatch(BaseModel):
|
|
reunion_id: UUID
|
|
presences: list[PresenceItem]
|
|
|
|
|
|
class PresenceOut(BaseModel):
|
|
membre_id: UUID
|
|
membre_prenom: str
|
|
present: bool
|
|
|
|
|
|
class ReunionAffairesCreate(BaseModel):
|
|
"""Créer une réunion d'affaires (pour les présences et le PV)."""
|
|
date_reunion: datetime
|
|
note: Optional[str] = None
|
|
|
|
|
|
class ReunionAffairesOut(BaseModel):
|
|
id: UUID
|
|
date_reunion: datetime
|
|
note: Optional[str] = None
|
|
modifie_le: Optional[datetime] = None
|
|
rapport_adopte_id: Optional[UUID] = None
|
|
presences: list[PresenceOut] = []
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
# ── M1 Procès-verbal ──
|
|
class DecisionPV(BaseModel):
|
|
sujet: str
|
|
decision: str
|
|
proposeur: Optional[str] = None
|
|
secondeur: Optional[str] = None
|
|
statut: str = "en_attente"
|
|
|
|
|
|
class PvCreate(BaseModel):
|
|
reunion_id: UUID
|
|
contenu: str
|
|
decisions: Optional[list[DecisionPV]] = None
|
|
|
|
|
|
class PvOut(BaseModel):
|
|
id: UUID
|
|
reunion_id: UUID
|
|
redacteur_prenom: str
|
|
contenu: str
|
|
decisions: Optional[list[dict]] = None
|
|
approuve: bool
|
|
cree_le: datetime
|
|
modifie_le: datetime
|
|
date_reunion: Optional[datetime] = None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class PvUpdate(BaseModel):
|
|
contenu: Optional[str] = None
|
|
decisions: Optional[list[DecisionPV]] = None
|
|
approuve: Optional[bool] = None
|
|
|
|
|
|
class PvAdoption(BaseModel):
|
|
proposeur_id: UUID
|
|
secondeur_id: UUID
|
|
contenu: Optional[str] = None
|
|
|
|
|
|
# ── M3 Services ──
|
|
class RapportRsgCreate(BaseModel):
|
|
reunion_dist: date
|
|
decisions: Optional[list[str]] = None
|
|
infos_district: Optional[str] = None
|
|
infos_region: Optional[str] = None
|
|
sujets_groupe: Optional[str] = None
|
|
positions_groupe: Optional[str] = None
|
|
suivis: Optional[str] = None
|
|
prochaine_echeance: Optional[str] = None
|
|
liens_utiles: Optional[str] = None
|
|
|
|
|
|
class RapportRsgOut(BaseModel):
|
|
id: UUID
|
|
reunion_dist: date
|
|
redacteur_prenom: str
|
|
decisions: Optional[list[str]] = None
|
|
infos_district: Optional[str] = None
|
|
infos_region: Optional[str] = None
|
|
sujets_groupe: Optional[str] = None
|
|
positions_groupe: Optional[str] = None
|
|
suivis: Optional[str] = None
|
|
prochaine_echeance: Optional[str] = None
|
|
liens_utiles: Optional[str] = None
|
|
cree_le: datetime
|
|
|
|
model_config = {"from_attributes": True}
|