groupe-meditation/backend/app/core/concurrency.py

28 lines
964 B
Python
Raw Normal View History

"""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.",
)