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"
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.
Essaie en remplaçant la ligne concernée par : addons/ton_module/report/sale_order.rml
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…
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 ?
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 ?
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.
Pour mettre à jour un module, j'ai rédigé en septembre 2013, l'article suivant : https://agipme.fr/2013/09/deploiement-d-modification-de-module.html
Selon si la modif est sur un fichier xml ou python, la procédure est différente
Merci, je pense que ce qu'il me manquait était le redémarrage du serveur openerp pour que tout se réinitialise correctement. Encore merci, bonne après midi à toi.
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 ?
Je parle bien du nom du fichier PDF généré.
Désolé, je ne sais pas
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.
Bonjour cher tous quelqu 'un aurait il une astuce ou un module a me conseiller afin de faire apparaitre un champ " objet du devis " sur mes devis et facture.