Ajoute modifie_le aux objets sensibles et fait transmettre la version affichée par le frontend pour refuser les écritures périmées avec un message HTTP 409. Ajoute une table historique_modifications et un service d'historique métier afin de journaliser automatiquement les raisons des changements importants sans intervention de l'utilisateur. Expose l'historique métier dans le module Journal, distinct du journal technique, et documente les processus utilisateurs ainsi qu'une présentation sobre aux membres.
27 lines
964 B
Python
27 lines
964 B
Python
"""Protection contre les modifications concurrentes."""
|
|
from datetime import datetime
|
|
|
|
from fastapi import HTTPException
|
|
|
|
|
|
def version_iso(obj) -> str | None:
|
|
valeur = getattr(obj, "modifie_le", None) or getattr(obj, "cree_le", None)
|
|
return valeur.isoformat() if valeur else None
|
|
|
|
|
|
def _normaliser(valeur: datetime) -> str:
|
|
return valeur.isoformat().replace("+00:00", "Z")
|
|
|
|
|
|
def verifier_version(obj, version_attendue: str | None = None):
|
|
"""Refuse l'écriture si le client a ouvert une ancienne version de la donnée."""
|
|
if not version_attendue:
|
|
return
|
|
actuelle = getattr(obj, "modifie_le", None) or getattr(obj, "cree_le", None)
|
|
if not actuelle:
|
|
return
|
|
if _normaliser(actuelle) != version_attendue.replace("+00:00", "Z"):
|
|
raise HTTPException(
|
|
status_code=409,
|
|
detail="Cette information a été modifiée depuis son affichage. Rechargez les données avant d'enregistrer.",
|
|
)
|