Développement d'un module sous OpenERP v7 Partie 1

11:17

Développement d'un module sous OpenERP v7 Partie1


Structure standard d’un module sous OpenERP



Pour créer un module il faut passe nécessairement par ces étapes :
• 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).

les fichiers 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

__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.

 La couche Model :

Le Framework Object Service (OSV) met en oeuvre une couche complète de Mapping Objet Relationnel. 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 osv.osv.


Les types des champs de l’ORM

Un objet peut avoir 3 types de champs : simple, relationnel, fonctionnel
• Simple :
Integers, Floats, Date, Booleans, Char, Text, Binary…
• Relationnel :
Représente les relations entre les objets (one2many, many2one, many2many)
• Fonctionnel :
Ils sont calculés à la volé comme des fonctions Python

__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://aitmlouk.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,  
 }  

 Les Vues :forme, liste, calendrier, graphe...

Structure générale du fichier model_view.xml vide :

 <?xml version="1.0" encoding="UTF-8"?>  
 <openerp>  
   <data>  
      [views definitions]  
      [actions definitions]  
      [menus definitions]  
   </data>  
 </openerp>  

Déclaration générique d’une vue :

 <record model="ir.ui.view" id="VIEW_ID">  
      <field name="name">VIEW.NAME</field>  
      <field name="model">PYTHON.CLASS.NAME</field>  
      <field name="arch" type="xml">  
       <!-- contenu de la vue: <form>, <tree>, <graph>, … -->  
      </field>  
 </record>  
name :nom de la vue (nomination séparée par des point)
model :modèle d'objet sur lequel la vue est définie (comme res_model dans les actions)
type :form, tree, graph, calendar, search, gantt, kanban
arch : architecture de la vue

Déclaration XML

<!-- tree -->
 <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>  



 <!-- calendar -->
 
 <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>  




    <!-- graphe  -->
   
 <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>  



    <!-- form -->  
   
 <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 -->
 
 <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>  


*************************************************************
c'est la même chose pour les deux classe tache et incident

les Menus :

 <?xml version="1.0" encoding="UTF-8"?>  
 <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>  



A suivre ==> Partie 2

You Might Also Like

7 commentaires

  1. Salam ; ou je peux trouver la deuxième partie ?

    RépondreSupprimer
  2. The second part is coming keep in touch

    RépondreSupprimer
  3. Bonsoir,merci beaucoup pour ce tuto.
    Je voulais savoir :
    1-Que doit-on préciser dans l'attribut "depends" du fichier openerp.py si notre module ne dépend d'aucun module ?

    2-Vous avez cité le fichier module.py parmi les fichiers essentiels...alors comment est sa forme pour un simple module qui ne dépend d'aucun autre aussi.Merci !

    RépondreSupprimer
    Réponses
    1. toujours dans odoo il faut préciser le module de base (noyau), si votre module ne dépend d'aucun module il faut mettre par defaut"depends": ["base"] sinn le module de base est toujours installé ou moment de création de la base

      Supprimer
  4. je peut pas trouvé la partie 2 du Développement d'un module sous OpenERP v7

    RépondreSupprimer

Popular Posts

Formulaire de contact

Nom

E-mail *

Message *