Archives par mot-clé : Développement

ODOO 8 – Editions Qweb – Suppression entête (9/9)

Il est parfois utile de supprimer l'entête (par exemple, avoir une entête uniquement sur la 1ère page).
Pour cela, il faut modifier le fichier x_sale_report.xml :

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <template id="x_header" inherit_id="report.external_layout_header">
            <xpath expr="//div[@class='header']" position="replace" />

        </template>

        <!-- etc ... -->

    </data>
</openerp>

Il faut ensuite créer un nouveau fichier x_report_paperformat.xml, en se basant sur le fichier par défaut odoo/addons/report/data/report_paperformat.xml et en modifiant les 2 lignes en gras ci-dessous :

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <record id="paperformat_xxx" model="report.paperformat">
            <field name="name">A4 xxx</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">5</field>
            <field name="margin_bottom">23</field>
            <field name="margin_left">7</field>
            <field name="margin_right">7</field>
            <field name="header_line" eval="False" />
            <field name="header_spacing">0</field>
            <field name="dpi">90</field>
        </record>
    </data>
</openerp>

puis ajouter dans le fichier __openerp__.py , la référence à ce fichier (cf en gras) :
{
    "name" : "Customization Sale Report",
    "version" : "1.0",
    "category" : "Generic Modules",
    'depends' : ['sale',],
    "data" : ['x_sale_report.xml','x_report_paperformat.xml',],
    "installable": True,
    "active": True
}

Pour terminer, il faut modifier la configuration de la société en affectant au champ "paper format", la nouvelle valeur créée "A4 xxx"

 

ODOO 8 – Editions Qweb – Styles CSS (8/9)

Il est possible d'ajouter ou de modifier des styles CSS avec la balise <style> :
<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <template id="x_sale_report" inherit_id="sale.report_saleorder_document">
            <xpath expr="//div[@class='page']" position="replace">
                <div class="page">

                   <style type="text/css">
                         h1   {font-size: 16; font-weight:bold;text-decoration:underline;}
                         table#t01 {text-align: center;width: 75%; border-left: 1px solid black; border-right: 1px solid black;}
                  </style>

                      <h1> Texte blabla ...</h1>
                      <table id="t01">
                              <!-- etc ... -->
                      </table>
                 </div>
            </xpath>
        </template>

    </data>
</openerp>

ODOO 8 – Editions Qweb – Utilisation de Bootstrap (7/9)

Le positionnement des textes et/ou images se fait à l'aide de Twitter Bootstrap.
Le principe est de placer son texte dans des lignes ("row") et des colonnes (ex: "col-xs-*") sachant qu'il faut toujours avoir 12 colonnes dans une ligne :
<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <template id="x_sale_report" inherit_id="sale.report_saleorder_document">
            <xpath expr="//div[@class='page']" position="replace">
                <div class="page">

                    <div class="row">
                        <div class="col-xs-3">
                               <!-- etc -->              
                        </div>
                        <div class="col-xs-9 text-right" style="font-weight:bold">
                               <!-- etc -->                              
                        </div>
                    </div>

                </div>
            </xpath>
        </template>

    </data>
</openerp>

ODOO 8 – Editions Qweb – modification du corps de l’édition (5/9)

Pour modifier complètement le corps de l'édition, il faut intervenir sur le fichier x_sale_report.xml en préparant le squelette suivant :
<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <template id="x_sale_report" inherit_id="sale.report_saleorder_document">
            <xpath expr="//div[@class='page']" position="replace">
                <div class="page">

<!-- mettre le contenu de la page ici -->


                </div>
            </xpath>
        </template>

    </data>
</openerp>

A noter que le fichier de référence (à partir duquel les modifications seront faites) est dans notre exemple : addons/sale/views/report_saleorder.xml

ODOO 8 – Editions Qweb – Modification de l’entête (4/9)

Pour modifier l'entête, il faut intervenir sur le fichier x_sale_report.xml
Voici un exemple de modification qui consiste à retirer les 2 traits de l'entête par défaut :
<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <template id="x_header" inherit_id="report.external_layout_header">
            <xpath expr="//div[@class='header']" position="replace">
            <div class="header">
                <div class="row">
                        <div class="col-xs-3">
                            <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % company.logo" style="max-height: 45px;"/>
                        </div>
                        <div class="col-xs-9 text-right" style="margin-top:20px;" t-field="company.rml_header1"/>
                    </div>
                <div class="row">
                        <div class="col-xs-3">
                            <div t-field="company.partner_id" t-field-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": true}'/>
                        </div>
                </div>
            </div>
            </xpath>
        </template>
    </data>
</openerp>

J'aurai pu utiliser une clause Xpath plus restrictive et permettant moins de redondance par rapport à l'entête par défaut, mais ce n'était pas ici mon objectif.

ODOO 8 – Editions Qweb – Modification du pied de page (3/9)

Pour modifier le pied de page, il faut intervenir sur le fichier x_sale_report.xml
Voici un exemple de modification :
<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <template id="x_footer" inherit_id="report.external_layout_footer">
            <xpath expr="//div[@class='footer']" position="replace">
                <div class="footer">
                       <div class="text-center" style="border-top: 1px solid black; font-size: 8px;">
                         Société à responsabilité limitée (SARL) - Capital de xxx Euros - SIRET: xxxxxx
                          <br />
                     NAF-APE: xxx - RCS/RM: xxxx - Num. TVA: xxxx
                          <ul class="list-inline">
                             <li>Page:</li>
                             <li><span class="page"/></li>
                             <li>/</li>
                             <li><span class="topage"/></li>
                          </ul>
                       </div>
                </div>
            </xpath>
        </template>
    </data>
</openerp>

Voici le résultat :

ODOO 8 – Articles sur les éditions Qweb (1/9)

Devant le manque de documentation sur le sujet, je débute la rédaction d'une série d'articles sur les éditions Qweb.
Ces articles vont venir en complément d'un article précédent sur le sujet.

Nous prendrons comme exemple, l'édition des devis/commandes que nous allons modifier par héritage du fichier existant addons/sale/views/report_saleorder.xml

Pour débuter, nous allons créer un nouveau module x_sale_report comprenant les fichiers suivants :

__init__.py
que nous laissons vide

__openerp__.py
{
    "name" : "Customization Sale Report",
    "version" : "1.0",
    "category" : "Generic Modules",
    'depends' : ['sale',],
    "data" : ['x_sale_report.xml',],

    'installable': True,
    'auto_install': False,
}

x_sale_report.xml
<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
         <!-- a compléter par la suite -->
    </data>
</openerp>

Voici l'édition du devis avant toute modification

ODOO 8 – Création d’un module utilisant les nouvelles API et héritant d’un module utilisant les anciennes

La version 8 de ODOO propose l'utilisation de nouvelles api tout en conservant les anciennes.

extrait "http://anybox.fr/blog/odoo-8-est-publie-quelles-nouveautes"

J'avais déjà rédigé un 1er article sur le sujet.

Nous allons ici vérifier que nous pouvons réaliser un nouveau module avec les nouvelles API tout en héritant d'un module utilisant les anciennes API.
Nous allons reprendre l'exemple vu en avril 2014 sur ce blog.

 Environnement technique
- serveur virtualisé Debian 7.7 sur lequel est installé ODOO 8
- navigateur sur PC Linux Mint 17  à partir duquel on accède à ODOO 8

Description
Reprenons donc l'exemple de l'objet "ligne de commande "(sale.order.line) dans
lequel nous voulons ajouter un champ appelé "longueur".
Ce champ sera aussi ajouté dans le formulaire de saisie des devis/commandes.

Pour cela, nous allons procéder par héritage du module standard "sale" (qui utilise toujours les anciennes API)  et créer un nouveau module "mysale_lg_newapi" avec l'arborescence et les fichiers suivants :

Seul le fichier mysale_lg.py est en fait impacté par les nouvelles API :

# -*- coding: utf-8 -*-
from openerp import models, fields

class sale_order_line(models.Model):
    _inherit = 'sale.order.line'
    _name = 'sale.order.line'
    lg = fields.Integer('Length' , required=True)

* Rappel de ce même fichier avec les anciennes API :
# -*- coding: utf-8 -*-
from openerp.osv import fields, osv

class sale_order_line(osv.osv):
    _inherit = 'sale.order.line'
    _name = 'sale.order.line'
    _columns = {'lg': fields.integer('Length'),}

sale_order_line()

Les autres fichiers restent identiques :
__init__.py :
import mysale_lg

__openerp__.py :
{
    "name" : "View Customization Sale",
    "version" : "1.0",
    "category" : "Generic Modules",
    'depends' : ['sale',],
    "update_xml" : ["mysale_lg.xml",],

    'installable': True,
    'auto_install': False,
}

mysale_lg.xml :
<?xml version="1.0" encoding="utf-8"?>
<openerp>
  <data>
      <record model="ir.ui.view" id="view_order_form_my1">
            <field name="name">sale.order.form.my1</field>
            <field name="model">sale.order</field>
            <field name="inherit_id" ref="sale.view_order_form" />
            <field name="arch" type="xml">
              <xpath expr="//sheet/notebook/page/field[@name='order_line']/tree/field[@name='name']" position="after">
                <field name="lg"/>
              </xpath>
            </field>
        </record>
   </data>
</openerp>

i18n/fr.po :
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
#    * mysale_lg
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0n"
"Report-Msgid-Bugs-To: n"
"POT-Creation-Date: 2014-04-23 08:33+0000n"
"PO-Revision-Date: 2014-04-23 08:33+0000n"
"Last-Translator: <>n"
"Language-Team: n"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: n"
"Plural-Forms: n"

#. module: mysale_lg
#: field:sale.order.line,lg:0
msgid "Length"
msgstr "Longueur"

#. module: mysale_lg
#: code:_description:0
#: model:ir.model,name:mysale_lg.model_sale_order_line
#, python-format
msgid "Sales Order Line"
msgstr "Ligne de commandes de vente"

Le "template" de ce dernier fichier a été produit selon cette procédure

Nous installons ce nouveau module qui produit le résultat attendu (ajout du nouveau champ "longueur") :

ODOO 8 – création d’un module simple avec les nouvelles API

Reprenons l'exemple créé en v7 que nous allons reproduire en v8 avec les nouvelles API .

Nous ne mettrons en place ni la traduction en français, ni la gestion des droits d'accès.

Le résultat à obtenir sera :
* Ecran "Author" :

* Ecran "Book":

Nous allons créer le module  "mylibrary2" avec les fichiers suivants :

__init__.py
import mylibrary2

__openerp__.py
# -*- coding: utf-8 -*-

{
    'name': 'mylibrary2',
    'version': '0.1',
    'category': 'Generic Modules/Others',
    'description': """ Test creation module new api Odoo v8
    """,
    'author': 'PMA',
    'depends': ['base'],
    'data': ['mylibrary2_view.xml'],
    'installable': True,
    'auto_install': False,
}

mylibrary2.py
(ce fichier est impacté par les nouvelles api)
# -*- coding: utf-8 -*-
from openerp import models, fields

class author(models.Model):
    _name = 'mylibrary.author'
    _rec_name = 'lastname'
    firstname = fields.Char('FirstName', required=True)
    lastname = fields.Char('LastName', required=True) 
    book_ids = fields.One2many('mylibrary.book','author_id','Books')
 
class book(models.Model):
    _name = 'mylibrary.book'
    title = fields.Char('Title', required=True)
    genre = fields.Char('Genre', required=True)
    author_id = fields.Many2one('mylibrary.author','Author',ondelete='cascade')

mylibrary2_view.xml
<?xml version="1.0" ?>

<openerp>
        <data>
    <record model="ir.ui.view" id="author_form">
        <field name="name">author.form</field>
        <field name="model">mylibrary.author</field>
        <field name="arch" type="xml">
            <form string="Author">
                <label string="First Name" />
                <field name="firstname"/>
                <label string="Last Name" />
                <field name="lastname"/> 
                <notebook colspan="3">
                    <page string="Books">
                      <field name="book_ids"/>
                    </page>
                </notebook>
            </form>
        </field>
    </record>

    <record model="ir.ui.view" id="author_tree">
        <field name="name">author.tree</field>
        <field name="model">mylibrary.author</field>
        <field name="type">tree</field>
        <field name="arch" type="xml">
            <tree string="Author" >
                <field name="firstname"/>
                <field name="lastname"/>
                <field name="book_ids"/>
            </tree>
        </field>
    </record>

    <record model="ir.actions.act_window" id="action_author">
        <field name="name">Author</field>
        <field name="res_model">mylibrary.author</field>
        <field name="view_type">form</field>
        <field name="view_mode">tree,form</field>
    </record>

    <record model="ir.ui.view" id="book_form">
        <field name="name">book.form</field>
        <field name="model">mylibrary.book</field>
        <field name="arch" type="xml">
            <form string="Book" >
                <label string="Title" />
                <field name="title"/>
                <label string="Genre" />
                <field name="genre"/>
                <label string="Author" />
                <field name="author_id"/>
            </form>
        </field>
    </record>

    <record model="ir.ui.view" id="book_tree">
        <field name="name">book.tree</field>
        <field name="model">mylibrary.book</field>
        <field name="arch" type="xml">
            <tree string="Book" >
                <field name="title"/>
                <field name="genre"/>
                <field name="author_id"/>
            </tree>
        </field>
    </record>

    <record model="ir.actions.act_window" id="action_book">
        <field name="name">Book</field>
        <field name="res_model">mylibrary.book</field>
        <field name="view_type">form</field>
        <field name="view_mode">tree,form</field>
    </record>

    <menuitem id="mylibrary" name="Mylibrary"/>
       <menuitem name="Mylibrary" id="section_main_menu_mylibrary" parent="mylibrary" />
        <menuitem name="Authors" id="choix_author" parent="section_main_menu_mylibrary" action="action_author"/>
       <menuitem name="Books" id="choix_book" parent="section_main_menu_mylibrary" action="action_book"/>

    </data>
</openerp>