Vous êtes sur la page 1sur 22

Technical Training - Exercises

Release 6.0.2

OpenERP
2011-10-14

Contents
1

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

3
3
3
3
4
4
4
4

Crer un module OpenERP


2.1 Composition dun module . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Structure dun module . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Objet de service - ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Attributs osv.osv prdfinis pour les objets mtiers . . . . . . . . . . . . . .
2.4 Types de champs de lORM . . . . . . . . . . . . . . . . . . . . . . . . . . .
Attributs communs supports par tous les champs (optionnels sauf indication)
Champs simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5 Noms de champs rservs/spciaux . . . . . . . . . . . . . . . . . . . . . . .
2.6 Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.7 Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dclaration dune action . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

5
5
5
6
6
6
6
7
7
7
7
8

Crer des vues : bases


3.1 Dclaration gnrique dune vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Les vues Formulaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
lments des vues formulaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8
8
8
8

Relations entre objets


4.1 Champs relationnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10
10

Hritage
5.1 Mcanismes dhritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Attributs pr-dfinis pour les objets mtiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Hritage des vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11
11
11
12

Configuration
1.1 Open Source RAD avec OpenObject . . . . . . . . . . . . . . . . . . . . .
1.2 Installer OpenERP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Architecture dOpenERP . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Installation par les paquets . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4 Installation partir des sources . . . . . . . . . . . . . . . . . . . . . . . .
Procdure typique de rcupration des sources (sur Linux bas sur Debian)
1.5 Cration de la base de donnes . . . . . . . . . . . . . . . . . . . . . . . .

Mthodes de lORM
6.1 Champs fonctionnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2 Attributs osv.osv pr-dfinis pour les objets mtier . . . . . . . . . . . . . . . . . . . . . . . . . .

12
12
13

Vues avances
7.1 Liste & Arbre . . . .
7.2 Calendriers . . . . .
7.3 Vues de Recherche .
7.4 Diagrammes de Gantt
7.5 Graphiques . . . . .

14
14
14
15
15
15

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

Workflows

16

Scurit
9.1 Mcanismes de contrle daccs bass sur les groupes . . . . . . . . . . . . . . . . . . . . . . . .
ir.model.access.csv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17
17
17

10 Assistants
10.1 Objets wizard (osv_memory) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.2 Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.3 Excution dun assistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18
18
18
18

11 Internationalisation

19

12 Rapports
12.1 Rapports imprims . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Expressions utilises dans OpenERP dans les modles de rapport . . . . . . . . . . . . . . . . . .
12.2 Tableaux de bord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19
19
20
21

13 WebServices
13.1 Exemple Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21
21

Based on a real case, this chapter covers: building an OpenERP module and its interface, Views,
Reports, Workflows, Security aspects, Wizards, WebServices, Internationalization, Rapid Application Development (RAD) and Performance Optimization.

1 Configuration
1.1 Open Source RAD avec OpenObject
OpenERP est un Outil de Gestion dEntreprise moderne, publi sous license AGPL, et fournissant les fonctionnalits CRM, Ressources Humaines, Ventes, Comptabilit, Production, Inventaires, Gestion de Projet, ... Il est bas
sur OpenObject, un framework modulaire, volutif et intuitif de RAD (Rapid Application Development) crit en
Python.
OpenObject fournit une bote outils complte et modulaire pour rapidement crer des fonctionnalits
: support de lORM (mapping objet-relationnel), interfaces bases sur des templates MVC (Modle-VueContrleur), un systme de gnration de rapport, internationnalisation automatise et bien plus.
Python est un langage de programmation de haut-niveau, idal pour du RAD, combinant puissance et
syntaxe claire et un noyau de taille rduite par sa conception.
Tip:

Liens utiles
Site principal avec les tlchargements dOpenERP : www.openerp.com
Documentation fonctionnelle et technique : doc.openerp.com
Ressources de la communaut : www.launchpad.net/open-object
Serveur dintgration : test,openobject.com
Apprendre Python: doc.python.org
Plateforme dE-Learning OpenERP : edu.openerp.com

1.2 Installer OpenERP


OpenERP est distribu sous la forme de paquets/dinstalleurs pour la plupart des plateformes, mais peut bien
entendu tre install depuis le code source sur nimporte quelle plateforme.
Architecture dOpenERP
OpenERP utilise le paradigme bien connu client-serveur, avec diffrentes pices logicielles agissant en tant que
client et serveur dpendant de la configuration dsire.
OpenERP fournit un client lourd (GTK+) pour toutes les plateformes et une interface web accessible en utilisant
nimporte quel navigateur Web rcent.
Tip: Procdure dinstallation
La procdure dinstallation dOpenERP est susceptible dvoluer (dpendances et autres), assurez-vous alors de
toujours vrifier la documentation spcifique (package et sur le site Web) pour les dernires procdures. Voir
http://doc.openerp.com/install.

1.3 Installation par les paquets


Windows
Linux

Mac

Installeur tout-en-un et installeurs spars pour le serveur, le client, le serveur web sont sur le
site web
Les paquets openerp-server et openerp-client sont disponibles via le gestionnaire de paquets
(e.g. Synaptic sur Ubuntu) OU en utilisant BaZaar bzr branch lp:openerp (ou openerp/trunk
pour la version trunk) une fois identifi sur Launchpad, ensuite, cd openerp (cd trunk dans la
version trunk) et ./bzr_set.py
Regardez en ligne pour un paquet dinstallation pour le client GTK, ainsi que des tutoriels pour
installer le serveur (e.g. devteam.taktik.be)

1.4 Installation partir des sources


Il y a deux alternatives :
1. utiliser une archive fournie sur le site web,
2. ou obtenir directement les sources en utilisant Bazaar (gestionnaire de contrle de source distribu).
Vous aurez galement besoin dinstaller les dpendances requises (PostgreSQL et quelques librairies Python - voir
la documentation sur doc.openerp.com).
Note: OpenERP tant bas sur Python, aucune compilation nest ncessaire.

Procdure typique de rcupration des sources (sur Linux bas sur Debian)
$ sudo apt-get install bzr
$ bzr branch lp:openerp
$ cd openerp && python ./bzr_set.py

# installation de bazaar
# rcupration des sources
# chercher le code et lancer linstallation

1.5 Cration de la base de donnes


Aprs linstallation, lancer le serveur et le client. Depuis le client GTK, utilisez le menu Fichier > Base de donnes
> Nouvelle base de donnes pour crer une nouvelle base de donnes (le mot de passe super-admin par dfaut est
admin). Chaque base de donnes a ses propres modules et sa propre configuration.
Note: Des donnes de dmonstration peuvent aussi tre installes.

2 Crer un module OpenERP


2.1 Composition dun module

Un module peut contenir les lments suivants :


Objet Mtier : dclars en tant que classes Python hritants de la classe OpenObject osv.osv, la persistance
de ces ressources est compltement gre par OpenObject,
Donnes : fichiers XML/CSV contenant des mta-donnes (dclaration de vues et de workflow), des donnes de configuration (paramtrage des modules) et des donnes de dmonstration (optionnelles mais recommendes pour tester),
Assistants : formulaire interactif tats utiliss pour aider les utilisateurs, souvent disponibles comme
action contextuelle sur les ressources du systme,
Rapports : RML (format XML). Modles de rapports MAKO ou OpenOffice, dans lesquels sont intgres
les donnes du systme de nimporte quel objet mtier et gnre des rapports aux formats HTML, ODT ou
PDF.

2.2 Structure dun module


Chaque module est contenu dans son propre rpertoire dans le rpertoire server/bin/addons ou dans un
autre rpertoire daddons, configur lors de linstallation du serveur.
Note: Configurer les emplacements des addons
Par dfaut, le seul rpertoire daddons connu par le serveur est server/bin/addons. Il est possibe dajouter
de nouveaux addons en 1) les copiant dans server/bin/addons, ou en crant des liens symboliques vers
chacun deux dans ce rpertoire, ou 2) spcifier un autre rpertoire contenant des addons au serveur. Cette
dernire mthode peut tre effectue soit en lanant le serveur avec loption addons-path= option, ou en configurant cette option dans le fichier openerp_serverrc, gnr automatiquement sour Linux dans votre rpertoire
personnel lorsque le serveur est lanc avec loption save. Vous pouvez fournir plusieurs rpertoires loption
addons_path en les sparant par des virgules.
Le fichier __init__.py est la dclaration en Python du module, car OpenERP est aussi un module Python. Il
contient toutes les instructions dimportation de tous les fichiers Python, sans lextension .py. Par exemple, si le
module contient un unique fichier Python nomm mymodule.py :
import mymodule

Le fichier __openerp__.py est rellement le fichier qui dclare le module OpenERP. Il est obligatoire dans chaque
module. Il contient uniquement un dictionnaire Python avec de nombreuses informations importantes, comme le
nom du module, sa description, la liste des autres modules OpenERP dont linstallation est requise pour que le
module courant fonctionne correctement Il contient aussi, entre autres, une rfrence tous les fichiers de donnes

(xml, csv, yml, ...) du module. Sa structure gnrale est la suivante (voir la documentation officielle pour une
description complte du fichier) :
{

"name": "MyModule",
"version": "1.0",
"depends": ["base"],
"author": "Author Name",
"category": "Category",
"description": """
Description text
""",
data: [
mymodule_view.xml,
#tous les autres fichiers de donnes, lexception des donnes de dmonstration et de
],
demo: [
#fichiers contenant les donnes de dmonstration
],
test: [
#fichiers contenant les donnes de test
],
installable: True,
active: False,
certificate: certificate,

Exercice 1 - Cration dun module


Crez le module vide Open Academy, avec un fichier __openerp__.py. Installez-le dans OpenERP.

2.3 Objet de service - ORM


Composant cl de OpenObject, lobjet de service (OSV) implmente une couche complte de mapping objetrelationnel, librant ainsi les dveloppeurs davoir crire du SQL basique. Les objets mtier sont dclars dans
des classes Python hritants de la classe osv.osv, leur permettant de faire partie du modle OpenObject, et comme
par magie persistant grce la couche ORM.
Attributs osv.osv prdfinis pour les objets mtiers

2.4 Types de champs de lORM


Les objets peuvent contenir 3 types de champs : simple, relationnel et fonctionnel. Les types simples sont integer,
float, boolean, string, etc. Les champs relationnels reprsentent les relations entre objets (one2many, many2one,
many2many). Les champs fonctionnels ne sont pas stocks dans la base de donnes mais sont calculs la vole
avec des fonctions Python.
Attributs communs supports par tous les champs (optionnels sauf indication)
string : Libell du champ (requis)
required : True si obligatoire
readonly : True si non ditable
help : Bulle daide

select : 1 pour inclure le champ dans la vue de recherche et optimiser le filtre des listes (avec un index en
base de donnes)
context : Dictionnaire contenant des paramtres contextuels (pour les champs relationnels)
Champs simples
boolean(...) integer(...) date(...) datetime(...) time(...)
start_date: fields.date(Start Date)
active: fields.boolean(Active)
priority: fields.integer(Priority)
char(string,size,translate=False,..) text(string, translate=False,...) [Champs bass sur du texte]
translate: True si la valeur du champ peut tre traduite par les utilisateurs
size: taille maximale pour les champs char (41,45)
float(string, digits=None, ...) [valeur flottante avec prcision arbitraire et ratio]
digits: tuple (precision, scale) (58) . Si digits nest pas spcifi, cest un float, pas un type
decimal.

2.5 Noms de champs rservs/spciaux


Quelques noms de champs sont rservs un comportement prdfinis dans OpenObject. Certains dentre eux
sont crs automatiquement par le systme, et dans ce cas, nimporte quel champ qui portera ce nom sera ignor.
id
name

...

identifiant unique dans le systme pour lobjet (cr par lORM, ne pas lajouter)
dfinit la valeur utilise par dfaut pour afficher les enregistrements dans les listes,
etc. si manquant, utilisez _rec_name pour spcifier un autre champ utiliser dans ce
but
...

Exercice 2 - Dfinir une classe


Dfinir une nouvelle classe Course dans le module openacademy.

2.6 Menus
Llment menuitem est un raccourci pour dclarer un enregistrement ir.ui.menu et le connecter avec laction
correspondante via un enregistrement ir.model.data.
<menuitem id="menu_id" parent="parent_menu_id" name="label" icon="icon-code"
action="action_id" groups="groupname1,groupname2" sequence="10"/>

2.7 Actions
Les actions sont dclares comme des enregistrements normaux et peuvent tre dclenches de 3 faons :
1. en cliquant sur les lments de menu lis une action spcifique
2. en cliquant sur des boutons dans des vues, si ces boutons sont connects des actions
3. en tant quactions contextuelles sur un objet

Dclaration dune action


<record model="ir.actions.act_window" id="action_id">
<field name="name">action.name</field>
<field name="view_id" ref="view_id"/>
<field name="domain">[list of 3-tuples (max 250 characters)]</field>
<field name="context">{context dictionary (max 250 characters)}</field>
<field name="res_model">object.model.name</field>
<field name="view_type">form|tree</field>
<field name="view_mode">form,tree,calendar,graph</field>
<field name="target">new</field>
<field name="search_view_id" ref="search_view_id"/>
</record>

Exercice 3 - Dfinir de nouvelles entres de menu


Dfinissez de nouvelles entres de menu pour accder aux cours et aux sessions sous lentre de menu
OpenAcademy; on devrait tre en mesure de 1) afficher la liste de tous les cours et 2) crer/modifier des
cours.

3 Crer des vues : bases


Exercice 1 - Personnaliser une vue depuis lditeur de vues de linterface web
Crez une vue liste pour lobjet Course , affichant le nom du cours ainsi que sa description.
Les vues forment une hirarchie. Plusieurs vues du mme type peuvent tre dclares sur le mme objet, et
seront affiches selon leurs priorits. En dclarant une vue hrite, il est possible dajouter ou de supprimer des
fonctionnalits dans une vue.

3.1 Dclaration gnrique dune vue


<record model="ir.ui.view" id="view_id">
<field name="name">view.name</field>
<field name="model">object_name</field>
<field name="type">form</field> # tree,form,calendar,search,graph,gantt
<field name="priority" eval="16"/>
<field name="arch" type="xml">
<!-- view content: <form>, <tree>, <graph>, ... -->
</field>
</record>

3.2 Les vues Formulaires


Les vues Formulaires permettent la cration et la modification des ressources, et correspondent aux lments
<form>.
lments des vues formulaires
Attributs communs tous les lments :
string: libell de llment
nolabel: 1 pour cacher le libell du champ

colspan: nombre de colonnes sur lesquelles le champ doit staler


rowspan: nombre de lignes sur lesquelles le champ doit staler
col: nombre de colonnes que cet lment doit allouer ses lments fils
invisible: 1 pour cacher compltement cet lment
eval: evalue ce code Python en tant que contenu de llment (le contenu est une chane de caractres par
dfaut)
attrs: dictionnaire Python dfinissant des conditions dynamiques sur ces attributs : readonly, invisible,
required bass sur des tuples de recherche sur les valeurs dautres champs
Field

Widgets automatiques dpendants du type de champ correspondant. Attributs :


string: libell du champ, aussi pour la recherche (surcharge le nom du champ)
select: 1 pour afficher le champ en recherche normale, 2 pour la recherche
avance seulement
nolabel: 1 pour cacher le libell du champ
required: surcharge lattribut required du champ
readonly: surcharge lattribut readonly du champ
password: 1 pour cacher les caractres saisis dans ce champ
context: code Python dclarant un dictionnaire de contexte
domain: code Python dclarant une liste de tuples pour restreindre les valeurs
on_change: appel dune mthode Python dclencher quand une valeur est
change
completion: 1 pour activer lauto-completion des valeurs lorsque cela est possible
groups: liste des groupes (spars par des virgules) autoriss voir ce champ
widget: selectionne un widget alternatif (one2many_list, many2many, url,
email, image, float_time, reference, text_wiki, text_html, progressbar)

properties
button

widget dynamique affichant toutes les proprits disponibles (pas dattributs)

separator
newline
label
group

ligne horizontale de sparation pour structurer les vues, avec un libell optionnel
paramtre virtuel pour complter la ligne courante de la vue
libell ou lgende libre dans le formulaire
utilis pour organiser les champs en groupes avec un libell optionnel (ajoute un
cadre)

notebook, page

widget cliquable associ des actions. Attributs spcifiques :


type: type de button : workflow (dfaut), object ou action
name: signal du workflow, nom de la fonction (sans les parenthses) ou
action appeler (selon le type)
confirm: message texte de confirmation lorsque le bouton est cliqu
states: liste des tats (spars par des virgules) pour lesquels le bouton est
visible
icon: icone optionnelle (toutes les icnes GTK STOCK e.g. gtk-ok)

les lments notebook sont des gestionnaires donglets pour les lments page. Attributs :
name: libell de longlet
position: position de longlet dans son container (inside, top, bottom, left,
right)

Exercice 2 - Personnaliser les vues liste et formulaire via XML


Crez vos propres vues liste et formulaire pour lobjet Course. Les donnes affiches doivent tre :
Dans la vue liste, le nom du cours;
Dans la vue formulaire, le nom et la description du cours.

Exercice 3 - Onglets
Dans la vue formulaire des cours, affichez la description dans un onglet, de cette manire, il sera facile
dajouter dautres onglets par la suite, contenant des informations additionnelles.

4 Relations entre objets


Exercice 1 - Crer des classes
Crez les classes Session et Attendee et ajoutez un menu et une action pour afficher les sessions. Une session
a un nom, une date de dbut, une dure (en jours) et un nombre de siges. Un stagiaire a un nom, qui nest
pas requis.

4.1 Champs relationnels


Attributs commun supports par les champs relationnels
domain: restriction optionnelle sous la forme darguments pour la mthode search (voir search())
many2one(obj, ondelete=set null,...) (50) : Relation vers un objet parent (en utilisant une cl trangre)

obj: _name de lobjet de destination (requis)


ondelete: gestion de la suppression, e.g. set null, cascade, restrict voir la documentation
de PostgreSQL
one2many(obj, field_id, ...) (55) : Relation virtuelle vers de multiples objets (inverse du many2one)

obj: _name de lobjet de destination (requis)


field_id: nom du champ du many2one inverse, i.e. la cl trangre correspondante (requis)
many2many(obj, rel, field1, field2, ...) (56) : Relation multiple bi-directionnelle entre des objets

obj: _name de lobjet de destination (requis)


rel: table de relation utiliser (requis)
field1: nom du champ dans la table de relation enregistrant lid de lobjet courant (requis)
field2: nom du champ dans la table de relation enregistrant lid de lobjet cible (requis)

10

Exercice 2 - Relations many2one, one2many


En utilisant les types de champs de lORM (one2many, many2one), modifiez les classes Course, Session et
Attendee afin de reflter leurs relations avec dautres objets, dfinies comme suit :

Exercice 3 - Modifiez les vues


Modifiez les vues liste et formulaire de lobjet Course et crez les vues pour lobjet Session. Les donnes
affiches pour lobjet Course :
Dans la vue liste, le nom du cours et le responsable de ce cours;
Dans la vue formulaire, le nom et le responsable en haut, ainsi que la description du cours dans un
onglet et les sessions lies dans un deuxime onglet.
Pour lobjet Session :
Dans la vue liste, le nom de la session et les cours lis;
Dans la vue formulaire, tous les champs de lobjet Session.
Le nombre de donnes afficher tant important, essayez dorganiser les vues formulaires de telle sorte que
linformation quelles contiennent parasse claire.

5 Hritage
5.1 Mcanismes dhritage

Attributs pr-dfinis pour les objets mtiers


_inherit
_inherits

_name de lobjet mtier parent (pour lhritage simple)


pour lhritage multiple / : dictionnaire faisant correspondre le _name de lobjet
mtier parent au nom des champs correspondant aux cls trangres utiliser

11

5.2 Hritage des vues


Les vues existantes doivent tre modifies travers des vues hrites, jamais directement. Une vue hrite
rfrence sa vue parente en utilisant le champ inherit_id, et doit ajouter ou modifier des lments existants dans
cette vue en les rfrenant par des expressions XPath, en spcifiant la position approprie.
position

inside: plac dans la partie correspondante (dfaut)


before: plac avant la partie correspondante

replace: remplace la partie correspondante


after: plac aprs la partie correspondante

Tip: La rfrence XPath peut tre trouve www.w3.org/TR/xpath


<!-- improved idea categories list -->
<record id="idea_category_list2" model="ir.ui.view">
<field name="name">id.category.list2</field>
<field name="model">ir.ui.view</field>
<field name="inherit_id" ref="id_category_list"/>
<field name="arch" type="xml">
<xpath expr="/tree/field[@name=description]" position="after">
<field name="idea_ids" string="Number of ideas"/>
</xpath>
</field>
</record>

Exercice 1 - Ajouter un mcanisme dhritage


En utilisant lhritage de classe, crez une classe Partner qui modifie la classe Partner existante, ajoutant
un champ boolen is_instructor, et la liste des sessions o ce partenaire sera prsent. En utilisant lhritage
des vues, modifiez la vue formulaire existante afin dafficher les nouveaux champs.

Exercice 2 - domain
Ajoutez un mcanisme la vue formulaire des Session afin de permettre lutilisateur de choisir linstructeur
seulement parmi les partenaires dont le champ Instructeur est Vrai.

Exercice 3 - domain
Nous dcidons maintenant de crer de nouvelles catgories de partenaires : Professeur/Professeur Niveau 1
and Professeur/Professeur Niveau 2. Modifiez le domaine dfini prcdemment pour autoriser lutilisateur
choisir linstructeur parmi les partenaires dont le champ Instructeur est Vrai ou ceux qui appartiennent
lune des catgories que nous avons dfinies.

6 Mthodes de lORM
6.1 Champs fonctionnels
function(fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type=float, fnct_search=None, obj=None,
method=False, store=False, multi=False, ...) : Functional field simulating a real field, computed rather than
stored
fnct [fonction pour calculer la valeur du champ (requis)]

12

def fnct(self, cr, uid, ids, field_name, arg, context) retourne un dictionnaire { idsvaleurs } avec
des valeurs du type type
fnct_inv [fonction utilise pour crire une valeur dans ce champ]
def fnct_inv(obj, cr, uid, id, name, value, fnct_inv_arg, context)
type : type du champ simul (nimporte quel type part function)
fnct_search [fonction utilise pour effectuer une recherche sur ce champ]
def fnct_search(obj, cr, uid, obj, name, args) retourne une liste de tuples pour le search(), e.g.
[(id,in,[1,3,5])]
obj : _name model du champ simul si cest un champ relation
store, multi : mcanismes doptimisation (voir usage dans la section Performances)
related(f1, f2, ..., type=float, ...) [Champ raccourci quivalent parcourir des relations chaines]
f1,f2,... : champs lis pour atteindre la cible (f1 requis) (51)
type : type du champ cible
property(obj, type=float, view_load=None, group_name=None, ...) [Attribut dynamique avec des droits
daccs spcifiques]
obj : objet (requis)
type : type du champ quivalent
Exercice 1 - Champs fonctionnels
Ajoutez un champ fonctionnel la class Session, qui contient le pourcentage de places restantes dans une
session. Affichez ce pourcentage dans les vues liste et formulaire des sessions. Une fois ceci fait, essayez de
lafficher sous la forme dune barre de progression.

Exercice 2 - Mthodes Onchange


Modifiez la vue formulaire ainsi que la classe reprsentant les sessions de telle sorte que le pourcentage de
places restantes se rafrachisse lorsque le nombre de places ou le nombre de stagiaires change, sans avoir
enregistrer les modifications.

Exercice 3 - warning
Modifiez cette mthode onchange pour lever un avertissement lorsque le nombre de places est infrieur 0.

6.2 Attributs osv.osv pr-dfinis pour les objets mtier


_constraints
_sql_constraints

liste de tuples dfinissant les contraintes Python, de la forme (fonc_name, message,


champs).
liste de tuples dfinissant les contraintes SQL, de la forme (nom, sql_def, message).

Exercice 4 - Ajouter des contraintes


Ajoutez une containte qui contrle que la description et lintitul dun cours ne sont pas les mmes.

13

Exercice 5 - Ajouter une contrainte SQL


Ajoutez une contrainte SQL pour contrler quun cours a un nom unique.

Exercice 6 - Ajouter une option de duplication


Depuis que nous avons ajout une contrainte afin que le nom dun cours soit unique, il nest plus possible
dutiliser la fonction dupliquer (Formulaire > Dupliquer). R-implmenter votre propre mthode copy
qui permet de dupliquer un objet Cours, en changeant le nom original en Copie de [nom original].

Exercice 7 - Objets actifs Valeurs par dfaut


Dfinissez la valeur par dfaut du champ start_date la date du jour. Ajoutez un champ active dans la classe
Session et fixez la session comme tant active par dfaut.

7 Vues avances
7.1 Liste & Arbre
Les vues Liste contiennent des lments field, sont cres avec le type tree et ont un lment <tree> parent.
<tree string="Idea Categories" toolbar="1" colors="blue:state==draft">
<field name="name"/>
<field name="state"/>
</tree>

Exercice 1 - Coloration de liste


Modifiez la vue liste des Sessions de telle manire que les sessions qui ont dur moins de 5 jours soient en
bleu et celles qui ont dur plus de 15 jours soient en rouge.
Note: duration champ Attention ! Si le champ duration nest pas dclar dans la vue, le client naura pas
conscience de son existence. Cela produira une erreur.

7.2 Calendriers
Vues utilises pour afficher des champs date en tant quvnements dans un calendrier (lment parent <calendar>).
Attributs

lments autoriss

color: nom du champ pour la segmentation par couleurs


date_start: nom du champ contenant la date de dbut de lvnement
day_length: longueur en heures dune journe du calendrier (dfaut: 8)
date_stop: nom du champ contenant la date de fin de lvnement OU
date_delay: nom du champ contenant la dure de lvnement

field (pour dfinir le libell de chaque vnement du calendrier)

<calendar string="Ideas" date_start="invent_date" color="inventor_id">


<field name="name"/>
</calendar>

14

Exercice 2 - Vue Calendrier


Ajoutez une vue Calendrier lobjet Session autorisant lutilisateur voir les vnements associs
lOpen Academy.

7.3 Vues de Recherche


Les vues de Recherche sont utilises pour personnaliser le bandeau de recherche situ en haut des vues Listes,
sont dclares avec le type search et ont un lment parent <search>. Aprs avoir dfini la vue de recherche avec
un id unique, ajoutez-la laction ouvrant la vue liste en utilisant le champ search_view_id de laction.
lments autoriss

field, group, separator, label, search, filter, newline, properties


filter : permet de dfinir des boutons pour filtrer dans le domaine
ajouter un attribut contextuel aux champs cre des widgets qui modifient le
contexte de recherche (utile pour des champs sensibles au contexte, e.g. prix
dpendants de listes de prix)

Exercice 3 - Vues de recherche


Ajoutez une vue de recherche contenant : 1) un champ pour rechercher des cours bas sur leur nom et
2) un bouton pour filter les cours pour lesquels lutilisateur courant est le respondable. Mettre ce dernier
slectionn par dfaut.

7.4 Diagrammes de Gantt


Graphique en barres typiquement utilis pour afficher le planning dun projet (lment parent <gantt>).
Attributs
lments autoriss

same as <calendar>
field, level
level : utilis pour dfinir les niveaux dans le diagramme de Gantt avec le
champ utilis comme libell pour le sous-niveau

<gantt string="Ideas" date_start="invent_date" color="inventor_id">


<level object="idea.idea" link="id" domain="[]">
<field name="inventor_id"/>
</level>
</gantt>

Exercice 4 - Diagramme de Gantt


Ajouter un diagramme de Gantt permettant lutilisateur de voir les sessions planifies lies au module Open
Academy. Les sessions devront tre groupes par formateur.

7.5 Graphiques
Vues utilises pour afficher des graphiques statistiques (lment parent <graph>).

15

Attributs

lments autoriss

type: type de graphique : bar, pie (par dfaut)


orientation: horizontal, vertical
field, avec un comportement spcifique :
le premier champ de la vue sera laxe X, le deuxime laxe Y, le troisime
laxe Z
2 champs sont requis, le troisime est optionnel
lattribut group dfinit le champ GROUP BY (affect 1)
lattribut operator permet de dfinir quel oprateur daggrgation utiliser
sur les autres champs lorsquun champ est group (+,*,**,min,max)

<graph string="Total idea score by Inventor" type="bar">


<field name="inventor_id" />
<field name="score" operator="+"/>
</graph>

Exercice 5 - Vue graphique


Ajoutez un graphique qui affiche, pour chaque cours, le nombre de participants sous la forme dun graphique
barres. Vous pouvez le crer soit pour lobjet Course, soit pour lobjet Session.

8 Workflows
Les workflows sont des modles associs aux objets mtiers dcrivant la dynamique de la socit. Les workflows
sont aussi utiliss pour suivre des processus qui voluent avec le temps.
Exercice 1 - Workflow statique
Crez un attribut state qui sera utilis pour dfinir un workflow pour lobjet Session. Une session peut
avoir trois tats : Draft (dfaut), Confirmed et Done. Ajoutez un champ (en lecture seule) afin de visualiser
ltat et des boutons pour changer dtat dans la vue formulaire des Sessions. Les transitions valides sont :
Draft -> Confirmed
Confirmed -> Draft
Confirmed -> Done
Done -> Draft
Une commande gnrant une facture et un bon dexpdition est un exemple de workflow utilis dans OpenERP.

Les workflows peuvent tre associs nimporte quel objet dans OpenERP et sont entirement paramtrables. Les
workflows sont utiliss pour structurer et grer les cycles de vies des objets mtiers ou des documents, et dfinir

16

des transitions, des dclencheurs, etc. avec des outils graphiques. Les workflows, les activits (noeuds ou actions)
et les transitions (conditions) sont dclars, comme dhabitude, dans des enregistrements XML. Les jetons qui
naviguent dans les workflows sont nomms workitems.
Exercice 2 - diteur dynamique de workflow
En utilisant lditeur de workflow, crez le mme workflow que celui dfini prcdemment pour lobjet
Session. Transformez la vue formulaire des Sessions de telle sorte que les boutons changent ltat dans le
workflow.
Note: Workflow on create Un workflow associ une session est cr pendant la cration de cette session.
Par consquent, il ny a pas dinstances du workflow associes aux instances des sessions cres avant que lon
dfinisse le workflow.

Exercice 3 - Server actions


Crez des server actions et modifiez le prcdent workflow pour re-crer le mme comportement que
prcdemment, mais sans utiliser les mthodes Python de la classe Session.

Exercice 4 - Workflows en XML


Installez le module base_module_record. Utilisez-le pour exporter le workflow cr dans lditeur de workflow dans un fichier XML que vous pouvez incorporer dans votre module.

9 Scurit
Les mcanismes de contrle daccs doivent tre combins pour atteindre une politique de scurit cohrente.

9.1 Mcanismes de contrle daccs bass sur les groupes


Les groupes sont crs comme des enregistrements normaux sur le modle res.groups et laccs aux menus via la
dfinition de ces derniers. Cependant mme sans menu, les objets peuvent rester accessible indirectement, cest
pourquoi des vritables permissions par objet (create,read,write,unlink) doivent tre dfinies pour les groupes.
Elles sont gnralement insres via des fichiers CSV prsents dans les modules. Il est galement possible de
restreindre les accs certains champs ou objets en utilisant lattribut groups sur les champs.
ir.model.access.csv
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create",
"perm_unlink"
"access_idea_idea","idea.idea","model_idea_idea","base.group_user",1,1,1,0
"access_idea_vote","idea.vote","model_idea_vote","base.group_user",1,1,1,0

Exercice 1 - Ajouter des contrles daccs depuis linterface de OpenERP


Crez un nouvel utilisateur John Smith. Crez ensuite un groupe OpenAcademy / SessionRead avec les
accs en lecture sur les objets Session et Attendee.

17

Exercice 2 - Ajouter des contrles daccs depuis des fichiers de donnes dans votre module
En utilisant un fichier de donnes XML, crez un groupe OpenAcademy / Manager, sans y dfinir de droits
daccs pour le moment (crez simplement un groupe vide).

Exercice 3 - Ajouter des contrles daccs depuis des fichiers de donnes dans votre module
Utilisez un fichier CSV pour ajouter les droits de lecture, criture, cration et suppression sur les objets
Course, Session et Attendees au groupe OpenAcademy / Manager. Vous pouvez aussi crer des droits
associs aucun groupe, comme un accs en lecture seule sur les objets Course et Session.

10 Assistants
10.1 Objets wizard (osv_memory)
Les assistants dcrivent des sessions interactives tats avec lutilisateur par le biais de formulaires dynamiques.
Les assistants utilisent la persistance en mmoire osv_memory pour permettre de construires des assistants depuis
des objets mtiers et des vues normales, sans les enregistrer dans la base de donnes. Les objets en mmoire sont
crs en hritant de la classe osv.osv_memory.
Exercice 1 - Dfinir la classe de lassistant
Nous voulons crer un assistant qui permettra lutilisateur de crer des stagiaires pour une session particulire, ou pour une liste de sessions en une seule fois. Tout dabord, cet assistant fonctionnera uniquement
pour une session la fois. Pour faire cela, nous crons un objet assistant (hritant de osv.osv_memory)
avec une relation many2one sur lobjet Session et une relation one2many avec un nouvel objet Attendee
(en mmoire) avec un champ name et une relation many2one vers lobjet Partner. Dfinissez la classe create_attendee_wizard et implmentez sa structure.

10.2 Vues
Les assistants utilisent des vues normales et leurs boutons peuvent utiliser un attribut special=cancel afin de
fermer la fentre de lassistant lorsquil est cliqu.

10.3 Excution dun assistant


De tels assistants sont lancs par le biais denregistrements action normaux, avec une cible spciale utilise pour
ouvrir lassistant dans une nouvelle fentre.
Exercice 2 - Rendre lassistant disponible depuis un lment du menu
Crez un lment de menu et laction ncessaire pour utiliser lassistant.

Exercice 3 - Personnaliser la vue formulaire


Personnalisez la vue formulaire pour afficher tous les champs de la classe.

18

Exercice 4 - Crer les mthodes


Crez la mthode action_add_attendee dans la classe create_attendee_wizard et ajouter un bouton dans la
vue formulaire pour lappeler. Ajoutez galement un bouton Annuler qui ferme la fentre de lassistant.

Exercice 6 - Lier lassistant la barre contextuelle


Liez lassistant la barre contextuelle du modle des sessions.

Exercice Supplmentaire - Assistant sur de multiples enregistrements


Rendez lassistant capable dajouter des stagiaires dans plusieurs sessions la fois.

11 Internationalisation
Chaque module peut fournir ses propres traductions dans le dossier i18n, en ayant des fichiers nomms
LANGUE.po o LANGUE est le code de ce langage, ou une combinaison de la langue et le pays dans le
cas o ils diffrent (e.g. pt.po or pt_BR.po). Les traductions seront automatiquement charges par OpenERP
pour toutes les langues actives. Les dveloppeurs utiliseront toujours lAnglais en crant un module, puis exporteront les termes du modules en utilisant la fonctionnalit dexport de POT gettext de OpenERP (Administration>Traductions>Exporter une traduction sans spcifier de langue ) pour crer le fichier template POT du module,
et ensuite en driver les fichiers PO traduits. La plupart des environnements intgrs de dveloppement ont des
modes ou des plugins pour diter et merger les fichiers PO/POT.
Tip: Le format GNU gettext (Portable Object) utilis par OpenERP est intgr LaunchPad, devenant ainsi une
plateforme collaborative de traduction.
|- idea/
|- i18n/
| - idea.pot
| - fr.po
| - pt_BR.po
| (...)

#
#
#
#
#

La racine du module
Fichiers de traduction
Fichier Template (export depuis OpenERP)
Traduction Franaise
Traduction Portuguaise du Brsil

Tip: Par dfaut, lexport POT dOpenERP extrait seulement les libells dans les fichiers XML ou dans la dfinition des champs dans le code Python, mais nimporte quelle chane Python peut tre traduite de cette manire en
lencadrant par la mthode tools.translate._ method (e.g. _(Label) )

Exercice 1 - Traduire un module


Slectionnez une seconde langue pour votre installation dOpenERP. Traduisez votre module en utilisant les
fonctionnalits fournies par OpenERP.

12 Rapports
12.1 Rapports imprims
Les rapports dans OpenERP peuvent tre rendus de diffrentes manires :

19

Rapports personnaliss: ces rapports peuvent tre directement crs depuis linterface client, pas de programmation requise. Ces rapports sont reprsents par des objets mtiers (ir.report.custom)
Rapport personnaliss de haute qualit utilisant openreport: pas de programmation requise mais il faut
crire 2 petits fichiers XML :
un template qui indique les donnes sur lesquelles portera le rapport
un fichier XSL : feuille de style RML
Rapports cods en dur
Modles OpenOffice Writer
Il existe plusieurs moteurs de rendu de rapports dans OpenERP pour produire des rapports depuis diffrentes
sources et dans plusieurs formats.

Expressions utilises dans OpenERP dans les modles de rapport


Predefined expressions :
objects contient la liste des enregistrements imprimer
data vient de lassistant lanant le rapport
user contient lutilisateur courant (comme un browse())
time donne accs au module Python time
repeatIn(list,var,tag) repte llment parent nomm tag pour chaque objet dans la liste, rendant lobjet
disponible en tant que variable dans chaque boucle
setTag(tag1,tag2) remplace la balise RML tag1 par tag2
removeParentNode(tag) supprime llment RML parent tag
formatLang(value, digits=2, date=False, date_time=False, grouping=True, monetary=False) peut tre utilis pour formater une date, un temps ou un montant selon la locale
setLang(lang_code) fixe la langue et la locale courante pour les traductions
Exercice 1 - Installer le plugin OpenOffice
Installez le module report designer et ajouter le plugin OpenERP dans OpenOffice.

Exercice 2 - Crer un nouveau rapport


Crez un rapport pour lobjet Session, affichant pour chaque session, son nom, sa date de dbut, sa dure, le
pourcentage de remplissage, le responsable ainsi que la liste des stagiaires.

20

Exercice 3 - RML
Exportez le rapport OpenOffice en un fichier RML, ajoutez-le votre module et ajoutez une action lobjet
Session afin dimprimer le rapport.

Exercice 4 - RML
Amliorez votre rapport. Empchez la ligne start date dapparatre dans le rapport si aucune valeur ne lui
est associe, et afficher le pourcentage de siges restants en rouge si celui-ci est infrieur 10.

12.2 Tableaux de bord


Exercice 5 - Dfinir un tableau de bord
Dfinissez un tableau de bord contenant la vue graphique que vous avez cre, le calendrier des sessions et
la liste des cours (commutable en vue formulaire). Ce tableau de bord doit tre disponible depuis un menu,
et automatiquement affich dans le client web quand le menu principal OpenAcademy est slectionn.

13 WebServices
Le module de web-service offre une interface commune pour tous les web-services :
SOAP
XML-RPC
NET-RPC
Les objets mtiers peuvent aussi tre accds depuis le mcanisme dobjets distribus. Il peuvent tous tre modifis
par les interfaces clients avec les vues contextuelles.
OpenERP est accessible depuis des interfaces XML-RPC, pour lesquelles des librairies existent dans de nombreux
langages.

13.1 Exemple Python


import xmlrpclib
# ... define HOST, PORT, DB, USER, PASS
url = http://%s:%d/xmlrpc/common % (HOST,PORT)
sock = xmlrpclib.ServerProxy(url)
uid = sock.login(DB,USER,PASS)
print "Logged in as %s (uid:%d)" % (USER,uid)
# Create a new idea
url = http://%s:%d/xmlrpc/object % (HOST,PORT)
sock = xmlrpclib.ServerProxy(url)
args = {
name : Another idea,
description : This is another idea of mine,
inventor_id: uid,
}
idea_id = sock.execute(DB,uid,PASS,idea.idea,create,args)

21

Exercice 1 - Ajouter un nouveau service au client


crivez un programme Python capable denvoyer des requtes XML-RPC un PC ayant lanc OpenERP (le
votre ou celui de votre formateur). Ce programme doit permettre dafficher toutes les sessions existantes, le
nombre de siges correspondants et de crer une nouvelle session pour un des cours. Dans ce cas, demandez
au serveur de crer les objet Session.

22

Vous aimerez peut-être aussi