feat(config): ajouter la configuration Home Assistant (étape 1)
Ajoute la section [home_assistant] au TOML et sa validation au chargement via get_home_assistant_config(). La section est facultative pour préserver la compatibilité avec les configurations existantes, mais si elle est présente elle doit être complète et référencer un type de journée, un trajet et un véhicule à moteur existants, sous peine de refuser le démarrage de l'application. La configuration validée est exposée dans app.config['HOME_ASSISTANT']. Co-authored-by: OpenAI/GPT-5.6-Luna-Pro <vibecoder@antoineve.me>
This commit is contained in:
@@ -21,8 +21,28 @@ Contrat TOML :
|
||||
- Certains types de journées (Télétravail, Maladie, Congé, RTT, Férié) n'impliquent aucun déplacement physique.
|
||||
"""
|
||||
|
||||
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
|
||||
|
||||
from flask import current_app
|
||||
|
||||
_HOME_ASSISTANT_REQUIRED_KEYS = {
|
||||
"timezone",
|
||||
"default_day_type",
|
||||
"default_journey_profile_id",
|
||||
"default_motor_vehicle_id",
|
||||
}
|
||||
_VALID_DAY_TYPES = {
|
||||
"WORK",
|
||||
"TT",
|
||||
"GARDE",
|
||||
"ASTREINTE",
|
||||
"FORMATION",
|
||||
"RTT",
|
||||
"CONGE",
|
||||
"MALADE",
|
||||
"FERIE",
|
||||
}
|
||||
|
||||
|
||||
def get_vehicles():
|
||||
"""Récupère l'ensemble des véhicules configurés dans le fichier TOML.
|
||||
@@ -58,6 +78,66 @@ def get_journeys():
|
||||
return current_app.config.get("TOML", {}).get("journeys", {})
|
||||
|
||||
|
||||
def get_home_assistant_config() -> dict[str, str] | None:
|
||||
"""Retourne la configuration Home Assistant, après validation.
|
||||
|
||||
L'absence de section désactive la future intégration et reste compatible avec
|
||||
les anciens fichiers TOML. Une section présente doit en revanche être
|
||||
complète et cohérente avec les véhicules, trajets et types de journées
|
||||
connus de l'application.
|
||||
"""
|
||||
config = current_app.config.get("TOML", {}).get("home_assistant")
|
||||
if config is None:
|
||||
return None
|
||||
if not isinstance(config, dict):
|
||||
raise ValueError("Configuration [home_assistant] invalide : la section doit être une table")
|
||||
|
||||
missing = _HOME_ASSISTANT_REQUIRED_KEYS - config.keys()
|
||||
if missing:
|
||||
missing_keys = ", ".join(sorted(missing))
|
||||
raise ValueError(
|
||||
f"Configuration [home_assistant] incomplète : clé(s) manquante(s) {missing_keys}"
|
||||
)
|
||||
|
||||
if any(
|
||||
not isinstance(config[key], str) or not config[key] for key in _HOME_ASSISTANT_REQUIRED_KEYS
|
||||
):
|
||||
raise ValueError(
|
||||
"Configuration [home_assistant] invalide : toutes les valeurs doivent être des chaînes non vides"
|
||||
)
|
||||
|
||||
timezone = config["timezone"]
|
||||
try:
|
||||
ZoneInfo(timezone)
|
||||
except (ZoneInfoNotFoundError, ValueError) as exc:
|
||||
raise ValueError(
|
||||
f"Configuration [home_assistant] invalide : fuseau horaire inconnu {timezone!r}"
|
||||
) from exc
|
||||
|
||||
day_type = config["default_day_type"]
|
||||
if day_type not in _VALID_DAY_TYPES:
|
||||
raise ValueError(
|
||||
f"Configuration [home_assistant] invalide : type de journée inconnu {day_type!r}"
|
||||
)
|
||||
|
||||
journey_id = config["default_journey_profile_id"]
|
||||
if journey_id not in get_journeys():
|
||||
raise ValueError(f"Configuration [home_assistant] invalide : trajet inconnu {journey_id!r}")
|
||||
|
||||
vehicle_id = config["default_motor_vehicle_id"]
|
||||
vehicle = get_vehicles().get(vehicle_id)
|
||||
if vehicle is None:
|
||||
raise ValueError(
|
||||
f"Configuration [home_assistant] invalide : véhicule inconnu {vehicle_id!r}"
|
||||
)
|
||||
if vehicle.get("type") != "moteur":
|
||||
raise ValueError(
|
||||
f"Configuration [home_assistant] invalide : le véhicule {vehicle_id!r} n'est pas un véhicule moteur"
|
||||
)
|
||||
|
||||
return {key: config[key] for key in _HOME_ASSISTANT_REQUIRED_KEYS}
|
||||
|
||||
|
||||
def journey_has_motor(journey_profile_id: str | None) -> bool:
|
||||
"""Vérifie si un profil de trajet donné inclut une distance pour véhicule à moteur.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user