28 lines
964 B
Python
28 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.",
|
||
|
|
)
|