From 0167acbb527b83700045274ad3a37348f657abf7 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Wed, 18 Feb 2015 16:20:26 +0100 Subject: [PATCH] [FIX] report : translation of report using website editor In the website editor, the translations are loaded using the route 'get_view_translations', which returns the translations of the templates loaded by the website (t-call calls) The thing is, report templates use the 'translate_doc' method to actually load the report, translated in the partner language, and the templates loaded by this method are not seen by the website, therefore, when calling 'get_view_translations', those report templates were just ignored, thus their translations are not loaded. This rev. injects the templates loaded with translate_doc when rendering the report into the method 'customize_template_get' (which is used by 'get_view_translations' to retrieve the loaded templates). The translations of the reports are therefore now loaded corretly when hitting the "translate" button in the website editor for reports. Besides, this rev. has as (good) side-effect to add the template, in the template selection input when editing using the HTML editor. opw-620713 --- addons/report/models/report.py | 48 ++++++++++--------- addons/website_report/__init__.py | 2 + addons/website_report/controllers/__init__.py | 1 + addons/website_report/controllers/main.py | 33 +++++++++++++ addons/website_report/report.py | 47 ++++++++++++++++++ 5 files changed, 109 insertions(+), 22 deletions(-) create mode 100644 addons/website_report/controllers/__init__.py create mode 100644 addons/website_report/controllers/main.py create mode 100644 addons/website_report/report.py diff --git a/addons/report/models/report.py b/addons/report/models/report.py index 21ea84ab01d..f0e2b4008ea 100644 --- a/addons/report/models/report.py +++ b/addons/report/models/report.py @@ -89,6 +89,31 @@ class Report(osv.Model): #-------------------------------------------------------------------------- # Extension of ir_ui_view.render with arguments frequently used in reports #-------------------------------------------------------------------------- + + def translate_doc(self, cr, uid, doc_id, model, lang_field, template, values, context=None): + """Helper used when a report should be translated into a specific lang. + + + + + + :param doc_id: id of the record to translate + :param model: model of the record to translate + :param lang_field': field of the record containing the lang + :param template: name of the template to translate into the lang_field + """ + ctx = context.copy() + doc = self.pool[model].browse(cr, uid, doc_id, context=ctx) + qcontext = values.copy() + # Do not force-translate if we chose to display the report in a specific lang + if ctx.get('translatable') is True: + qcontext['o'] = doc + else: + # Reach the lang we want to translate the doc into + ctx['lang'] = eval('doc.%s' % lang_field, {'doc': doc}) + qcontext['o'] = self.pool[model].browse(cr, uid, doc_id, context=ctx) + return self.pool['ir.ui.view'].render(cr, uid, template, qcontext, context=ctx) + def render(self, cr, uid, ids, template, values=None, context=None): """Allow to render a QWeb template python-side. This function returns the 'ir.ui.view' render but embellish it with some variables/methods used in reports. @@ -107,28 +132,7 @@ class Report(osv.Model): view_obj = self.pool['ir.ui.view'] def translate_doc(doc_id, model, lang_field, template): - """Helper used when a report should be translated into a specific lang. - - - - - - :param doc_id: id of the record to translate - :param model: model of the record to translate - :param lang_field': field of the record containing the lang - :param template: name of the template to translate into the lang_field - """ - ctx = context.copy() - doc = self.pool[model].browse(cr, uid, doc_id, context=ctx) - qcontext = values.copy() - # Do not force-translate if we chose to display the report in a specific lang - if ctx.get('translatable') is True: - qcontext['o'] = doc - else: - # Reach the lang we want to translate the doc into - ctx['lang'] = eval('doc.%s' % lang_field, {'doc': doc}) - qcontext['o'] = self.pool[model].browse(cr, uid, doc_id, context=ctx) - return view_obj.render(cr, uid, template, qcontext, context=ctx) + return self.translate_doc(cr, uid, doc_id, model, lang_field, template, values, context=context) user = self.pool['res.users'].browse(cr, uid, uid) website = None diff --git a/addons/website_report/__init__.py b/addons/website_report/__init__.py index e69de29bb2d..a0526c7c636 100644 --- a/addons/website_report/__init__.py +++ b/addons/website_report/__init__.py @@ -0,0 +1,2 @@ +import controllers +import report diff --git a/addons/website_report/controllers/__init__.py b/addons/website_report/controllers/__init__.py new file mode 100644 index 00000000000..8ee9bae18d9 --- /dev/null +++ b/addons/website_report/controllers/__init__.py @@ -0,0 +1 @@ +import main diff --git a/addons/website_report/controllers/main.py b/addons/website_report/controllers/main.py new file mode 100644 index 00000000000..11b4257b6c6 --- /dev/null +++ b/addons/website_report/controllers/main.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2014-Today OpenERP SA (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.addons.website.controllers.main import Website +from openerp.http import request, route + + +class Website(Website): + + @route() + def customize_template_get(self, xml_id, full=False): + res = super(Website, self).customize_template_get(xml_id, full=full) + if full and request.session.get('report_view_ids'): + res += request.session['report_view_ids'] + return res diff --git a/addons/website_report/report.py b/addons/website_report/report.py new file mode 100644 index 00000000000..4da33a4d7c2 --- /dev/null +++ b/addons/website_report/report.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2014-Today OpenERP SA (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.addons.web.http import request +from openerp.osv import osv + + +class Report(osv.Model): + _inherit = 'report' + + def translate_doc(self, cr, uid, doc_id, model, lang_field, template, values, context=None): + if request and hasattr(request, 'website'): + if request.website is not None: + v = request.website.get_template(template) + request.session['report_view_ids'].append({ + 'name': v.name, + 'id': v.id, + 'xml_id': v.xml_id, + 'inherit_id': v.inherit_id.id, + 'header': False, + 'active': v.active, + }) + return super(Report, self).translate_doc(cr, uid, doc_id, model, lang_field, template, values, context=context) + + def render(self, cr, uid, ids, template, values=None, context=None): + if request and hasattr(request, 'website'): + if request.website is not None: + request.session['report_view_ids'] = [] + return super(Report, self).render(cr, uid, ids, template, values=values, context=context)