====== Relations entre modèles ====== ===== Création d'un nouveau modèle pour gérer les session de cours ===== Un enregistrement dans un modèle (une table) peut être **relié** à un enregistrement d'un autre modèle. Par exemple, un ordre de vente est relié à un enregistrement client qui contient les informations sur ce client. **Exercice : créer un modèle de session :** Pour ce module Open Academy, un modèle va permettre de gérer les **sessions** de cours. Une session est un cours planifié à une date pour des personnes. Pour créer un modèle de sessions il faut préciser : * le **nom** de la session, * une **date de début**, * une **durée**, * le nombre de place. Une action doit être ajoutée et associé à un nouvel élément de menu dans le menu pour afficher les sessions **Démarche à suivre :** - Créez la classe Session dans le fichier **openacademy/models.py**. - Ajoutez un accès à l'objet Session dasn le fichier **openacademy/view/openacademy.xml**. * Modifiez le fichier **openacademy/models.py** name = fields.Char(string="Title", required=True) description = fields.Text() class Session(models.Model): _name = 'openacademy.session' nom = fields.Char(required=True) date_deb = fields.Date() duree = fields.Float(digits=(6, 2), help="Duree en jours") places = fields.Integer(string="Nombre de place") * Modifiez le fichier **openacademy/view/openacademy.xml** session.form openacademy.session
Sessions openacademy.session form tree,form
**Information :** digits=(6, 2) indique la précision du réel : * 6 est le nombre total de chiffres, * 2 est le nombre de chiffres après la virgule (au maximum 4. ===== Les champs permettant de gérer les relations ===== Des champs permettent de gèrer les relations entre enregistrements : * d'un même modèle -> gérer des hiérarchies, * ou entre des modèles différents. Voici les différebnets types de champs relationnels : * **Many2one**(other_model, ondelete='set null') : * c'est un simple lien vers un autre objet * **One2many**(other_model, related_field) * c'est l'inverse Many2one. Cela peut renvoyer une liste d'enregistrement qui seront à traiter au sein d'une boucle. * **Many2many**(other_model) : * Tout comme **One2many**, cela peut renvoyer une liste d'enregistrement qui seront à traiter au sein d'une boucle. **Exercice : gérer des relations de type Many2one :** Vous allez modifier les modèles de **cours** et de **session** pour prendre en compte leurs relations avec d'autres modèles : * un **cours** à un **responsable** : la valeur de ce champ permettra de lier l'enregistrement au modèle existant **res.users** ; * une **session** a un **formateur** : la valeur de ce champ permettra de lier l'enregistrement au modèle existant **res.users** ; * une session est liée à un cours : la valeur de ce champ permettra de lier l'enregistrement au modèle **openacademy.course** que vous avez créé ; * et pour finir, il faudra **adapter les vues**. **Travail à faire :** - ajouter les champs Many2one aux modèles, - et les ajouter aux vues ; * Modifiez le fichier **openacademy/models.py** name = fields.Char(string="Titre", required=True) description = fields.Text() responsable_id = fields.Many2one('res.users', ondelete='set null', string="Responsable", index=True) class Session(models.Model): _name = 'openacademy.session' nom = fields.Char(required=True) date_deb = fields.Date() duree = fields.Float(digits=(6, 2), help="Duree en jours") places = fields.Integer(string="Nombre de places") formateur_id = fields.Many2one('res.partner', string="Formateur") cours_id = fields.Many2one('openacademy.cours', ondelete='cascade', string="Cours", required=True) * Modifiez le fichier **openacademy/views/openacademy.xml** course.search openacademy.cours ... session.form openacademy.session
session.tree openacademy.session
* Modifiez la vue **cours_form_view** pour permettre la saisie du responsable du cours dans uin **nouvel onglet**. Ceci est un exemple de notebooks
**Exercice : gérer des relations de type un à plusieurs One2many :** Vous allez modifier les modèles de **cours** afin de pouvoir gérer la relation d'**un cours avec plusieurs sessions** de famation : * Modification de la classe Cours, et * ajout du champ dans le formulaire de cours. * Modifiez le fichier **openacademy/models.py** : responsable_id = fields.Many2one('res.users', ondelete='set null', string="Responsable", index=True) session_ids = fields.One2many( 'openacademy.session', 'cours_id', string="Sessions") * Modifiez le fichier **openacademy/views/openacademy.xml** pour compléter le formulaire **cours_form_view** : Ceci est un exemple de notebooks ===== Retour au sommaire de création d'un module ===== [[dev:odoo:creermodule:accueil|Développer un module dans Odoo (version 8)]]