Manipulation des enregistrements des modèles Partie 2 Sur 3

Introduction

Shell python d'Odoo

Dans l’article précédent, nous avons fait une introduction sur une partie très importante dans le processus de développement des applications Odoo, qui est la manipulation des enregistrements.
Nous avons compris l’importance de la classe d’environnement, et comment effectuer des recherches sur des enregistrements de n’importe quel modèle de la base de données de l’instance Odoo en cours.
Dans cette partie, nous continuons notre découverte, en faisant appel à des opérations courantes dans la manipulation des enregistrements, qui sont la lecture, la création, la copie,  la suppression et la mise à jour des enregistrements, avec des exemples concrets.
 
Rappel : pour accéder au terminal python d’Odoo exécutez la commande suivante sur le shell d’Ubuntu (Vous pouvez consulter l’article précédent pour plus de détailles). 
~$ ./cd odoo
~odoo$ ./odoo-bin shell -d  VotreBaseDeDonnees

Création de nouveaux enregistrements :

Pour créer un enregistrement, il faut tout d’abord avoir une référence sur le modèle qu’on souhaite, ajouter le nouvel enregistrement, préparer le dictionnaire contrant les valeurs du nouveau champ puis d’exécuter la méthode (create).
Les clés du dictionnaire du nouveau champ, représentent les noms des champs, et les valeurs sont aussi les valeurs de ce nouveau champ.
Il faut noter ici, que les valeurs obligatoire doivent être rensigné dans la définition du nouveau champ, dans notre cas le champ name du modèle res.partner est obligatoire, il faut donc le rensiger.
Pour illustrer la méthode d’ajout de nouveaux enregistrements, nous allons créer un nouveau partenaire, pour ce faire suivez les étapes suivantes :
>>> client=self.env['res.partner']  
>>> new_client=client.create({'name' : 'ADICOPS', 'is_company' :True, 'email', 'info@adicops.com'})
>>> new_client
res.partner(45,)

 Pour créer plusieurs enregistrements à la fois, il faut créer les dictionnaires relatifs aux nouveaux enregistrements, puis les passer comme une liste à la commande create, dans l’exemples suivants nous allons créer trois catégories des partenaires (ce sont les étiquettes, qu’on peut ajouter à nos partenaires).
Pour ce faire, nous préparons tous d’abord trois dictionnaires, ensuite nous appelons la méthode create, en la passant comme paramètre la liste de ces trois catégories :
>>> categorie=self.env['res.partner.category'] 
>>> categ1={'name' : 'Consultant Fonctionne'}
>>> categ2={'name'  : 'Consultant Technique'}
>>> categ3={'name'  : 'Consultant Technico-fonctionnel'}
>>> consltants=categorie.create([categ1,categ2,categ3])
>>> consltants
res.partner.category(21,22,23)
>>> c21=consltants.browse(21)
>>> c22=consltants.browse(22)
>>> c23=consltants.browse(23)
>>> c21.name
'Consultant Fonctionnel'
>>> c22.name
'Consultant Technique'
>>> c23.name
'Consultant Technico-Fonctionnel'

 
Dans les exemples précédents, nous avons créé des enregistrements, sans prendre en considération les relations entre les modèles.
Pour créer un enregistrement d’un modèle qui est en relation One2Many ou Many2many, nous avons deux cas principaux :
  • Cas 1 :  Le Tuple (0,0 ,dict_val) :  Dans ce cas un enregistrement sera créé et relié avec l’enregistrement principal Exemple :
     
    >>> categ4={'name' :'Catégorie 4'}
    >>> categ5={'name' :'Catégorie 5'}
    >>> categ6={'name' :'Catégorie 6'}
    >>> client=self.env['res.partner']
    >>> nouv_client=client.create({'name':'Company1','email':'info@newcopany.com',
    ... 'category_id':[
    ...                (0,0,categ4),
    ...                (0,0,categ5),
    ...                (0,0,categ6)
    ...               ]
    ...                     })
    >>> nouv_client
    res.partner(47,)
    >>> for r in nouv_client:
    ...     print (r.name)
    ...     for c in r.category_id:
    ...             print(c.name)
    ...
    Company1
    Catégorie 4
    Catégorie 5
    Catégorie 6
  • Cas 2 :  Le Tuple (6,0,id_list) : Dans ce cas une relation sera créée entre l’enregistrement qui vient d’être créé et les enregistrements qui existent à travers la liste de leurs id (Voir l’exemple ci-après).Exemple :
    >>> categories=self.env['res.partner.category'].search([]) 
    >>> categories
    res.partner.category(24, 27, 25, 28, 29, 26, 4, 7, 3, 6, 2, 5, 1)
    >>> client=self.env['res.partner']
    >>> nouv_client2=client.create({'name':'Company2','email':'info@newcopany2.com',
    ... 'category_id':[25,26,27]
    ... })
    >>> nouv_client2
    res.partner(48,)
    >>> for r in nouv_client2:
    ...     print (r.name)
    ...     for c in r.category_id:
    ...             print(c.name)
    ...
    Company2
    Catégorie 5
    Catégorie 6
    Catégorie 4

    Dans cet exemple, nous avons créé un nouveau partenaire (Company2), relié avec les catégories dont l’id est (25,26 et 27) dont leur nom est respectivement (Catégorie 5, Catégorie 5 et Catégorie 6.)
    Astuce : Pour connaitre le nom du modèle, activer le mode développeur, puis dans la vue formulaire de votre application, pointez la souris au-dessus du champ, une bulle affichera le nom du champ, et le modèle à qu’il appartient. 

Suppression des enregistrements : 

Pour supprimer un enregistrement, il suffit d’utiliser la méthode unlink().
Exemple :
>>> cli=self.env['res.partner']
>>> new_cli=cli.create({'name':'Client Temp'})
>>> new_cli
res.partner(49,)
>>> new_cli.unlink()
2021-07-16 06:31:44,470 3930 INFO O14Form odoo.models.unlink: User #1 deleted mail.message records with IDs: [189]
2021-07-16 06:31:44,971 3930 INFO O14Form odoo.models.unlink: User #1 deleted res.partner records with IDs: [49]
2021-07-16 06:31:45,028 3930 INFO O14Form odoo.models.unlink: User #1 deleted mail.followers records with IDs: [145]
True
 En supprimant l’enregistrement new_cli, les messages ainsi que les followers de ce partenaire seront aussi supprimés en cascade
Pour effectuer supprimer plusieurs enregistrements, il suffit  de boucles sur la selection à supprimer et d’appler à chaque fois la méthode unlik.
>>> categorie=self.env['res.partner.category'] 
>>> categ11={'name' : 'Categ11'}
>>> categ12={'name' : 'Categ12'}
>>> categ13={'name' : 'Categ13'}
>>> temp_cat=categorie.create([categ11,categ12,categ13])
>>> temp_cat
res.partner.category(30, 31, 32)
>>> for r in temp_cat:
...               r.unlink()
...
2021-07-16 06:37:47,088 3930 INFO O14Form odoo.models.unlink: User #1 deleted res.partner.category records with IDs: [30]
True
2021-07-16 06:37:47,126 3930 INFO O14Form odoo.models.unlink: User #1 deleted res.partner.category records with IDs: [31]
True
2021-07-16 06:37:47,152 3930 INFO O14Form odoo.models.unlink: User #1 deleted res.partner.category records with IDs: [32]
True….    

Copy (des enregistrements) 

Parfois en aura besoin de copier des enregistrements afin d’effectuer des opérations, des calculs, ou simplement de faire la duplication afin de ressaisir les informations inutilement.
 Pour copier un enregistrement on utilise la méthode copy, comme le montre l’exemple suivant :

>>> cli_a_c=self.env['res.partner'].browse(40)
>>> cli_a_c
res.partner(40,)
>>> cli_a_c.name
'Dwayne Newman')
>>> new_cli=cli_a_c.copy({'name':'Sta','email':'info@odooskills.com'})
>>> new_cli
res.partner(53,)
>>> new_cli.name
'Sta'
>>> new_cli.email
'info@odooskills.com'

 
Dans cet exemple, nous avons copié le partenaire dont l’id = 40, en remplaçant son nom par ‘Sta’ et l’email par info@odooskills.com.
Remarque : Dans le cas où le flag, copy=False, on peut pas faire la copie de l’enregistrement en cours

Mise à jour des enregistrements (écriture) 

Nous aurons certainement besoin de modifier le contenu de certains enregistrements, dans cette partie nous allons expliquer les différentes manières de faire ces updates.
Il existe trois méthodes pour effectuer des modifications sur vos enregistrements. 

* Accéder directement au champ et de mentionner la nouvelle valeur, (la méthode d’assignement d’un objet) :
Cette méthode ne marche que sur un seul enregistrement (singleton), pour s’assurer que nous le programme manipule un seul enregistrement, il faut ajouter l’instruction ou le décorateur self.ensure_one() avant la méthode qui fait la mise à jour de l’enregistrement en cours.
Dans le cas où il existe plusieurs enregistrement l’application de cette méthode va générer une erreur et le programme va arrêter el traitement.
Autre chose, on ne pas effectuer, dans ce type, une mise à jour à la fois, mais une seule affectation à la fois. Ci-dessous quelques exemples :
>>> client=self.env['res.partner'].browse(40)
>>> client.name
'Dwayne Newman'
>>> client.name='ADICOPS'
>>> client.name
'ADICOPS'
#Ici ça marche parce que nous avons exactement un seul enregistrement
>>> clients=self.env['res.partner'].browse([8,6,40])
>>> clients.name
Traceback (most recent call last):
  File "/home/stadev/odoo/odoo/models.py", line 4986, in ensure_one
    _id, = self._ids
ValueError: too many values to unpack (expected 1)
#Ici ça ne  marche pas parce que nous avons 03 enregistrements le programme va s’arrêter et afficher une erreur ! 


*Utiliser la méthode update :
Dans cette méthode, ne marche aussi que sur un seul enregistrement. Mais contrairement à la méthode précédente, on peut passer un dictionnaire contenant les champs à modifier avec leurs valeurs correspondantes. 
>>> client_8=self.env['res.partner'].browse([8])
>>> for r in client_8:
...     print(r.name,r.email,r.is_company,r.phone)
...
Joel Willis joel.willis63@example.com False (683)-556-5104
>>> new_vals={'name':'ADICOPS','email':'info@adicops.com','is_company':True,'phone':'O777322883'}
>>> client_8.update(new_vals)
>>> client_8
res.partner(8,)
>>> for r in client_8:
...     print(r.name,r.email,r.is_company,r.phone)
...
ADICOPS info@adicops.com True O777322883

 
* Utilise la méthode write
Cette méthode marche sur un seul enregistrement ainsi que sur plusieurs enregistrements. Dans l’exemple précédent on pouvait mettre la méthode write au lieu de update, le résultat sera le même :
>>> client_8.write(new_vals)
 
Dans le cas où on manipule plusieurs enregistrements à la fois, il faut suivez la méthode qui ressemble avec celle que nous avons expliquée sur la partie ajout de nouveaux enregistrements avec l’ajout d’autres options :

  • Cas 1 :  Le Tuple (0,0 ,dict_val) :  Dans ce cas un enregistrement sera créé et relié avec l’enregistrement principal 
  • Cas 2 :  Le Tuple (1,id ,dict_val) :  Cela va mettre à jour le champ relié dont l’Id est spécifié, avec les valeurs du dictionnaire mentionné
  • Cas 3 :  Le Tuple (2,id) :  cela va impliquer la suppression de l’élément relié ayant l’id mentionné, et entraine également sa suppression de la base de données .
  •  Cas 4:  Le Tuple (3,id) :  ici  l’élément relié  ayant l’id mentionné  sera supprimé de la relation, mais il ne sera pas supprimé de la BDD .
  • Cas 5:  Le Tuple (5, ) :  C’est pareil au Tuple (3,id)  pour tous les enregistrements relié au enregistrement principal.
  • Cas 6:  Le Tuple (6,0,id_list ) :  Dans ce cas les enregistrements reliés seront remplacés par ceux dont l’id est indiqué dans la liste : id_list.

Remarque : Vous pouvez s’insérer des exemples cités dans la partie création de nouveaux enregistrements, pour bien comprendre les différents cas possibles. 

Conclusion :

A travers cet article, nous avons compris comment effectuer des opérations très courantes sur les enregistrements d’un modèle.

Ces opérations concernaient la création, la copie, la suppression et la mise à jour, et s’appliquait sur un modèle donné.

Dans la troisième et dernière partie, de cet article, nous allons découvrir d’autres opérations, très importantes et courantes à savoir le filtrage, le mapping et le sortage,  ainsi que la composition d'enregistrements  qui peuvent être effectuée en jumelant deux ensembles d'enregistrements d'un modèle ou plus, tout cela avec des exemples pratiques pour bien comprendre cette partie indispensable aux développeurs Odoo.

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 !