• Créer un package python dans le répertoire /addons portant le nom de votre module
• Créer un fichier de description du module : __openerp__.py
• Créer le fichier Python contenant les models (Classes + Méthodes)
• Créer des fichiers .XML pour représenter les menus, les vues et les actions
• Créer des fichiers .XML qui téléchargent des données de démonstration
• Créer éventuellement des rapports, des assistants (Wizard) ou des flux de travail (Workflow).
Fichier obligatoire:
__init__.py : Initialisation du package Python
__openerp__.py : La fiche descriptive du module
model.py : Les classes Python, les objets du module
model_view.xml : Les vues (Formulaires, listes, graph,…), menus et actions
les fichiers optionnels :
demo : Données de test et de démonstration
i18n : Internationalisation Fichiers de traduction
report : Définition des rapports
security : Déclaration des groupes et des droits d’accès
workflow : Définition des workflow
wizard : Les workflow
__init__.py :
C'est le fichier permet de charger notre module. Le contenu de ce fichier est très simple :
import nom_module
Exemple : import travaux
import nom_module
Exemple : import travaux
__openerp__.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 fera apparaître 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 modules dont votre module dépend ;
• 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 ;
• auto_install : laissez à False, nous l'installerons à la main.
• version : la version du module ;
• category : la catégorie dans laquelle vous classez votre module ;
• sequence : c'est un nombre qui fera apparaître 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 modules dont votre module dépend ;
• 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 ;
• auto_install : laissez à False, nous l'installerons à la main.
__openerp__.py [exemple] :
# -*- coding: utf-8 -*-{
"name": u"Formation- Gestion des travaux",
'complexity': "level 1",
"version": "1.0",
"depends": ["base","mail"],
"author": "Ait-MLouk Addi",
"sequence":1,
"website" : "http://freelance-it.esy.es/",
'icon': '/formation_travaux/static/src/img/icon.png',
"category": "Vertical functionality",
'summary' : 'Travaux, Taches',
'description' : """
Traveaux, Taches
==================================
Ce module, vous permet de gérer tous les travaux, taches, incidants ,
et de nombreuses autres fonctionnalités nécessaires à la gestion
de maintenance.
Fonctionnalités principales
-------------
* Gestion Travaux
""",
"init_xml": [],
'update_xml': [
'security/ir.model.access.csv',
'travaux_view.xml',
'travaux_menu.xml',
],
'demo_xml': [],
'application': False,
'installable': True,
'active': False,
}
L’architecture d’une classe (Model) : [traveau.py]
from openerp.osv import osv, fields
import time, datetime
class formation_work(osv.osv):
_name = 'formation.work'
_description = u'travaux'
_inherit = ['mail.thread','ir.needaction_mixin']
_columns = {
'name' : fields.char(u'Numéro',size=100,required=True),
'responsable' : fields.many2one('hr.employee',u'Responsable',required=True),
'user' : fields.many2one('res.users',u'De qui',required=True),
'date' : fields.datetime(u'Date',required=True),
'description' : fields.text(u'Détail de l\'intervention'),
'amount' : fields.float(u'Montant'),
'line_ids' : fields.one2many('formation.work.line','maintenance',u'Détails'),
'incident_ids' : fields.one2many('formation.work.incident','maintenance',u'Incidents'),
}
_defaults = {
'user' : lambda x, y, z, c: z,
'date': lambda *a : time.strftime('%Y-%m-%d'),
}
formation_work()
class formation_work_line(osv.osv):
_name = 'formation.work.line'
_description = u'tache'
_order = 'maintenance desc, date_start desc'
_columns = {
'name' : fields.char(u'Référence',size=100,required=True),
'maintenance' : fields.many2one('formation.work',u'Travaux',required=True),
'responsable' : fields.many2one('hr.employee',u'Responsable',required=True),
'user' : fields.many2one('res.users',u'utilisateur',required=True),
'description' : fields.text(u'Détail'),
'amount' : fields.float(u'Montant',required=True),
'date_start' : fields.datetime(u'Date début',required=True),
'date_end' : fields.datetime(u'Date fin',required=True),
}
_defaults = {
'user' : lambda x, y, z, c: z,
'date_start': lambda *a : time.strftime('%Y-%m-%d %H:%M:%S'),
}
formation_work_line()
class formation_work_incident(osv.osv):
_name = 'formation.work.incident'
_description = u'Incidents'
_order = 'maintenance desc, date desc'
_columns = {
'name' : fields.char(u'Référence',size=100,required=True),
'maintenance' : fields.many2one('formation.work',u'Travaux',required=True),
'responsable' : fields.many2one('hr.employee',u'Responsable',required=True),
'user' : fields.many2one('res.users',u'utilisateur',required=True),
'description' : fields.text(u'Incident'),
'date' : fields.datetime(u'Date',required=True),
}
_defaults = {
'user' : lambda x, y, z, c: z,
'date': lambda *a : time.strftime('%Y-%m-%d %H:%M:%S'),
}
formation_work_incident()
import time, datetime
class formation_work(osv.osv):
_name = 'formation.work'
_description = u'travaux'
_inherit = ['mail.thread','ir.needaction_mixin']
_columns = {
'name' : fields.char(u'Numéro',size=100,required=True),
'responsable' : fields.many2one('hr.employee',u'Responsable',required=True),
'user' : fields.many2one('res.users',u'De qui',required=True),
'date' : fields.datetime(u'Date',required=True),
'description' : fields.text(u'Détail de l\'intervention'),
'amount' : fields.float(u'Montant'),
'line_ids' : fields.one2many('formation.work.line','maintenance',u'Détails'),
'incident_ids' : fields.one2many('formation.work.incident','maintenance',u'Incidents'),
}
_defaults = {
'user' : lambda x, y, z, c: z,
'date': lambda *a : time.strftime('%Y-%m-%d'),
}
formation_work()
class formation_work_line(osv.osv):
_name = 'formation.work.line'
_description = u'tache'
_order = 'maintenance desc, date_start desc'
_columns = {
'name' : fields.char(u'Référence',size=100,required=True),
'maintenance' : fields.many2one('formation.work',u'Travaux',required=True),
'responsable' : fields.many2one('hr.employee',u'Responsable',required=True),
'user' : fields.many2one('res.users',u'utilisateur',required=True),
'description' : fields.text(u'Détail'),
'amount' : fields.float(u'Montant',required=True),
'date_start' : fields.datetime(u'Date début',required=True),
'date_end' : fields.datetime(u'Date fin',required=True),
}
_defaults = {
'user' : lambda x, y, z, c: z,
'date_start': lambda *a : time.strftime('%Y-%m-%d %H:%M:%S'),
}
formation_work_line()
class formation_work_incident(osv.osv):
_name = 'formation.work.incident'
_description = u'Incidents'
_order = 'maintenance desc, date desc'
_columns = {
'name' : fields.char(u'Référence',size=100,required=True),
'maintenance' : fields.many2one('formation.work',u'Travaux',required=True),
'responsable' : fields.many2one('hr.employee',u'Responsable',required=True),
'user' : fields.many2one('res.users',u'utilisateur',required=True),
'description' : fields.text(u'Incident'),
'date' : fields.datetime(u'Date',required=True),
}
_defaults = {
'user' : lambda x, y, z, c: z,
'date': lambda *a : time.strftime('%Y-%m-%d %H:%M:%S'),
}
formation_work_incident()
Déclaration XML
<record model="ir.ui.view" id="formation_work_tree">
<field name="name">formation.work.tree</field>
<field name="model">formation.work</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Travaux" >
<field name="name" />
<field name="responsable" />
<field name="user" />
<field name="date"/>
<field name="description" />
<field name="amount" sum="Total montant" />
</tree>
</field>
</record>
<field name="name">formation.work.tree</field>
<field name="model">formation.work</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Travaux" >
<field name="name" />
<field name="responsable" />
<field name="user" />
<field name="date"/>
<field name="description" />
<field name="amount" sum="Total montant" />
</tree>
</field>
</record>
<record model="ir.ui.view" id="formation_work_calendar">
<field name="name">formation.work.calendar</field>
<field name="model">formation.work</field>
<field name="type">calendar</field>
<field name="arch" type="xml">
<calendar string="Travaux" date_start="date" color="responsable" >
<field name="name" />
<field name="amount" sum="Total montant" />
</calendar>
</field>
</record>
<field name="name">formation.work.calendar</field>
<field name="model">formation.work</field>
<field name="type">calendar</field>
<field name="arch" type="xml">
<calendar string="Travaux" date_start="date" color="responsable" >
<field name="name" />
<field name="amount" sum="Total montant" />
</calendar>
</field>
</record>
<record model="ir.ui.view" id="formation_work_graph">
<field name="name">formation.work.graph</field>
<field name="model">formation.work</field>
<field name="arch" type="xml">
<graph string="Cout Traveaux par Moi">
<field name="name" />
<field name="amount" operator="+"/>
<field name="user" group="True"/>
</graph>
</field>
</record>
<field name="name">formation.work.graph</field>
<field name="model">formation.work</field>
<field name="arch" type="xml">
<graph string="Cout Traveaux par Moi">
<field name="name" />
<field name="amount" operator="+"/>
<field name="user" group="True"/>
</graph>
</field>
</record>
<record model="ir.ui.view" id="formation_work_form">
<field name="name">formation.work.form</field>
<field name="model">formation.work</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Travaux" version="7.0" >
<sheet>
<group >
<group>
<field name="name" />
<field name="user" />
<field name="amount"/>
</group>
<group>
<field name="responsable" />
<field name="date"/>
</group>
</group>
<newline/>
<notebook colspan="4" >
<page string="Description" >
<group colspan="4" >
<field name="description" nolabel="1" />
</group>
</page>
<page string="Tâches" >
<group colspan="4" >
<field name="line_ids" nolabel="1" >
<tree editable="bottom">
<field name="name" readonly="True" />
<field name="description" />
<field name="date_start" />
<field name="date_end" />
<field name="amount" sum="Total montant" />
<field name="responsable" />
<field name="user" readonly="True" />
</tree>
</field>
</group>
</page>
<page string="Incidents" >
<group colspan="4" >
<field name="incident_ids" nolabel="1" >
<tree editable="bottom" >
<field name="name" readonly="True" />
<field name="description" />
<field name="date" />
<field name="responsable" />
<field name="user" readonly="True" />
</tree>
</field>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
action <field name="name">formation.work.form</field>
<field name="model">formation.work</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Travaux" version="7.0" >
<sheet>
<group >
<group>
<field name="name" />
<field name="user" />
<field name="amount"/>
</group>
<group>
<field name="responsable" />
<field name="date"/>
</group>
</group>
<newline/>
<notebook colspan="4" >
<page string="Description" >
<group colspan="4" >
<field name="description" nolabel="1" />
</group>
</page>
<page string="Tâches" >
<group colspan="4" >
<field name="line_ids" nolabel="1" >
<tree editable="bottom">
<field name="name" readonly="True" />
<field name="description" />
<field name="date_start" />
<field name="date_end" />
<field name="amount" sum="Total montant" />
<field name="responsable" />
<field name="user" readonly="True" />
</tree>
</field>
</group>
</page>
<page string="Incidents" >
<group colspan="4" >
<field name="incident_ids" nolabel="1" >
<tree editable="bottom" >
<field name="name" readonly="True" />
<field name="description" />
<field name="date" />
<field name="responsable" />
<field name="user" readonly="True" />
</tree>
</field>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="action_formation_work" model="ir.actions.act_window">
<field name="name">Gestion des travaux</field>
<field name="res_model">formation.work</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="search_view_id" ref="formation_work_search"/>
</record>
<field name="name">Gestion des travaux</field>
<field name="res_model">formation.work</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="search_view_id" ref="formation_work_search"/>
</record>
les Menus :
<openerp>
<data>
<!-- formation maintenance menus -->
<menuitem id="base.menu_formation_maintenance_parent" name="Travaux" web_icon="images/maintenance.png" web_icon_hover="images/maintenance-hover.jpg"
sequence="18" />
<menuitem id="menu_maintenance" name="Travaux" parent="base.menu_formation_maintenance_parent" sequence="1" />
<menuitem id="menu_maintenance_list" name="Travaux" parent="menu_maintenance" sequence="1" action="action_formation_work" />
<menuitem id="menu_maintenance_task_list" name="Tâches" parent="menu_maintenance" sequence="2" action="action_formation_work_line" />
<menuitem id="menu_maintenance_incident_list" name="Incidents" parent="menu_maintenance" sequence="3" action="action_formation_work_incident" />
</data>
</openerp>
<data>
<!-- formation maintenance menus -->
<menuitem id="base.menu_formation_maintenance_parent" name="Travaux" web_icon="images/maintenance.png" web_icon_hover="images/maintenance-hover.jpg"
sequence="18" />
<menuitem id="menu_maintenance" name="Travaux" parent="base.menu_formation_maintenance_parent" sequence="1" />
<menuitem id="menu_maintenance_list" name="Travaux" parent="menu_maintenance" sequence="1" action="action_formation_work" />
<menuitem id="menu_maintenance_task_list" name="Tâches" parent="menu_maintenance" sequence="2" action="action_formation_work_line" />
<menuitem id="menu_maintenance_incident_list" name="Incidents" parent="menu_maintenance" sequence="3" action="action_formation_work_incident" />
</data>
</openerp>
