Chapitre 6 : Création d’un module sur Odoo (part 14)

Hériter de la méthode de création

Dans Odoo, l’héritage de la méthode create() permet de modifier ou d’étendre le comportement de la méthode de création d’un enregistrement dans un modèle. Lorsque vous héritez de la méthode create(), vous pouvez ajouter des actions supplémentaires avant ou après la création de l’enregistrement.

L’héritage de la méthode create() se fait en utilisant le décorateur @api.model suivi du nom de la méthode à hériter. Vous pouvez définir votre propre méthode create() dans votre modèle hérité et utiliser le décorateur pour indiquer qu’il s’agit d’une méthode de modèle.

Voici un exemple d’héritage de la méthode create() dans le modèle HospitalPatient :

from odoo import models, fields, api

class HospitalPatient(models.Model):
    _name = 'hospital.patient'
    _description = "Patient Records"

    name = fields.Char(string='Name', required=True)
    age = fields.Integer(string='Age')
    is_child = fields.Boolean(string='Is Child?')
    notes = fields.Text(string='Notes')
    gender = fields.Selection([('male', 'Male'), ('female', 'Female')], string='Gender')

    @api.model
    def create(self, values):
        # Actions supplémentaires avant la création de l'enregistrement
        # ...

        # Appel à la méthode create() du modèle parent
        record = super(HospitalPatient, self).create(values)

        # Actions supplémentaires après la création de l'enregistrement
        # ...

        return record

Dans cet exemple, nous avons défini notre propre méthode create() dans le modèle HospitalPatient. Nous utilisons le décorateur @api.model pour indiquer qu’il s’agit d’une méthode de modèle. À l’intérieur de la méthode, nous effectuons des actions supplémentaires avant et après l’appel à la méthode create() du modèle parent (super(HospitalPatient, self).create(values)). Ces actions supplémentaires peuvent inclure la validation des données, l’ajout de valeurs par défaut, la création d’enregistrements connexes, etc.

En utilisant l’héritage de la méthode create(), vous pouvez personnaliser le processus de création d’enregistrements dans votre modèle en ajoutant des fonctionnalités spécifiques ou en modifiant le comportement existant selon vos besoins.

Voici une activité qui vous guide pour hériter de la méthode create() afin de sélectionner automatiquement la valeur « Female » pour le champ gender après chaque création d’un enregistrement dans le modèle HospitalPatient :

Activité :

  1. Ouvrez le fichier contenant le modèle HospitalPatient (patient.py) dans votre éditeur de code.
  2. Ajoutez l’import from odoo import models, fields, api.
  3. Recherchez la classe HospitalPatient qui définit le modèle HospitalPatient.
  4. Ajoutez le décorateur @api.model au-dessus de la méthode create() pour indiquer qu’il s’agit d’une méthode de modèle.
  5. À l’intérieur de la méthode create(), appelez d’abord la méthode super().create(values) pour exécuter la création de l’enregistrement.
  6. Après l’appel à la méthode parent, ajoutez une condition pour vérifier si le champ gender n’a pas déjà une valeur définie (if 'gender' not in values).
  7. Si le champ gender est vide, définissez la valeur « Female » pour le champ gender dans le dictionnaire values (values['gender'] = 'female').
  8. Enregistrez le fichier.

Exemple de code :

from odoo import models, fields, api

class HospitalPatient(models.Model):
    _name = 'hospital.patient'
    _description = "Patient Records"

    name = fields.Char(string='Name', required=True)
    age = fields.Integer(string='Age')
    is_child = fields.Boolean(string='Is Child?')
    notes = fields.Text(string='Notes')
    gender = fields.Selection([('male', 'Male'), ('female', 'Female')], string='Gender')

    @api.model
    def create(self, vals_list):
        for fals in vals_list:
            vals['gender']='female'
        return super(HospitalPatient, self).create(vals_list)

Dans cet activité, nous avons hérité de la méthode create() dans le modèle HospitalPatient. Après l’appel à la méthode parent super().create(vals_list), nous vérifions si le champ gender n’a pas déjà une valeur définie dans le dictionnaire values. Si le champ gender est vide, nous définissons la valeur « Female » pour le champ gender en modifiant le dictionnaire values à l’aide de vals['gender'] = 'female'.

Lorsque vous créez un nouvel enregistrement dans le modèle HospitalPatient, si aucun genre n’est spécifié, le champ gender sera automatiquement défini sur « Female ». Assurez-vous de recharger le module Odoo après avoir effectué ces modifications pour que les changements prennent effet.

Activité :

  1. Accédez à l’interface d’administration d’Odoo.
  2. Naviguez vers le menu « Patients » et ouvrez la liste des patients.
  3. Cliquez sur le bouton « Créer » pour ajouter un nouveau patient.
  4. Saisissez les informations nécessaires pour le patient, telles que le nom, l’âge et les notes.
  5. Ne spécifiez pas de valeur pour le champ gender, laissez-le vide.
  6. Enregistrez le patient en cliquant sur le bouton « Enregistrer ».
  7. Recherchez le patient que vous venez de créer dans la liste des patients.
  8. Ouvrez le patient pour afficher les détails.
  9. Vérifiez l’état du champ gender. Il devrait être automatiquement défini sur « Female » car vous avez hérité de la méthode create() pour le faire.

En suivant ces étapes, vous pourrez ajouter un patient sans spécifier de valeur pour le champ gender et vérifier que celui-ci est automatiquement défini sur « Female » après la création de l’enregistrement. Cela confirme que la méthode create() héritée a fonctionné comme prévu.

La méthode create() est une méthode standard d’Odoo qui est utilisée pour créer de nouveaux enregistrements dans un modèle. Lorsqu’elle est héritée dans un modèle personnalisé, vous pouvez la modifier et ajouter votre propre logique avant ou après la création des enregistrements.

Dans cet exemple de code :

def create(self, vals_list):
    for vals in vals_list:
        vals['gender'] = 'female'
    return super(HospitalPatient, self).create(vals_list)

Nous redéfinissons la méthode create() dans le modèle HospitalPatient. Lorsque cette méthode est appelée pour créer de nouveaux enregistrements, nous effectuons les actions suivantes :

  1. Nous parcourons chaque dictionnaire vals dans la liste vals_list.
  2. Pour chaque dictionnaire vals, nous mettons à jour la valeur du champ gender en lui attribuant la valeur « female ». Cela signifie que chaque nouvel enregistrement créé aura automatiquement la valeur « female » pour le champ gender.
  3. Ensuite, nous appelons la méthode create() de la classe parente en utilisant super(HospitalPatient, self).create(vals_list). Cela garantit que le processus de création standard d’Odoo est exécuté avec les modifications que nous avons apportées. La méthode super().create() crée effectivement les enregistrements dans la base de données.

En résumé, cette modification de la méthode create() garantit que chaque fois qu’un enregistrement est créé dans le modèle HospitalPatient, le champ gender est automatiquement défini sur « female ». Cette approche vous permet d’ajouter une logique personnalisée avant ou après la création des enregistrements pour répondre à des besoins spécifiques.