Lecture et écriture de la configuration depuis un fichier INI #1532
Replies: 4 comments 1 reply
-
Configuration de la classe
|
Beta Was this translation helpful? Give feedback.
-
Implémentation d'un model PydanticUn modèle Pydantic (ou formulaire) est une sous-classe de la classe de base Lors de la création d'un champ dans le formulaire, on peut ajouter les propriétés suivantes :
Un attribut est disponible pour une étude en version is_available = (
start_version <= study_version <= end_version
if end_version
else start_version <= study_version
) L'exemple suivant montre comment définir un formulaire pour un "produit" (factice). Dans cet exemple, on définit les champs suivants :
Attention : dans cet exemple, on n'utilise pas le typage avec |
Beta Was this translation helpful? Give feedback.
-
Rendre les champs optionnels avec une MétaclasseLorsque nous implémentons un modèle Pydantic, nous définissons généralement les champs en spécifiant leurs valeurs par défaut et d'autres propriétés (description, contraintes, etc.). Cependant, nous souhaitons rendre tous les champs optionnels, ce qui nécessiterait d'ajouter Pour éviter cette répétition fastidieuse, une solution consiste à utiliser une métaclasse spéciale appelée Lorsque vous utilisez la métaclasse L'exemple ci-dessous montre quelques cas d'utilisation d'un model Pydantic avec tous les champs optionnels : REMARQUES :
|
Beta Was this translation helpful? Give feedback.
-
Spécification détailléeConversion du modèle en paramètres INILa méthode de classe Remarque : En général, seuls certains paramètres sont mis à jour, et non tous. Cela signifie que la plupart des attributs du modèle auront la valeur Un mapping est utilisé pour faire correspondre les noms des attributs du modèle avec les noms des paramètres du fichier INI. Ce mapping est créé en récupérant la propriété En ce qui concerne les valeurs, le format de données supporté par le fichier INI est très proche du format JSON. Par conséquent, nous utiliserons une conversion au format JSON pour convertir les valeurs en amont. L'objet Il n'est pas nécessaire de vérifier si un attribut donné existe dans le modèle, ni même si la valeur fournie est valide, car cela est déjà vérifié au niveau de l'endpoint FastAPI lors de la construction du modèle Pydantic. |
Beta Was this translation helpful? Give feedback.
-
Rappel du contexte
Glossaire
Voici un glossaire des termes couramment utilisés dans cette documentation :
Field
.FieldInfo
: Classe qui contient des informations supplémentaires sur chaque champ, telles que le chemin relatif au fichier INI, la valeur par défaut, la version de l'étude, etc. Cette classe est dépréciée.FormFieldsBaseModel
: Classe personnalisée qui hérite de la classe de baseBaseModel
de Pydantic et qui est utilisée pour gérer les champs d'un formulaire.UpdateConfig
: Commande utilisée pour spécifier les modifications apportées à l'étude.TypeError
: Exception qui est levée lorsqu'un type de donnée est incompatible.ValueError
: Exception qui est levée lorsque la valeur d'une donnée est invalide.BaseModel
de Pydantic.Field
, tel que le type, la description, les contraintes et les propriétés supplémentaires (user defined), ce terme est aussi utilisé pour décrire les propriétés de la configuration d'un modèle Pydantic (attributs de la classeConfig
).extra = Extra.forbid
: Propriété utilisée dans la configuration du modèle Pydantic pour interdire l'utilisation de paramètres inconnus.ini_path
: Propriété utilisée lors de la description des champs du modèle Pydantic avec la classeField
pour associer les noms des attributs aux noms des paramètres dans le fichier INI.start_version
etend_version
: Propriétés utilisées lors de la description des champs du modèle Pydantic avec la classeField
pour spécifier la version de l'étude à partir de laquelle un attribut a été introduit et la dernière version où il existe encore.Présentation
La spécification fonctionnelle suivante résume les cas d'utilisation liés à la gestion de la configuration d'une étude à l'aide de fichiers INI et aux modèles Pydantic :
Lors de la gestion de la configuration d'une étude, il est courant d'utiliser des fichiers INI. Cela s'applique notamment aux clusters thermiques et renouvelables, et sera également le cas pour les stockages à court terme introduits dans la version v8.6 d'Antares Solver. Les données contenues dans ces fichiers INI évoluent en fonction des versions, avec l'ajout de certains paramètres et la suppression d'autres. Cette évolution est typiquement observée dans le fichier
generaldata.ini
.Dans notre application web, nous utilisons des modèles Pydantic pour gérer ces paramètres. Les modèles Pydantic permettent de spécifier les noms des paramètres, leurs types et les contraintes sur les valeurs. Pour cela, nous utilisons la classe de base
FormFieldsBaseModel
, qui est configurée pour convertir automatiquement les noms des champs au format "camelCase" pour TypeScript en utilisant des alias.Dans la version actuelle d'Antares Web, nous utilisons une table d'association pour fournir des informations supplémentaires sur chaque champ. Cette implémentation repose sur la classe
FieldInfo
, qui contient les champs suivants :path
: un chemin relatif au fichier INI, indiquant la section et le nom du paramètre dans ce fichier. Ce chemin est relatif à la racine de l'étude lorsqu'elle est stockée sur disque, et il utilise la notation Posix.default_value
: la valeur par défaut du paramètre.start_version
: la version de l'étude à partir de laquelle ce paramètre a été introduit (facultatif).end_version
: la dernière version de l'étude où le paramètre existe encore (facultatif).Nous souhaitons améliorer la spécification des attributs des modèles Pydantic en utilisant la classe
Field
de Pydantic. Cette évolution nous permettra d'intégrer les attributs de la classeFieldInfo
directement dans les modèles Pydantic et de nous passer de cette dernière. De plus, les managers devront être mis à jour et simplifiés en conséquence.Affichage et soumission du formulaire
Du côté de l'interface utilisateur, tous les paramètres renseignés sont affichés. Si un paramètre est manquant, la zone de saisie correspondante est masquée. Cette fonctionnalité permet de cacher automatiquement les paramètres qui ne sont pas inclus dans la version de l'étude en cours.
Concernant le back office, l'option
response_model_exclude_none=True
est utilisée. Cela signifie que, dans un modèle Pydantic, les attributs ayant la valeurNone
sont exclus de la réponse JSON envoyée au front office.Lorsque l'utilisateur apporte des modifications aux données du formulaire et les soumet, l'interface utilisateur prépare une requête JSON qui inclut uniquement les paramètres modifiés. En d'autres termes, l'objet JSON ne contient pas nécessairement toutes les données du modèle Pydantic.
Le modèle Pydantic doit donc avoir des attributs optionnels pour permettre la valeur
None
.Lecture des paramètres de configuration
Par convention, les paramètres dont la valeur correspond à la valeur par défaut ne sont pas enregistrés dans le fichier INI. Généralement, cela concerne les valeurs nulles (comme 0.0 ou
False
pour un booléen), mais cela peut également s'appliquer à d'autres valeurs. Par exemple, le paramètreunit_count
a une valeur par défaut de 1, ce qui signifie qu'il ne sera pas stocké dans le fichier INI s'il est égal à 1.Le modèle Pydantic est construit à partir des paramètres du fichier INI. Cette construction implique la conversion et la validation des données, par exemple, la conversion d'une chaîne de caractères en un type énuméré. Il est possible que la validation des données échoue, ce qui peut entraîner le déclenchement d'une exception de type
ValueError
ouTypeError
. Afin de fournir un contexte d'erreur plus précis, la fonction de lecture doit intercepter ces exceptions et lever une exception plus appropriée.La construction du modèle doit également prendre en compte la version de l'étude. Si une étude est dans une version antérieure, les attributs du modèle qui appartiennent à la nouvelle version doivent être initialisés à
None
. Cependant, si un paramètre est manquant, la valeur par défaut de l'attribut doit être utilisée. Il convient de rappeler que certains paramètres sont obligatoires et n'ont donc pas de valeur par défaut. Si une valeur manque, la fonction de lecture doit lever une exception précisant le nom du paramètre.Un mapping doit être défini pour associer les noms des attributs du modèle Pydantic aux noms des paramètres dans le fichier INI. Cela peut être réalisé en utilisant une propriété
ini_path
lors de la description des champs du modèle avec la fonctionField
. Dans certain cas, par exemple dans le cas des paramètres avancé de General Data, l'accès aux paramètres doit se faire en profondeur, car il y a plusieurs sections dans le fichier INI. Dans ce cas, le nom du paramètre dans le fichier INI est représenté sous la forme d'un chemin (au format Posix).De même, les propriétés
start_version
(etend_version
) peuvent être ajoutées lors de l'appel à la fonctionField
pour déterminer si un attribut existe dans une version spécifique de l'étude.En fin de compte, le modèle Pydantic est construit à partir des paramètres du fichier INI et des valeurs par défaut des attributs en fonction de la version actuelle de l'étude.
Mise à jour des paramètres de configuration
La mise à jour des paramètres de configuration d'une étude Antares se déroule en deux étapes distinctes. La première étape consiste à créer une commande de type
UpdateConfig
pour spécifier les modifications apportées à l'étude. Cette commande contient uniquement les paramètres qui ont été modifiés.La seconde étape est l'application effective des changements et la mise à jour du fichier INI de l'étude, qui est stocké sur le disque, dans le cas des études RAW. Dans le cas des variants d'études, la commande est simplement ajoutée à l'historique des commandes. La seconde étape est implémentée avec la fonction utilitaire
execute_or_add_commands
.Lorsque le formulaire envoie les données JSON, seules les données modifiées sont renseignées. Le modèle Pydantic est construit à partir de ces données. Les attributs du modèle Pydantic sont facultatifs, ce qui permet d'assigner la valeur
None
aux paramètres manquants. La construction du modèle implique la conversion et la validation des données. FastAPI gère automatiquement cette validation et renvoie une erreur HTTP 422 "Unprocessable Entity" (Entité non traitable) en cas de problème.Si les données proviennent d'un appel à l'API Swagger, des contrôles de validation supplémentaires sont nécessaires. Une erreur de validation doit être générée si un paramètre JSON n'existe pas dans le modèle Pydantic. Dans la configuration du modèle Pydantic, la propriété
extra = Extra.forbid
est utilisé pour interdire l'utilisation de paramètres inconnus. Il est également important de prendre en compte la version actuelle de l'étude et de vérifier la disponibilité de chaque attribut. Chaque attribut du modèle Pydantic possède les propriétésstart_version
etend_version
, indiquant dans quelle version de l'étude l'attribut est disponible. Si un attribut n'est pas disponible dans la version de l'étude, une exception doit être levée, fournissant un message clair sur l'incompatibilité de version.Pour mettre à jour la configuration de l'étude, nous utilisons un mapping qui associe les noms des attributs du modèle Pydantic aux noms des paramètres dans le fichier INI. Ce mapping est utilisé pour construire un dictionnaire Python qui sera utilisé par la commande
UpdateConfig
afin de mettre à jour le fichier INI de l'étude. Les paramètres ayant la valeurNone
sont exclus, car cela signifie qu'ils n'ont pas été modifiés et ne doivent pas être mis à jour.Beta Was this translation helpful? Give feedback.
All reactions