Etendre les modèles Odoo en utilisant le mécanisme d’héritage Partie 1 Sur 2

Introduction

Héritage Modèles Odoo

Le mécanisme d’héritage est un outil puissant qui a comme objectif, non seulement de garder toujours une propre copie du code d’origine, mais aussi la réutilisation et l’extension des modules existants, permettant ainsi de gagner énormément du temps et des efforts, et donc de créer rapidement de nouvelles applications et modules.
Dans cet article, nous découvrons avec des exemples pratiques, les types d’héritage qu’utilise Odoo, pour réutiliser les modèles existants, et comment créer rapidement d’autres modèles en se basant sur ces modèles. 

Les types de l’héritages Dans Odoo :

On distingue pratiquement Quatre types d’héritages :

  • L’héritage classique 
  • L’héritage prototype
  • L’héritage par délégation 
  • L’héritage mixin (mixed in) 

L’héritage classique : 

Pour utiliser l’héritage classique, on utilise en début de déclaration de notre classe qui va hériter de la classe mère, l’attribut ’_inherit =’ suivi par le nom du modèle à hériter.
Dans ce type d’héritage, les nouveaux champs de ce modèle vont être ajoutés dans le modèle d’origine, et les champs modifiés vont être aussi modifiés dans le modèle de base.
L’ORM d’Odoo, va traduire cela par l’ajout ou la modification des champs dans la table d’origine et ne vas pas ajouter d’autres tables.
De la même façon, on peut ajouter de nouvelles fonctions dans la classe mère, ou utiliser les fonctions existantes.
Dans le cas de modification des méthodes existantes dans la classe d’origine, il faut invoquer le mot clé super (un concept Objet utilisé pour l’héritage), pour pouvoir réutiliser la fonction d’origine, sinon cela risque de perdre les fonctions de la classe mère.
Nous reviendrons sur cette notion avec plus de détails, dans des prochains articles.
Il faut donc prendre des précautions lorsqu’on veut modifier les fonctions (méthodes) des classes qu’on veut réutiliser par le concept d’héritage. 

Exemple pratique : 

Nous avons utilisé l’héritage classique dans l’article relation entre les modèles, pour la définition des conducteurs.
Nous avons ajouté le champs vehicules_ids pour enregistrer les véhicules que le conducteur peut conduire, nous reprenons cet exemple pour l’ajouter un autre champ calculé, qui porte donc une fonction qui permet d’énumérer le nombre de véhicules autorisés à un conducteur.
Pour ce faire, revenons à notre exemple de Gestion de Location, et éditons le modèle ‘agence.conducteur’  du fichier agence_conducteur.py (remarquez l’importation de la bibliothèque api) :

from odoo import models, fields,api
class ResPartner(models.Model):
    _inherit = 'res.partner'
    _order = 'name'
    _sql_constraints =  [
        ('name_unique','UNIQUE(name)',
         'Le nom de Conducteur doit être unique!'),       
    ]
    vehicules_autorises_ids= fields.Many2many(
        'agence.vehicule',
        string='Véhicules autorisés à être conduits',
    )
    count_vehicules = fields.Integer( 'Nombre de Véhicules autorisés',
    compute='_compute_count_vehicules'    )
    @api.depends('vehicules_autorises_ids')
    def _compute_count_vehicules(self):
        for record in self:
                record.count_vehicules = len(record.vehicules_autorises_ids)

 
Pour Visualiser les changements, nous éditons le fichier ‘agence_conducteur.xml’ pour ajouter le nouveau champ calculé count_vehicules, jute après le champ vehicules_autorises_ids,
           <field name="type" position="before">
                   <field name="vehicules_autorises_ids" widget="many2many_tags" />
                   <field name="count_vehicules"/>
                </field>

Dans cet exemple, le fait d’introduire el mot clé _inherit nous permet d’utiliser tous fonctions et champs du modèle de base : ‘res.partner’ , avec la possibilité d’ajouter d’autres attributs et fonctions, dans cet exemple nous avons ajouté deux champs dont le deuxième est un champ calculé.
Nous avons aussi, ajouté une contrainte sur le champ name, pour qu’il soit unique et un attribut_order, pour trier par ordre croissant le tableau des conducteurs selon leur nom. 

Héritage Classique Odoo

L’héritage prototype :

Avec ce mode d’héritage on utilise le même mot clé que l’héritage classique :_inherit, mais on créant un autre modèle avec un autre nom.
En faisant cela, tous les éléments de du modèle d’origine (champs et méthodes) vont être copié vers le nouveau modèle créé, donc un nouveau tableau sera créé, sans rien toucher le modèle de base.
Exemple pratique :
Soi-disant que nous voulons créer un autre modèle qui va copier exactement les méthodes et attributs du modèle agence.vehicule.
Pour se faire nous allons créer donc un autre fichier python dans notre répertoire models, qui va porter le nom agence_vehicule_copie.py, et dedans mettez le code suivant :
from odoo import models
class AgenceVehiculeCopie(models.Model):
    _name = "agence.vehicule.copie"
    _inherit = "agence.vehicule"
    _description = "Copie/colie de la classe véhicule"

 
Après, redémarrage du service Odoo et mis à jour de l’application, et afin de comprendre l’impact de ce type d’héritage, activer le mode développeur (en allant vers la partie configuration puis activer le mode développeur), ensuite rendez vous sur la partie Structure de la base de données, en suivant le chemin du menu Configuration | Technique | Structure Base de Données |Modèles !
Vous aurez la liste de tous les modèles, pour limiter la recherche tapez le mot : agence, le résultat sera les modèles que nous avons créé durant notre parcours de formation.
Remarquez l’ajout du modèle agence.vehicule.copie, en entrant sur ce modèle nous trouvons exactement tous les champs du modèle agence.vehicule.
L’utilisation de ce type d’héritage, n’est pas fréquente, elle est généralement pour des buts de test.
Au lieu de dupliquer inutilement les structures de données, on utilise ce qu’on appelle l’héritage par délégation que nous allons étudier dans la section suivante.
Héritage prototype

L’héritage par délégation :

Le principe de ce type est simple mais très pratique, en effet au lieu de modifier le modèle à hériter, on crée un autre modèle qui a en plus des caractéristiques hérités, ces propres attributs, de tel sorte qu’à chaque fois qu’un objet sera créé sur le nouveau modèle, un objet sera créé sur sa classe mère, avec la création d’un lien ManyToOne entre le nouveau modèle et le modèle qu’on souhaite hériter.
Dans ce type d’héritage on utilise le mot clé ‘_inherits’ (remarquez l’ajout du s à la fin), avec la précision du champ clé qui sera utilisé comme un lien entre le nouveau modèle et le modèle de base.
 
Exemple d’utilisation de l’héritage par délégation :
Contrairement à l’héritage classique, qui se diffère un peu du concept de programmation par objet, Le principe d’héritage par délégation supporte les notions de programmation objet, du fait qu’un nouveau modèle peut être créé en incluant les composants de son modèle père.  Il supporte aussi la notion d’héritage polymorphisme où un modèle peut hériter d’un ou plusieurs autres modèles.
L’héritage par délégation est utilisé dans plusieurs cas, particulièrement dans la création des utilisateurs Odoo.
En effet à chaque création d’un utilisateur Odoo, un contact associé à cet utilisateur sera créé dans la table des partenaires.
Nous avons donc le modèle res.users qui hérite les caractéristique du modèle res.partner , et qui a ces propres attributs, comme le mot de passe, dernière entrée à la session, les droits d’accès,…
Cet exemple (utilisateurs Odoo et Contacts) illustre bien le principe d’héritage par délégation, et c’est possible de toucher directement son utilité, en allant dans la partie configuration des utilisateurs, dans votre instance Odoo lancé (Assurez-vous que le mode développeur est activé).
En allant vers la partie configuration, cliquez sur l’option de menu utilisateurs et sociétés, puis choisissez l’option utilisateurs.
Créons maintenant un nouvel utilisateur, en cliquant sur le bouton créer, et dans la page qui s’affiche remplissez les deux champs obligatoire (nom et adresse mail) puis sauvez les informations.
 Revenez maintenant sur cet utilisateur, en mode édition, vous remarquerez le champ Partenaire associé, à côté vous aurez un lien que lorsqu’on clique dessus en se redirige vers le formulaire utilisé dans la création des partenaires (Clients , Fournisseur ou autres types de contacts).
Remarque importante : Ce lien s’affiche uniquement lorsqu’on active le mode développement.
Autre chose importante dans la définition de l’héritage par délégation est la définition de ce qui se passera lorsqu’on supprime un objet de la classe qui hérite de la classe mère.
Dans l’exemple des utilisateurs, si vous essayer de supprimer le contact associé à l’utilisateur, vous recevrez un message qui vous interdira la suppression. Par contre vous pouvez supprimer l’utilisateur sans que le partenaire soit supprimé (il reste dans la base des contacts à moindre que vous décidiez de le supprimer manuellement). 
Héritage par délégation

Conclusion

Dans cet article, nous avons présenté les trois types d’héritages principales, avec un exemple pratique pour bien comprendre les concepts.
Nous avons fait le point sur l’héritage classique, l’héritage prototype et l’héritage par délégation.
Dans le prochain article, nous continuons l’explication de l’héritage par délégation, en utilisant notre exemple agence de location de véhicules, puis nous finirons par l’explication de l’héritage mixin et une conclusion générale sur le concept l’héritage.

Télécharger gratuitement votre  guide odoo ! 

Télécharger Gratuitement votre guide Odoo

Découvrez comment , Odoo  est une vraie opportunité pour les entreprises et les développeurs !


Télécharger !