OpenERP 7 – comment modifier un rapport RML standard et le déployer dans un module « customisé » (6/6)

Jusqu'à présent, nous avons fait nos modifications de rapport directement dans le module (ex: sale).
Bien qu'il ne soit pas possible de procéder par héritage pour les rapports, il est possible de procéder par "override" en déployant les modifications dans un module "customisé".

Il est à noter qu'en v8, la solution Qweb permettra l'héritage de rapports.

En prenant toujours l'exemple du rapport "devis/Commande", nous allons créer le module "mayjo_report_sale" avec l'arborescence et les fichiers suivants :

Voici le contenu de chacun des fichiers :

* __init__.py :
import report

* __openerp__.py :
{
    "name" : "Mayjo Reports - Sales",
    "version" : "1.0",
    "author" : "mayjo",
    "category" : "Sales",
    'complexity': "easy",
    "description": """
Customizations to the sales order report for mayjo.
""",
    'images' : [],
    "depends" : ["sale"],
    'update_xml': ['sale_report.xml'],
    'demo_xml': [],
    'test': [],
    'installable': True,
    'auto_install': False,
}

* sale_report.xml :
<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <report
            auto="False"
            id="sale.report_sale_order"
            model="sale.order"
            name="sale.order.mayjo"
            string="Quotation / Order"
            usage="default"/>
    </data>
</openerp>

* report/__init__.py :
import sale_order

* report/sale_order.py :
import time
from openerp.report import report_sxw

class order(report_sxw.rml_parse):
    def __init__(self, cr, uid, name, context=None):
        super(order, self).__init__(cr, uid, name, context=context)
        self.localcontext.update({
            'time': time,
            'show_discount':self._show_discount,
        })

    def _show_discount(self, uid, context=None):
        cr = self.cr
        try:
            group_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'sale', 'group_discount_per_so_line')[1]
        except:
            return False
        return group_id in [x.id for x in self.pool.get('res.users').browse(cr, uid, uid, context=context).groups_id]

from netsvc import Service
del Service._services['report.sale.order']

report_sxw.report_sxw('report.sale.order',
                      'sale.order',
                      '../../myaddons/mayjo_report_sale/report/sale_order.rml',
                      parser=order,
                      header="external")

* report/sale_order.rml :
mettre votre fichier RML modifié

PS1 : Merci à Saad qui m'a donné l'astuce du "del Service._services(...)"

PS2 : Pour éviter l'erreur suivante 

 lorsque l'on choisit d'imprimer par l'autre bouton :

... j'ai supprimé ce bouton en ajoutant la ligne suivante dans le fichier "sale_report.xml"
multi="True"

13 réflexions au sujet de « OpenERP 7 – comment modifier un rapport RML standard et le déployer dans un module « customisé » (6/6) »

  1. Bonjour,
    J'ai suivi ce tuto en plaçant mon module directement dans le répertoire "addons" (n'ayant pas créé de répertoire spécifique "myaddons"). J'ai en conséquence (mal ?) adapté la ligne '../../myaddons/mayjo_report_sale/report/sale_order.rml' en '../../mayjo_report_sale/report/sale_order.rml' . Cela ne fonctionne pas et me renvoit un message d'erreur "fichier introuvable" lors de l'impression d'un document. J'ai donc tenté une désinstallation, mais l'erreur reste, il m'est alors impossible de réimprimer comme avant. Que me conseillez vous ? Merci d'avance.

    1. J'ai essayé ça ne se mets pas à jour, le message d'erreur est toujours le même avec le mauvais chemin de fichier (celui du premier essai). Vraiment bizarre je me prend la tête et je ne comprend pas. Pourquoi ça ne revient pas à la normale quand je désinstalle le module, et pourquoi ça ne se mets pas à jour quand j'essai avec un autre chemin ? Je n'arrive pas à répondre à ces 2 questions…

    2. Bon j'ai réussi à régler le problème par la manière forte : créer un second module sans erreur avec un nom différent. Reste l'ancien module dans la liste des modules, alors que j'ai bien mis à jour cette dernière après avoir désinstallé le module puis supprimé les fichiers. Connaissez vous ce problème ? Comment bien désinstaller et supprimer complètement un module custom ?

    3. La désinstallation d'un module est très déconseillée sur OpenERP.
      En environnement de production, si on n'a plus besoin d'un module, on le désactive par les habilitations mais jamais par une désinstallation.
      De toute façon, je suppose que dans ton cas, tu travailles sur un environnement de test ?

    4. Oui bien sûr. Comment faire alors pour mettre à jour un module ? Car j'ai eu beau changer le numéro de version de mon module dans le code source, puis mettre à jour la liste des modules, puis mettre à jour le module, mon erreur n'a pas été réglée. J'ai du créer un autre module avec un nom différent pour écraser le module erroné.
      Merci beaucoup pour tes éclaircissements et ton aide. Si tu le souhaites on peut poursuivre par chat google hangouts.

  2. Encore une petite question : quand j'imprime (pdf) mon document maintenant, le titre du pdf est sale.order au lieu d'anciennement (avant modif) "Bon de commande". Sais-tu où je pourrais remettre en place un titre ?

  3. Encore une (décidément), as-tu essayé de reproduire le même schéma pour les bons de livraison ? J'ai beau avoir tout bien (pas suffisamment on dirait !) adapté, ça ne fonctionne pas… Merci de ton aide.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *