====== 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)]]