mardi 24 février 2015

Développement d'un module sous Odoo (v7)

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

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

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

How to create constraints in OpenERP?

This will help you to create a constraints in OpenERP.

_constraint is a pre-define field in OpenERP. It is used for adding a constraint on the object.

It takes list of tuple as its argument. The tuple inside the list contains three parameter.
  1. Method (to check the constraint)
  2. The Message (Pop-up message for End User)
  3. List of Fields (fields to apply the constraint)
_constraint will fire if the condition returns False on creation and updation of the record and display the message.

Here is an example of integer data-type. It's fire a constraint if length is not positive.

Here is .py side code:
 
from openerp.osv import fields, osv
class res_partner(osv.Model):
    _inherit = 'res.partner'

    _columns = {       
        'length': fields.integer('Length', size=64),
    }

    def _check_number(self, cr, uid, ids, context=None):
        for partner in self.browse(cr, uid, ids, context=context):
            if partner.length < 0:
                return False
        return True    
   
    _constraints = [
        (_check_length, 'Length must be Positive.', ['length'])
    ]

Here is .xml side code:

<?xml version="1.0"?>
<openerp>
    <data>
        <!-- res partner form view-->
        <record id="view_res_partner_extended_form" model="ir.ui.view">
            <field name="name">res.partner.extended.form.view</field>
            <field name="model">res.partner</field>
            <field name="inherit_id" ref="base.view_partner_form"/>
            <field name="arch" type="xml">
                <field name="email" position="after">
                    <field name="length"/>
                </field>
            </field>
        </record>
    </data>
</openerp>


I hope you like this article. Share your views to improve content. Happy Learning !!!

How to install Wkhtmltopdf package in Odoo?

This will help for Ubuntu system.
 
Once we install Odoo v8 and try to print report. WE may see notice at right hand side in black box with message.

You should upgrade your version of Wkhtmltopdf to at least 0.12.0 in order to get a correct display of headers and footers as well as support for table-breaking between pages.
   
That means Odoo v8 support the 0.12.0 or greater  than version of Wkhtmltopdf. So need to just follow the below steps:
cd /tmp
wget http://sourceforge.net/projects/wkhtmltopdf/files/archive/0.12.0/wkhtmltox-linux-amd64_0.12.0-03c001d.tar.xz

tar -xvf wkhtmltox-linux-amd64_0.12.0-03c001d.tar.xz
cd wkhtmltox
cd bin/
mv wkhtmltopdf /usr/bin/

mv wkhtmltoimage /usr/bin/
cd ..
cd lib/
mv libwkhtmltox.so.0 /lib64
mv libwkhtmltox.so.0.12 /lib64
mv libwkhtmltox.so.0.12.0 /lib64

cd /usr/bin/
sudo chown root:root wkhtmlto*
cd /lib64
sudo chown root:root libwkhtmlto*
sudo chown -h root:root libwkhtmlto*

Now reboot the system using this command.

sudo reboot

After than we need to start the Odoo server, Login in database and follow the below GUI step:

Configuration -> Parameter -> Parameters Systems
Create a new record like :

    Tipe : webkit_path
    Value : /usr/bin/wkhtmltopdf
   
If you show above record in your Odoo System that means now everything is fine.

I hope you like this article. Share your views to improve content. Happy Learning !!!

How to change "Powered by Odoo" footer in Odoo?

First go to your Odoo web module and open below file.

    addons => web => views => webclient_templates.xml

Now find this tag <div class="oe_footer">

<div class="oe_footer">
   Powered by <a href="http://www.openerp.com" target="_blank"><span>Odoo</span></a>
</div>

We can change anything like your company name or else. Now I change with "Odedra" save it and restart your server and upgrade your web module form GUI and you will got your changes.

<div class="oe_footer">
   Powered by <a href="http://www.openerp.com" target="_blank"><span>Odedra</span></a>
</div>
I hope you like this article. Share your views to improve content. Happy Learning !!!