Vous êtes sur la page 1sur 57

3EME PARTIE : INTEGRATION AVEC ODOO

I. Prise en main

Démarrer le serveur
• Créer une nouvelle base de données
ibam, mot
de passe ibam
• Se connecter à la nouvelle base
de donnée

10/12/2022 2
II. Configuration et paramétrage de Odoo

Aller dans application pour voir la liste


des modules gratuit de ODOO

Activer les menus de la configuration


avancée :
• Configuration -> Activer le mode
développeur
• Installer des modules

10/12/2022 3
III. Personnalisation d'un module existant de Odoo Via interface d'administration
Pour une simple modification au niveau d’un module sous odoo
on peut passez tous simplement par Des objets et vues
Configuration -> structure de la base de donnée ->
personnaliser et en crée les objets comme suite :
Modèle

10/12/2022 4
III. Personnalisation d'un module existant de Odoo Via interface d'administration
Configuration -> structure de la base de donnée -> Modèle

On peut simplement ajouter des attributs a modèle existants.


Les attribut personnels doivent avoir un préfixe X_

Apres que nous


terminons notre module
personnalisé on
enregistre le module en
question

10/12/2022 5
III. Personnalisation d'un module existant de Odoo Via interface d'administration

Les différents phase d’un ERP


Un ERP possède généralement trois phases de travail :

10/12/2022 6
III. Personnalisation d'un module existant de Odoo Via interface d'administration

Tous les modules Odoo sont créés au-dessous du répertoire Odoo/addons

Structure standard d’un module sous


odoo

A ce schéma, s’ajoute le dossier Sécurité qui est devenu un dossier obligatoire


10/12/2022 À partir de Odoo 12 7
IV. Développement spécifique d’un module : le code PYTHON
Structure d’un module Odoo
• Les étapes suivantes sont nécessaires pour créer un nouveau module :
• Créer un package python dans le répertoire /addons portant le nom de votre
module . __init__.py (required)
• Créer un fichier de description du module : _manifest _ .py (required)
• Créer le fichier Python contenant les modèles (Classes + Méthodes) (required)
Créer le dossier sécurty contenant les fichiers de la sécurité (fichier excel + fichier xml) (required)
• Créer des fichiers .XML pour définir les menus, les vues et les actions (required)
• Créer des fichiers .XML qui téléchargent des données de démonstration
• Créer éventuellement des rapports, ou des assistants (Wizard)
10/12/2022 8
IV. Développement spécifique d’un module : le code PYTHON

NB : dossier security est devenu obligatoire


10/12/2022 9
IV. Développement spécifique d’un module : le code PYTHON

init .py

• C'est le fichier qui permet a Odoo de charger notre module.


Le contenu de ce fichier est très simple :

import nom _module

10/12/2022 10
IV. Développement spécifique d’un module : le code PYTHON
Structure d’un module Odoo __manifest__.py
name : le nom de votre module ;
• version : la version du module ;
• category : la catégorie dans laquelle vous classez votre module ;
• sequence : c'est un nombre qui permet de définir l’ordre de votre module dans la liste des modules. 1, il sera en haut, 100 il sera
en bas
• author : l'auteur du module ;
• description : la description complète du module ;
• depends : les dépendances votre module ;
• data : les fichiers à charger ;
• installable : si votre module est installable ou non ;
• application : laissez à False. Votre module ne sera pas reconnu comme une application. C'est OpenERP qui délivre
les certificats qui qualifient votre module d'application ;
10/12/2022 11
• auto_install: laissez à False, nous l'installerons à la main,
IV. Développement spécifique d’un module : le code PYTHON
Exemple de fichier de description du module
{
'name' :"nom de module",
'author':"auteur",
'version':"0.1",
'description':"description… ",
'website':"site web ou blog si ilexiste … ",
'category':"catégorie de m odule",
'summary':"les m ots clef de description",
'sequence': :0,
'depends':[base],
'update_xml' :[# 'travaux_view .xm l',],
'demo_xml':[]
'installable':True,
'application':False,
'auto_install':False,
}
10/12/2022 12
IV. Développement spécifique d’un module : le code PYTHON
Les classes

Odoo est construit autour d'un framework appelé Open Object.


• Le Framework met en œuvre une couche complète de Mapping Objet Relationnel. ( parfois
appelée Object Service (OSV)
• Il permet aux développeurs de mettre en place l’architecture SQL de base.
• Les objets métier sont déclarés comme des classes Python qui héritent de la classe
models.Model, ce qui les rend une partie du modèle OpenObject modèle, et qui seront
automatiquement persistés par la couche ORM.

Exemple:
Class Employee(models.Model):
_name = 'nom_module.employee'
Nom = fields.Char(“nom de l'employée”)
Age = fields.Integer(“Age”
10/12/2022 13
IV. Développement spécifique d’un module : le code PYTHON
Les types des champs de l’ORM

Un objet peut avoir 3 types de champs :


• Simple : Integers, Floats, Date, Booleans, Char, Text, Binary…
• Relationnel : Représente les relations entre les objets (one2many, many2one, many2many)
• Fonctionnel : Des champs stocké ou non-stockés à la base de donnée, il sont calculés à la volé
comme des fonctions Python

10/12/2022 14
IV. Développement spécifique d’un module : le code PYTHON
Les types des champs de l’ORM

10/12/2022 15
IV. Développement spécifique d’un module : le code PYTHON
Les types des champs de l’ORM ; Exemple Many2one
Représente une relation vers le modèle courant

Class Employee(models.Model):

_name=”hr.employee”

Nom= fields.Char(“nom”)

Grade= fields.Many2one(¨hr.grade”, string=”grade”,ondelete=“cascade”)

Class Grade(models.Model):

_name=”hr.grade”

Name= fields.Char(“titre du grade”)

● ondelete= cascade ou set null , définit le comportement en cas de supression. Voir la doc de postgres
10/12/2022 16
IV. Développement spécifique d’un module : le code PYTHON
Les types des champs de l’ORM ; Exemple One2many

Class Employee(models.Model):
_name=”hr.employee”
name= fields.Char(“nom”)
Grade= fields.Many2one(comodel=¨hr.grade”, string=”grade”)
Conges = fields.One2many(hr.conge”, string=”employe”)
Class Conge(models.Model):
 NB: dans les version présidant on utilise ces
_name=”hr.conge”
termes:
name=fields.Char(“numero de reunion¨)  comodel_name= nom du modele oppose
 inverse_name= nom de la colonne qui
date_debut= fields.Date(“date début”)
représente cette classe dans le modele opposé
date_fin= fields.Date(“date début”)
employe= fields.Many2one(¨hr.employee”, string=”grade”)
10/12/2022 17
IV. Développement spécifique d’un module : le code PYTHON
Les types des champs de l’ORM ; Exemple Many2many

Class Employee(models.Model):
_name=”hr.employee”
Nom= fields.Char(“nom”)
Grade= fields.Many2one(¨hr.grade”, string=”grade”)
Reunions_ids =fields.Many2many('hr.reunion',relation='table_name', column1='col_name', column2='other_col_name')
Class Reunion(models.Model):
_name=”hr.reunion”
● relation: nom de la table relationnelle qui sera crée par
Date = fields.Date(“date”)
postgres
Lieu = fields.Char(“lieu de la réunion”) ● columns1: nom de la colonne gauche de la table relationnelle
● columns2: nom de la colonne droite de la table relationnelle
heure_début = fields.Datetime(“date début”)
heure_fin = fields.Datetime(“date début”)
10/12/2022 18
IV. Développement spécifique d’un module : le code PYTHON
Les types des champs de l’ORM ; Exemple de champs calculé
class subscription_type(models.Model):
_name="gym.type_subscription"
name=fields.Char(string="Nom",required=True)
base_cost=fields.Float(string="Prix de base",required=True)
mounthly_sub = fields.Float(string="Frais mensuels")
insurance_sub = fields.Float(string="Frais d'assurance")
with_insurance=fields.Boolean(string="Frais d'assurance inclus")
total_cost=fields.Float(string="Prix total", compute="_total_cost_compute", store=True, readonly=True )
total_sessions = fields.Integer("Nombre de séances",)

@api.one
@api.depends('base_cost','insurance_sub','mounthly_sub')
def total_cost_compute(self):
total =0.0
total = total + self.base_cost + 12*(self.mounthly_sub) + self.insurance_sub
self.total_cost = total

10/12/2022 19
IV. Développement spécifique d’un module : le code PYTHON
Les types des champs de l’ORM ; champs calculé
le décorateur Python @api.depends() qui modifie le comporte ment de la méthode qu'il précède de telle sorte qu'elle sera
appelée dès que l'un des champs passés en argument au décorateur sera modifié (ici, ‘base_cost', 'insurance_sub','mounthly_sub'
).
● les méthodes définies dans un modèle Odoo attendent en paramètre ( self ) un ensemble d'enregistrements (recordset). Par
conséquent, le corps de notre méthode devra parcourir tous les éléments de cet ensemble avec une boucle for afin d'affecter au
champ tota_cost la somme des atres champs (formule).
● Ainsi, la valeur du champ total_cost sera gérée automatiquement par Odoo et mise à jour dès que l'un des champs
'base_cost','insurance_sub','mounthly_sub' sera modifié
@api.one
@api.depends('base_cost','insurance_sub','mounthly_sub')
def total_cost_compute(self):
total =0.0
total = total + self.base_cost + 12*(self.mounthly_sub) + self.insurance_sub
10/12/2022 self.total_cost = total 20
IV. Développement spécifique d’un module : le code PYTHON
Les RECORDSET
● les méthodes définies dans un modèle Odoo attendent en paramètre ( self ) un ensemble
d'enregistrements (recordset).
● Par conséquent, le corps de toute méthode devra parcourir tous les éléments de cet ensemble

avec une boucle for afin d'affecter au champ tota_cost la somme des atres champs (formule).

class AModel(models.Model):
_name = 'a.model'
def a_method(self):
# self peut avoir n'importe quelle valeur entre 0 et tous les eregistrements de BDD
self.do_operation()
def do_operation(self):
print self # => a.model(1, 2, 3, 4, 5)
for record in self:
print record # => a.model(1), ensuite a.model(2), ensuite a.model(3), ...
10/12/2022 21
IV. Développement spécifique d’un module : le code PYTHON
L'ENVIRONNEMENT de L'ORM

L'environnement est un objet de l'ORM ( représenté par env ) qui stock toutes les données contextuels de l'utilisateur
courant : les objets, les modules, les droits d'accés, le curseur sur la base de données.
● Exemples
records.env.user
>>>res.user(3)
● Exemple d'acces aux données
self.env['res.partner']
>>> res.partner
● Exemple de recherche
self.env['res.partner'].search([['is_company', '=', True], ['customer', '=', True]])
>>> res.partner(7, 18, 12, 14, 17, 19, 8, 31, 26, 16, 13, 20, 30, 22, 29, 15, 23, 28, 74)

10/12/2022 22
IV. Développement spécifique d’un module : le code PYTHON
Les méthodes de l'ORM Odoo

En plus des champs, l'ORM fournit un ensemble de fonctions pour la manipulations des
enregistrements ( records ). Ces méthodes disponibles dans models.Model est sont accessible au
classes qui héritenet de celle-ci
● les méthodes définies dans un modèle Odoo attendent en paramètre ( self ) un ensemble d'enregistrements (recordset).
Search, write, browse, create, ensure_one

10/12/2022 23
IV. Développement spécifique d’un module : le code PYTHON
Les méthodes de l'ORM Odoo - search

Permet de faire des recherches sur les records par utilisation de domaine.
>>> self.search( [('is_company', '=', True), ('customer', '=', True)] )
res.partner(7, 18, 12, 14, 17, 19, 8, 31, 26, 16, 13, 20, 30, 22, 29, 15, 23, 28, 74
>>> self.search ( [('is_company', '=', True)] , limit=1)
● Les options de search :
limit : limit le nombre de résultats à la valur fournie
order : pour trier le resultat suivant un critére.
● Pour seulement compter le nombre de records , on peut utiliser la méthode search_count()

10/12/2022 24
IV. Développement spécifique d’un module : le code PYTHON
Les méthodes de l'ORM Odoo – create – write - browse

Create()
Prend en argument les champs du model et retourne un recordset contenant les record crées
>>> self.create({'name': "New Name"})
res.partner(78)
write()
C'est la mehode mise à jour, prend en argument une liste de champs avec les nouvelles valeurs à écrire.
>>>self.write({'name': "Newer Name"})
browse()
Prends les id de la bdd, (ou liste de id) et retourne un recordset.
>>> self.browse([7, 18, 12])
res.partner(7, 18, 12)
10/12/2022 25
IV. Développement spécifique d’un module : le code PYTHON
Les méthodes de l'ORM Odoo – create – write - browse

ref()
Méthode de l'environement qui retourne le record qui correspond à un id externe donnée en argument.
>>> env.ref('base.group_public')
res.groups(2)
>>> env.ref('client_1')
res.partner(73)

ensure_one()
Vérifie que le recordset est un singleton . Sinon une exception est levée
records.ensure_one()

10/12/2022 26
IV. Développement spécifique d’un module : le code PYTHON
Les domaines

Un domaine dans odoo est une liste de tuples qui représentent des critères de recherche ou de
filtration. Chaque critères est sous la forme : (field_name, operator, value)
field_name (str) : nom d'un champ du modèle.
operator (str) : opérateur de comparaison (< > = != ,like,not like,ilike,in,not in,...)
Value : valeur du champ, doit être comparable au type du champ.
[('name','=','ABC'),('is_company', '=', True)]

10/12/2022 27
IV. Développement spécifique d’un module : le code PYTHON
L'Héritage dans Odoo

Il existe trois façons d'etendre une classe dans Odoo, chacune se traduira par la création ou
non d'une nouvelle table dans la base de données :
● Créer un nouveau modéle en ajoutant de nouveaux champs au modéle d'origine , mais en
laissant celui ci intact.
_name =”res.partner”
_inherit = “res.partner”
● Etendre un modéle en le remplaçant par un nouveau .
_name =”gym.member”
_inherit = “res.partner”
● Partager les propriétes d'un modéle avec un autre nouvellement crée.
_name =”gym.member”
10/12/2022 28
_inherits = “res.partner, hr.employee....”
IV. Développement spécifique d’un module : le code PYTHON
L'Héritage dans Odoo

10/12/2022 29
IV. Développement spécifique d’un module : le code PYTHON
Les décorateurs

@api.one
Souvenez-vous que, par défaut, l'argument self des méthodes d'un modèle Odoo est
un recordset, un ensemble d'enregistrements et nous devrions normalement parcourir
cet ensemble avec une boucle for .
Le décorateur @api.one nous évite cela. Lorsque nous l'utilisons, nous sommes
certains que self est un enregistrement simple et nous n'avons plus besoin de boucle
dans le corps de notre méthode.

@api.one
def _check_name(self):
if self.search([('name', '=ilike', self.name), ('id', '!=', self.id)]):
raise exceptions.ValidationError("Le nom doit être unique.")
10/12/2022 30
IV. Développement spécifique d’un module : le code PYTHON
Les décorateurs

@api.multi
Le décorateur @api.multi est utilisé pour des fonctions ou on veut boucler sur
les records.
@api.multi
def calcul_duree_session(self):
for session in self.session_ids:
session.attendee_ids = self.attendee_ids
return {}

10/12/2022 31
IV. Développement spécifique d’un module : Les vues dans Odoo
Les vues sont un moyen pour représenter les objets sur le navigateur du client.
Plusieurs vues peuvent être déclarées pour le même objet et peuvent être
utilisées suivant leur priorités.
les types de vues dans odoo sont:
 Formulaire (form views)
 Arbre (tree views et list views)
 Graph
 Kanban
 Calendar
 Gantt
 Graph

10/12/2022 32
IV. Développement spécifique d’un module : Les vues dans Odoo
Structure d'une Vue Pour déclarer une vue il faut utiliser le modèle "ir.ui.view"
<record model="ir.ui.view" id="ID_Vue">
<field name="name">nom_de_la_vue</field>
<field name="model">nom_du_model_representé</field>
<field name="type">form</field>
<field name="arch" type="xml">
...
<!--contenu de la vue: <form>, <tree>, <graph>, ... -->
...
</field>
</record>
Où: • type: type de vue (par défaut form)
10/12/2022 33
• arch: l’architecture de la vue et qui est de type XML
IV. Développement spécifique d’un module : Les vues dans Odoo
La vue formulaire (Form) L‘élément racines est form
• Il existe plusieurs option de mise en forme et de contrôle de la forme des champs
<form string="Idea form">
<group colspan="4">
<group colspan="2" col="2">
<separator string="General stuff" colspan="2"/>
<field name="name"/>
<field name="inventor_id"/>
</group>
<group colspan="2" col="2">
<separator string="Dates" colspan="2"/>
<field name="active"/>
<field name="invent_date" readonly="1"/>
</group>
<notebook colspan="4">
<page string="Description">
<field name="description" nolabel="1"/>
</page>
</notebook>
<field name="state"/>
10/12/2022 </group> 34
</form>
IV. Développement spécifique d’un module : Les vues dans Odoo
La vue Liste (arbre)
La structure d'une vue arbre est :
<record model="ir.ui.view" id="ID_unique_de_la_vue">
<field name="name">payement.tree</field>
<field name="model">gym.payement</field>
<field name="arch" type="xml">
<tree string="paiement client" >
<field name="montant"/>
<field name="date"/>
</tree>
</field>
</record>

10/12/2022 35
IV. Développement spécifique d’un module : Les vues dans Odoo
La vue Recherche (serch view)

La vue recherche est utilisée par odoo pour faire des recherches ou des groupages sur le modéle en cours. Elle contient la
liste des champs sur lequel on veut permettre la recherche.
• Si aucune search vue n'est déclarée, odoo crée une par défaut qui contient uniquement le champ name :
<search>
<field name="name"/>
<field name="solde"/>
<filter domain="[('isblocked', '<', 'True')]"/>
</search>

10/12/2022 36
IV. Développement spécifique d’un module : Les vues dans Odoo
La vue Kanban La structure basique d'un vue kanban est la suivante.
Il est possible d'étendre la mise en forme par l'utilisation d'un template qweb personnalisé
<record model="ir.ui.view" id="view_external_id">
<field name="name">View Name</field>
<field name="model">nom_du_model</field>
<field name="type">kanban</field>
<field name="arch" type="xml">
<kanban>
<field name="color"/>
<field name="prix"/>
<field name="date"/>
<templates>
<!- votre template Qwebpersonnalisé -->
</templates>
</kanban>
</field>
</record>

10/12/2022 37
IV. Développement spécifique d’un module : Les vues dans Odoo
La vue Kanban – (exemple vue des produits)
<record id="hr_job_view_kanban" model="ir.ui.view">
<field name="name">hr.job.kanban</field>
<field name="model">hr.job</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click">
<div>
<strong><field name="name"/></strong>
</div>
<div>
<span><field name="department_id"/>&amp;nbsp;</span>
</div>
<div>
<span>Vacancies : <field name="expected_employees"/></span>
<span t-att-class="record.state.raw_value == 'recruit' and 'float-right badge badge-success' or 'float-right badge badge-danger'">
<field name="state"/>
</span>
</div>
</div>
</t>
</templates>
</kanban>
</field>
10/12/2022 </record> 38
IV. Développement spécifique d’un module : Les vues dans Odoo
La vue Calendrier (Calendar)
La structure de la vue calendrier est la suivantes
<calendar string="Meetings" date_start="start" date_stop="stop" date_delay="duration“ all_day="allday" display="[name]"
color="color_partner_id“ avatar_model="res.partner">
<field name="name"/>
<field name="user_id"/>
</calendar>

String : titre de la vue


date_start : champ de début de l'évènement (obligatoire)
date_stop : champ de fin de l'évènement
date_delay : champ durée
all_day: plage de temps utilisée por représenter l'évènement ( ex : "allday")
display : champ affiché sur la vue (ex "[name]" )
color: couleur (optionnel)
mode : mode d'affichage :day , week, month

10/12/2022 39
IV. Développement spécifique d’un module : Les vues dans Odoo
La vue graph (cube BI)
La structure de la vue graph est la suivantes
<graph string=”Analyse des ventes" type="pivot" stacked="True">
<field name="ventes" type="row"/>
<field name="vendeur_id" type="col"/>
<field name="planned_revenue" type="measure"/>
</graph>
 type: mode d'affichage (pivot, bar, pie, line) (par défaut=bar)
Chaque champ field peut avoir un des attributs suivants
 row : groupé sur l'axe x (dimension)
 col : groupé sur l'axe y (dimension)
 measure : sera agrégé ( somme )
 si rien n'est indiqué le champ prendra “measure” par défaut
10/12/2022 40
IV. Développement spécifique d’un module : Les vues dans Odoo
Modifier une vue existante dans Odoo
Il est possible de modifier une vue existante dans odoo par l'ajout de nouveaux champs ou la suppression de champs, pour cela om utilise
l'expression xpath qui indique l'emplacement du changement dans la structure d'origine de la vue.
L´expression xpath prend cette forme:
<xpath expr="//chemin" position="position">
...
</xpath>
 Chemain : expression qui indique l'emplacement de l'élement choisi
 Position : peut avoir les valeurs:
 inside : insertion en fin
 after : insertion au début
 before : insertion avant
 replace : remplacement par ce qui suit
10/12/2022 41
 attribute : modification des attributs du champ
IV. Développement spécifique d’un module : Les vues dans Odoo
Modifier une vue existante dans Odoo
Ajout au début
<xpath expr="//sheet/group" position="after">
...
</xpath>
Ajout en fin
<xpath expr="//div[@class='page']" position="inside">

</xpath>
Modification des attribut
<xpath expr="//field[@name='bom_line_ids']/tree/field[@name='date_stop']“ position="attributes">
<attribute name="invisible">True</attribute>
10/12/2022 </xpath> 42
IV. Développement spécifique d’un module : Les vues dans Odoo
Les actions Une action est un événement déclenché suite à un click.
Pour déclarer une action utilisateur, il faut utiliser le Modéle "ir.actions.act_window"
Syntaxe:
<record model="ir.actions.act_window" id="actionId">
<field name="name">NomDAction</field>
<field name="res_model">TableBDD</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>

Où :
• id : identifiant de l’action (unique)
• model: type d’élément, ici c’est une action
• name : le nom de l’action (obligatoire)
• res_model : le model (objet) python sur lequel pointe l’action (obligatoire)
• view_mode : lise des vues autorisées.
• view_type : type de vue utilisée par défaut
10/12/2022 43
IV. Développement spécifique d’un module : Les vues dans Odoo
Les menus

Les menu permettent d'exécuter des actions en particulier accéder à une vue
Les menues doivent être déclarés dans un fichier xml
Syntaxe :
<menuitem name="U_Menu" id="menu_id" parent="main_menu" action="action_id"/>
Où :
 name : le nom qui sera affiché sur l'interface
 id : identifiant unique de l'enregistrement dans la base de données.
 parent : id du menu parent
 action : id de l'action qui sera exécutée.

10/12/2022 44
IV. Développement spécifique d’un module : Rapports dans odoo

Odoo utilise un moteur de reporting basé sur Qweb.


• Tous les rapports sous odoo sont des vues Html. La conversion vers PDF se fait à travers un programme tiérce :
wkhtmltopdf
• Pour créer un rapport lié à un model de odoo on besoin de :
- déclarer le rapport
- définir un format d'impression (optionnel)
- définir un Template ( vue ) du rapport avec qweb
• Lorsque le rapport utilise des données depuis plusieurs models, il faut aussi
écrire une classe python personnalisé pour réaliser ces accès.
• Ces éléments seront placés dans un dossier report du module

10/12/2022 45
IV. Développement spécifique d’un module : Rapports dans odoo
Le format d'impression ( Paperformat )

Pour chaque rapport pdf , il faut définir le format de sortie impression. Les format définis par défaut sont
diponibles dans le fichier :
/odoo/addons/base/data/report_paperformat_data.xml
Il est possible d'étendre les formats existants ou de créer de nouveaux

10/12/2022 46
IV. Développement spécifique d’un module : Rapports dans odoo
Le format d'impression ( Paperformat )
exemple de format
<record id="paperformat_euro“ model="report.paperformat">
<field name="name">A4</field>
<field name="default" eval="True" />
<field name="format">A4</field>
<field name="page_height">0</field>
<field name="page_width">0</field>
<field name="orientation">Portrait</field>
<field name="margin_top">40</field>
<field name="margin_bottom">28</field>
<field name="margin_left">7</field>
<field name="margin_right">7</field>
<field name="header_line" eval="False" />
<field name="header_spacing">35</field>
<field name="dpi">90</field>
</record>
10/12/2022 47
IV. Développement spécifique d’un module : Rapports dans odoo
Déclaration du rapport
La déclaration du rapport se fait dans une action report,
voici l'exemple
id : id externe du rapport
<report name : nom du rapport
id="action_contribution_register“ model: nom du modéle
model="hr.contribution.register“ report_type: le type de sortie qweb-pdf or qweb-html
string="PaySlip Lines By Conribution Register“ report_name: le nom du fichier
report_type="qweb-pdf"
name="hr_payroll.report_contributionregister“
file="hr_payroll.report_contributionregister“ goups : liste de groupes Ayant acces au rapport
menu="False" attachment_use : indique le stokage ou non du fichier dans la
/> bdd
attachment : expression python

10/12/2022 48
IV. Développement spécifique d’un module : Rapports dans odoo
Template du rapport
Tout rapport est une vue déclarée dans un Template. Qui représente la mise en page du rapport : Entête , Pied
de page, et contenu (page)
Un Template peut faire appel à un Template externe ou hériter d'un Template existant.
La forme minimal enviable d'un template est :
<template id="report_invoice">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="report.external_layout">
<div class="page">
<h2>Report title</h2>
<p>This object's name is <span t-field="o.name"/></p>
</div>
</t>
</t> Faire appel dans le rapport au Template “external_layout” va inclure le header et le
</t> pied de page par défaut de la société, la partie utile du rapport est construite dans
</template>
10/12/2022 l‘ élément <div class=”page”> 49
IV. Développement spécifique d’un module : Rapports dans odoo
Template du rapport

Certaines variables sont accessible depuis le corps du rapport :


Docs : listes des enregistrement du modèle actuel
doc_ids : liste des ids du model actuel
User
res_company
time

• L'accés et le formatage des champs dans un rapport se fait avec des directive Qweb. <t>

10/12/2022 50
IV. Développement spécifique d’un module : Rapports dans odoo
Le langage Qweb
Qweb est le moteur de rendu utilisé par défaut dans odoo. Il permet de génere
des fragments de pages HTML.
Les directives Qweb sont définies comme des attributs XLM préfixés avec :
t- pour les instances ,
t-if pour les conditions
Exemple :
<t t-if="condition">
<p>Test</p>
</t>
Si la condition est True va s'afficher
<p>Test</p>
10/12/2022 51
IV. Développement spécifique d’un module : Rapports dans odoo
Le langage Qweb – affichage des données

Qweb permet d'afficher en HTML la valeur des champs et expressions avec la directive t-esc

esc prend en argument une expresion, fait l'évaluation et affiche le résultat en html.

Exemple:

<p><t t-esc="value"/></p>

résultat

<p>42</p>

10/12/2022 52
IV. Développement spécifique d’un module : Rapports dans odoo
Le langage Qweb – les conditions
Qweb permet de réaliser des conditions et d'afficher un champs en html en fonction du résultat
Exemple :
<div>
<t t-if="condition">
<p>ok</p>
</t>
</div>
Si la condition est true, le Html généré est:
<div>
<p> ok </p>
</div>
Il est possible d'enchainer plusieusrs condition avec les directives t-if t-elif t-else
Sinon :
comme dans l'exemple suivant:
<div>
<div>
</div>
<p t-if="user.birthday == today()">Happy bithday!</p>
<p t-elif="user.login == 'root'">Welcome master!</p>
<p t-else="">Welcome!</p>
10/12/2022 </div> 53
IV. Développement spécifique d’un module : Rapports dans odoo
Le langage Qweb – les boucles
QWeb permet de faire des itérations sur la liste d'enregistrements ou la liste des champs d'un
modèle avec la directive t-foreach.
● t-foreach peu boucler sur des liste ou des clé de dictionnaires
<t t-foreach="[1, 2, 3]" t-as="i">
<p><t t-esc="i"/></p>
</t>
Sera affiché en html :
<p>1</p> Un exemple équivalent
<p>2</p> <p t-foreach="[1, 2, 3]" t-as="i">
<t t-esc="i"/>
<p>3</p> </p>
10/12/2022 54
IV. Développement spécifique d’un module : Rapports dans odoo
Le langage Qweb – les variables
QWeb permet la création de variable dans le template : pour garder le résultat d'un
calcul, pour réutiliser la même valeur plusieurs fois...
● La directive t-set et t-value sont utilisées pour créer et initialiser une variable.
Exemple:
<t t-set="foo" t-value="2 + 1"/>
<t t-esc="foo"/>

va afficher 3
● Si t-value n'est pas utilisé, la variable prendra comme valeur le code du noeud html
courant. Exemple :
<t t-set="foo">
<li> ok </li>
</t>
<t t-esc="foo"/>
10/12/2022 55
Va afficher <li> ok </li>
IV. Développement spécifique d’un module : Rapports dans odoo
Le langage Qweb – Mise en page des rapports

Le formatage et la mise en page de rapports Qweb est possible en utilisant le css et html directement dans

le corps du Template. Odoo permet de réaliser une mise en page normalisée des rapport par l'utilisation de

quelques classe css prédéfinies.

10/12/2022 56
FIN
Vous avez des questions sur le cours ?

Vous aimerez peut-être aussi