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

Introduction

Héritage Modèles Odoo

Dans l’article précédent, nous avons défini les trois types d’héritage, qui sont l’héritage classique, l’héritage prototype et l’héritage par délégation.
Dans cet article, nous continuons notre découverte en illustrant l’héritage par délégation en utilisant notre exemple agence de location de véhicule, puis nous finalisons notre découverte par l’explication de l’héritage mixin, avec un exemple d’utilisation pratique.
Nous finirons notre article, par une conclusion sur le concept détritage et son importance major dans l’évolution rapide des applications Odoo.

Utilisation de l’héritage par délégation dans notre exemple :

Dans l’article précédent, nous avons expliqué le concept d’héritage par délégation, par un cas pratique d’utilisation, qui se résume par la relation entre la table de base d’Odoo res.partner et res.users.
Revenant maintenant à notre exemple Agence de location de véhicule, et supposons que nous voulons gérer les agents de notre agence.
Pour se faire, nous allons utiliser le concept d’héritage par délégation et nous suivons les étapes usuelles de création des modèles et de vues dans notre module :

  •  Dans le répertoire models, créez le fichier agence_agent.py, et mettez le code de déclaration suivant : 


from odoo import models, fields, api

class AgenceAgent(models.Model):

    _name = 'agence.agent'
    _inherits = {'res.partner': 'partner_id'}
    partner_id = fields.Many2one(
        'res.partner',
        ondelete='cascade',
        delegate=True,
    )
    code_agent = fields.Char('Code Aent', required=True)
    date_integration = fields.Date('Date Intégration')
    fonctions_agent = fields.Html('Descritions des fonctions de l Agent')

  •  Déclarer le fichier ajouté dans le fichier __init__.py, en ajoutant la ligne :

from . import  agence_agent

  • Dans le répertoire views/ créez le fichier agence_agent.xml, et définissez les vues formulaire, liste, et recherche.

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id='agence_agent_action' model='ir.actions.act_window'>
        <field name="name"> Gestion des Agents </field>
        <field name="res_model">agence.agent</field>
        <field name="view_mode">tree,form</field>
    </record>
    <menuitem name="Agents" id="agence_agent_menu"
     parent="agence_base_menu" action="agence_agent_action"/>
    <record id="agence_agent_view_form" model="ir.ui.view">
        <field name="name">Agence Agence Form</field>
        <field name="model">agence.agent</field>
        <field name="arch" type="xml">
            <form>
            <sheet>
                <group>
                        <field name="code_agent" string="Code de l'agent"/>
                        <field name="name"/>
                        <field name="image_1920" widget="image" class="oe_avatar"/>
                        <field name="date_integration" string="Date d'intégration"/>
                        <field name="fonctions_agent"/>
                </group>
            </sheet>
            </form>
        </field>
    </record>
 
    <record id="agence_agent_tree" model="ir.ui.view">
            <field name="name">Agence Agents Lise</field>
            <field name="model">agence.agent</field>
            <field name="arch" type="xml">
                <tree>
                    <field name="code_agent"/>
                    <field name="name"/>
                    <field name="date_integration"/>
                </tree>
            </field>
    </record>
 
    <record id="agence_agent_search" model="ir.ui.view">
            <field name="name">Agence Agent Recherche</field>
            <field name="model">agence.agent</field>
            <field name="arch" type="xml">
                <search>
                    <field name="name"/>
                    <field name="code_agent"/>
                </search>
            </field>
    </record>
</odoo>

  •  Dans le dossier security/, éditez el fichier groups.xml , en lui ajoutant dans la dernière ligne :

<record id="group_ag_agents_managers" model="res.groups">
        <field name="name">Agence Agents  Managers</field>
        <field name="users" eval="[(4, ref('base.user_admin'))]"/>
    </record>

  •   Editez le fichier des droits d’accès :

acl_agence_agent_users,agence.agent default,model_agence_agent,,1,0,0,0
acl_agence_agent_admin,agence.agent_admin,model_agence_agent,group_ag_agents_managers,1,1,1,1

  •   Editez le fichier __manifest__.py, et ajoutez la ligne suivante :

'views/agence_agent.xml',

  •  Redémarrez le serveur Odoo et mettez à jour l’application pour visualiser les changements.

 
Nous avons ajouté trois champs spécifiques à un agent, mais aussi nous avons réutilisé deux autres champs depuis le modèle dont nous avons hérité pour les visualiser dans la vue formulaire (c’est possible de réutiliser tous ces champs), sans avoir les déclarer à nouveau.
Maintenant, si vous ajoutez un objet du modèle agence.agent, cet objet sera automatiquement ajouté dans la table du modèle res.partner . Vous pouvez ajouter des agents dans la base de données et voir les résultats dans la table res.partner, en allant vers le menu Configuration | Technique | Structure Base de Données |Modèles 
Le paramètre ondelete, Va indiquer au compilateur Odoo, comment procéder en cas de suppression d’un enregistrement du modèle agence.agent, :

  • si ondelete=’cascade’ alors, à chaque suppression d’un partenaire, l’agent associé sera supprimé aussi (l’inverse n’est pas vrai, Si on supprimer un agent, son contact associé ne sera pas  supprimé automatiquement, il reste encore dans la base des contacts)
  •  si ondelete=’restrict’  alors, dans ce cas la suppression est interdite

D’une autre façon, tous les agents sont des partenaires, mais seulement quelques partenaires qui sont aussi des agents.
Remarque Importante : Il faut noter que les méthodes de la classe mère (res.partner) ne sont pas automatiquement réutilisable dans les classe qui a hérité (agence.agent).
Une autre manière simple qui donne le même résultat que la précédente est d’utiliser directement le paramètre delegate dans la relation ManyToOne, de cette façon :
#_inherits = {'res.partner': 'partner_id'}
# (Remarquez la désactivation de cette ligne, qui sera remplacé  par la définition suivante :
    partner_id = fields.Many2one(
        'res.partner',
        ondelete='cascade',
        delegate=True,
    )
 
Nous avons uniquement ajouté le paramètre delegate=True à une relation ManyToOne, dans notre définition de la classe agence.agent, et désactivé la ligne _inherits = {'res.partner': 'partner_id'} en la mettant comme commentaire.
Les autres fichiers restent les mêmes, redémarrez donc le serveur et mettez à jour l’application, les résultats seront identiques aux précédentes.

Héritage par délégation

Extension des modèles en utilisant Les classes mixin (mixed in) :

Il arrive que durant notre processus de développement, d’avoirs besoin d’un certain nombre de traitements qui peuvent être regroupés dans des composants de même classe.
Répéter ces traitements à chaque fois que nous aurons besoin, n’est pas une bonne pratique de programmation.
Une meilleure façon de faire est de regrouper les composants réutilisables dans des classes abstraites, qui sont des classes Odoo normaux (comme les classes Models) , avec l’exception  qu’ils n’ont pas une représentation sur la base de données.
Il représente des templates, qui peuvent être utilisés par n’importe quel autres modèle en utilisant simplement le mécanisme d’héritage classique, pour pouvoir réutiliser tous les attributs et méthodes de ces classes abstraites.
C’est possible de créer des classes abstraites, en utilisant (models.AbstractModel) au lieu de models.Model habituel.
Le reste de déclaration des autres champs et méthodes(fonctions) est le même.
Odoo offre plusieurs classes abstraites, qui s’appellent les classes mixed-in, c’est-à-dire des classes qui ont des composants sans avoir une représentation dans la base de données, et qui peuvent être réutilisées ou réintégrés dans les autres modèles.
 Dans cet article, nous allons utiliser deux classes mixin qui sont largement utilisés par les applications Odoo, et qui dépendent tous les deux du module mail.
Le premier modèle est le modèle mail.thread qui est définit les composants nécessaires pour les que les applications gèrent les messages et notifications, on trouve ce composant dans le bas du formulaire (messages,notes) .
Le deuxième modèle est le modèle mail.activity.mixin qui est généralement rassemblé au modèle mail.thread , et qui a pour objectif de gérer les activités tel que les rendez-vous, les appels, les réunions.

Utilisation des classes mix-in dans notre exemple Agence de Location :

Dans notre exemple, Nous allons utiliser les deux modèles mail.thread et  mail.activity.mixin  , pour ajouter un composant de suivi des messages et des activités pour notre modèle agence .agent.
Pour se faire nous allons suivre les étapes suivantes :

  •  Ajouter la dépendance mail dans notre fichier __manifest__.py pour pouvoir utiliser ces classes, en ajoutant le code suivants

'depends': ['base'], ['mail'],

  • Editez le fichier agence_agent.py, en ajoutant simplement la ligne suivante : 

_inherit = ['mail.thread', 'mail.activity.mixin']
Le simple fait d’ajouter cette ligne magique, nous pouvons réutiliser tous les composants de ces deux classes  mixed-in,

  • Ajouter le code qui va permettre d’afficher les fonctionnalités des modèles mixin  ajoutés ,

En bas de la vue formulaire du modèle agent, juste avant la fermeture de la balise form, ajoutez le code suivant :
                  <!-- mail mixin fields -->
                    <div class="oe_chatter">
                     <field name="message_follower_ids" widget="mail_followers"/>
                      <field name="activity_ids" widget="mail_activity"/>
                        <field name="message_ids" widget="mail_thread"/>
                    </div>

 

  • Redémarrer le service Odoo 14 et mettez à jour l’application, puis allez jeter un coup d’œil sur le résultat de cette modification, c’est tout se passe bien, vous aurez l’image suivante : 
Héritage Classique Odoo

Conclusion

A travers les deux parties de cet article, nous avons mis le point sur les mécanismes utilisés pour faire étendre et/ou modifier les fonctionnalités des modèles Odoo existant, en utilisant le concept d’héritage.
Nous avons vue qu’Odoo présente Quartes types d’héritage qui permettent de personnaliser les applications Odoo existantes selon notre besoin, ou d’ajouter d’autres modules et applications sur mesure tout en gardant le code d’origine des applications de base.

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 !