diff options
| author | Martin Trigaux <mat@odoo.com> | 2020-02-14 11:22:15 +0100 |
|---|---|---|
| committer | Martin Trigaux <mat@odoo.com> | 2020-05-14 13:59:10 +0200 |
| commit | d9287caf9408bb4ff85ad734cbca08e44321e205 (patch) | |
| tree | 0d3b7c5705e5172176a7d76bf9098e381190bf4b /odoo/addons/base | |
| parent | 56a8c9e4311d24c33b7ad08b8230e4be345a85b8 (diff) | |
[IMP] *: convert to private methods
render, render_template, load, activity_schedule_with_view,
get_website_pages should all be private:
It should not be possible to render an aribtrary template only with
its name or id
Still need to render some qweb views from js so the method
render_template is kept public.
This explains why the website editor still need read access on
ir.ui.view as we want to allow any snippet to be rendered.
Diffstat (limited to 'odoo/addons/base')
| -rw-r--r-- | odoo/addons/base/models/ir_actions_report.py | 30 | ||||
| -rw-r--r-- | odoo/addons/base/models/ir_qweb.py | 13 | ||||
| -rw-r--r-- | odoo/addons/base/models/ir_qweb_fields.py | 4 | ||||
| -rw-r--r-- | odoo/addons/base/models/ir_ui_view.py | 18 | ||||
| -rw-r--r-- | odoo/addons/base/models/qweb.py | 6 | ||||
| -rw-r--r-- | odoo/addons/base/tests/test_qweb.py | 50 | ||||
| -rw-r--r-- | odoo/addons/base/tests/test_reports.py | 2 | ||||
| -rw-r--r-- | odoo/addons/base/tests/test_views.py | 16 | ||||
| -rw-r--r-- | odoo/addons/base/wizard/base_document_layout.py | 2 |
9 files changed, 76 insertions, 65 deletions
diff --git a/odoo/addons/base/models/ir_actions_report.py b/odoo/addons/base/models/ir_actions_report.py index 1cc1380d9da..fd4cca16947 100644 --- a/odoo/addons/base/models/ir_actions_report.py +++ b/odoo/addons/base/models/ir_actions_report.py @@ -370,7 +370,7 @@ class IrActionsReport(models.Model): # set context language to body language if node.get('data-oe-lang'): layout_with_lang = layout_with_lang.with_context(lang=node.get('data-oe-lang')) - body = layout_with_lang.render(dict(subst=False, body=lxml.html.tostring(node), base_url=base_url)) + body = layout_with_lang._render(dict(subst=False, body=lxml.html.tostring(node), base_url=base_url)) bodies.append(body) if node.get('data-oe-model') == self.model: res_ids.append(int(node.get('data-oe-id', 0))) @@ -388,8 +388,8 @@ class IrActionsReport(models.Model): if attribute[0].startswith('data-report-'): specific_paperformat_args[attribute[0]] = attribute[1] - header = layout.render(dict(subst=True, body=lxml.html.tostring(header_node), base_url=base_url)) - footer = layout.render(dict(subst=True, body=lxml.html.tostring(footer_node), base_url=base_url)) + header = layout._render(dict(subst=True, body=lxml.html.tostring(header_node), base_url=base_url)) + footer = layout._render(dict(subst=True, body=lxml.html.tostring(footer_node), base_url=base_url)) return bodies, res_ids, header, footer, specific_paperformat_args @@ -533,7 +533,7 @@ class IrActionsReport(models.Model): """ return {} - def render_template(self, template, values=None): + def _render_template(self, template, values=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. :param values: additional methods/variables used in the rendering @@ -561,7 +561,7 @@ class IrActionsReport(models.Model): website=website, web_base_url=self.env['ir.config_parameter'].sudo().get_param('web.base.url', default=''), ) - return view_obj.render_template(template, values) + return view_obj._render_template(template, values) def _post_pdf(self, save_in_attachment, pdf_content=None, res_ids=None): '''Merge the existing attachments by adding one by one the content of the attachments @@ -678,7 +678,7 @@ class IrActionsReport(models.Model): writer.write(result_stream) return result_stream.getvalue() - def render_qweb_pdf(self, res_ids=None, data=None): + def _render_qweb_pdf(self, res_ids=None, data=None): if not data: data = {} data.setdefault('report_type', 'pdf') @@ -686,7 +686,7 @@ class IrActionsReport(models.Model): # In case of test environment without enough workers to perform calls to wkhtmltopdf, # fallback to render_html. if (tools.config['test_enable'] or tools.config['test_file']) and not self.env.context.get('force_report_rendering'): - return self.render_qweb_html(res_ids, data=data) + return self._render_qweb_html(res_ids, data=data) # As the assets are generated during the same transaction as the rendering of the # templates calling them, there is a scenario where the assets are unreachable: when @@ -713,7 +713,7 @@ class IrActionsReport(models.Model): # an asset bundle during the execution of test scenarios. In this case, return # the html version. if isinstance(self.env.cr, TestCursor): - return self.with_context(context).render_qweb_html(res_ids, data=data)[0] + return self.with_context(context)._render_qweb_html(res_ids, data=data)[0] save_in_attachment = OrderedDict() if res_ids: @@ -747,7 +747,7 @@ class IrActionsReport(models.Model): # bypassed raise UserError(_("Unable to find Wkhtmltopdf on this system. The PDF can not be created.")) - html = self.with_context(context).render_qweb_html(res_ids, data=data)[0] + html = self.with_context(context)._render_qweb_html(res_ids, data=data)[0] # Ensure the current document is utf-8 encoded. html = html.decode('utf-8') @@ -772,22 +772,22 @@ class IrActionsReport(models.Model): return pdf_content, 'pdf' @api.model - def render_qweb_text(self, docids, data=None): + def _render_qweb_text(self, docids, data=None): if not data: data = {} data.setdefault('report_type', 'text') data = self._get_rendering_context(docids, data) - return self.render_template(self.report_name, data), 'text' + return self._render_template(self.report_name, data), 'text' @api.model - def render_qweb_html(self, docids, data=None): + def _render_qweb_html(self, docids, data=None): """This method generates and returns html version of a report. """ if not data: data = {} data.setdefault('report_type', 'html') data = self._get_rendering_context(docids, data) - return self.render_template(self.report_name, data), 'html' + return self._render_template(self.report_name, data), 'html' @api.model def _get_rendering_context_model(self): @@ -813,9 +813,9 @@ class IrActionsReport(models.Model): }) return data - def render(self, res_ids, data=None): + def _render(self, res_ids, data=None): report_type = self.report_type.lower().replace('-', '_') - render_func = getattr(self, 'render_' + report_type, None) + render_func = getattr(self, '_render_' + report_type, None) if not render_func: return None return render_func(res_ids, data=data) diff --git a/odoo/addons/base/models/ir_qweb.py b/odoo/addons/base/models/ir_qweb.py index 10ed4ad7c2f..9acfa1be75b 100644 --- a/odoo/addons/base/models/ir_qweb.py +++ b/odoo/addons/base/models/ir_qweb.py @@ -36,7 +36,7 @@ class IrQWeb(models.AbstractModel, QWeb): _description = 'Qweb' @api.model - def render(self, id_or_xml_id, values=None, **options): + def _render(self, id_or_xml_id, values=None, **options): """ render(id_or_xml_id, values, **options) Render the template specified by the given name. @@ -55,7 +55,7 @@ class IrQWeb(models.AbstractModel, QWeb): context = dict(self.env.context, dev_mode='qweb' in tools.config['dev_mode']) context.update(options) - result = super(IrQWeb, self).render(id_or_xml_id, values=values, **context) + result = super(IrQWeb, self)._render(id_or_xml_id, values=values, **context) if b'data-pagebreak=' not in result: return result @@ -112,15 +112,16 @@ class IrQWeb(models.AbstractModel, QWeb): pass return super(IrQWeb, self).compile(id_or_xml_id, options=options) - def load(self, name, options): + def _load(self, name, options): lang = options.get('lang', get_lang(self.env).code) env = self.env if lang != env.context.get('lang'): env = env(context=dict(env.context, lang=lang)) - template = env['ir.ui.view'].sudo().read_template(name) + view_id = self.env['ir.ui.view'].get_view_id(name) + template = env['ir.ui.view'].sudo()._read_template(view_id) - # QWeb's `read_template` will check if one of the first children of + # QWeb's `_read_template` will check if one of the first children of # what we send to it has a "t-name" attribute having `name` as value # to consider it has found it. As it'll never be the case when working # with view ids or children view or children primary views, force it here. @@ -323,7 +324,7 @@ class IrQWeb(models.AbstractModel, QWeb): from odoo.addons.web.controllers.main import module_boot return json.dumps(module_boot()) return '[]' - template = IrQweb.render(xmlid, {"get_modules_order": get_modules_order}) + template = IrQweb._render(xmlid, {"get_modules_order": get_modules_order}) files = [] remains = [] diff --git a/odoo/addons/base/models/ir_qweb_fields.py b/odoo/addons/base/models/ir_qweb_fields.py index c629a55d3c1..eab968c6013 100644 --- a/odoo/addons/base/models/ir_qweb_fields.py +++ b/odoo/addons/base/models/ir_qweb_fields.py @@ -681,7 +681,7 @@ class Contact(models.AbstractModel): 'object': value, 'options': options } - return self.env['ir.qweb'].render('base.contact', val, **options.get('template_options', dict())) + return self.env['ir.qweb']._render('base.contact', val, **options.get('template_options', dict())) class QwebView(models.AbstractModel): @@ -700,4 +700,4 @@ class QwebView(models.AbstractModel): _logger.warning("%s.%s must be a 'ir.ui.view' model." % (record, field_name)) return None - return pycompat.to_text(view.render(options.get('values', {}), engine='ir.qweb')) + return pycompat.to_text(view._render(options.get('values', {}), engine='ir.qweb')) diff --git a/odoo/addons/base/models/ir_ui_view.py b/odoo/addons/base/models/ir_ui_view.py index 1acd844c7cb..6b8b50ceb88 100644 --- a/odoo/addons/base/models/ir_ui_view.py +++ b/odoo/addons/base/models/ir_ui_view.py @@ -1491,6 +1491,9 @@ actual arch. @api.model def read_template(self, xml_id): + """ Return a template content based on external id + Read access on ir.ui.view required + """ return self._read_template(self.get_view_id(xml_id)) @api.model @@ -1599,16 +1602,23 @@ actual arch. return '%s.%s' % (xmlid['module'], xmlid['name']) @api.model - def render_template(self, template, values=None, engine='ir.qweb'): - return self.browse(self.get_view_id(template)).render(values, engine) + def render_public_asset(self, template, values=None): + if template not in PUBLIC_ASSETS: + _logger.warning("Add the external id %s in global variable PUBLC_ASSSETS to make the arch accessible in RPC", template) + raise ValidationError(_("Asset %s not accessible") % template) + template = self.browse(self.get_view_id(template)) + return template.sudo()._render(values, engine="ir.qweb") + + def _render_template(self, template, values=None, engine='ir.qweb'): + return self.browse(self.get_view_id(template))._render(values, engine) - def render(self, values=None, engine='ir.qweb', minimal_qcontext=False): + def _render(self, values=None, engine='ir.qweb', minimal_qcontext=False): assert isinstance(self.id, int) qcontext = dict() if minimal_qcontext else self._prepare_qcontext() qcontext.update(values or {}) - return self.env[engine].render(self.id, qcontext) + return self.env[engine]._render(self.id, qcontext) @api.model def _prepare_qcontext(self): diff --git a/odoo/addons/base/models/qweb.py b/odoo/addons/base/models/qweb.py index 02eebb87fa3..464cb7a166e 100644 --- a/odoo/addons/base/models/qweb.py +++ b/odoo/addons/base/models/qweb.py @@ -240,7 +240,7 @@ class QWeb(object): 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr']) _name_gen = count() - def render(self, template, values=None, **options): + def _render(self, template, values=None, **options): """ render(template, values, **options) Render the template specified by the given name. @@ -351,7 +351,7 @@ class QWeb(object): return (document, template) else: try: - document = options.get('load', self.load)(template, options) + document = options.get('load', self._load)(template, options) except QWebException as e: raise e except Exception as e: @@ -375,7 +375,7 @@ class QWeb(object): return (node, document) return (element, document) - def load(self, template, options): + def _load(self, template, options): """ Load a given template. """ return template diff --git a/odoo/addons/base/tests/test_qweb.py b/odoo/addons/base/tests/test_qweb.py index 780dc6a0cc5..00cf26d4031 100644 --- a/odoo/addons/base/tests/test_qweb.py +++ b/odoo/addons/base/tests/test_qweb.py @@ -25,7 +25,7 @@ class TestQWebTField(TransactionCase): field = etree.Element('span', {'t-field': u'company.name'}) company = self.env['res.company'].create({'name': "My Test Company"}) - result = self.engine.render(field, {'company': company}) + result = self.engine._render(field, {'company': company}) self.assertEqual( etree.fromstring(result), etree.fromstring(u'<span data-oe-model="res.company" data-oe-id="%d" ' @@ -41,7 +41,7 @@ class TestQWebTField(TransactionCase): s = u"Testing «ταБЬℓσ»: 1<2 & 4+1>3, now 20% off!" company = self.env['res.company'].create({'name': s}) - result = self.engine.render(field, {'company': company}) + result = self.engine._render(field, {'company': company}) self.assertEqual( etree.fromstring(result), etree.fromstring(u'<span data-oe-model="res.company" data-oe-id="%d" ' @@ -56,13 +56,13 @@ class TestQWebTField(TransactionCase): field = etree.Element('td', {'t-field': u'company.name'}) with self.assertRaisesRegex(QWebException, r'^RTE widgets do not work correctly'): - self.engine.render(field, {'company': None}) + self.engine._render(field, {'company': None}) def test_reject_t_tag(self): field = etree.Element('t', {'t-field': u'company.name'}) with self.assertRaisesRegex(QWebException, r'^t-field can not be used on a t element'): - self.engine.render(field, {'company': None}) + self.engine._render(field, {'company': None}) def test_render_t_options(self): view1 = self.env['ir.ui.view'].create({ @@ -72,7 +72,7 @@ class TestQWebTField(TransactionCase): <t t-name="base.dummy"><root><span t-esc="5" t-options="{'widget': 'char'}" t-options-widget="'float'" t-options-precision="4"/></root></t> """ }) - text = etree.fromstring(view1.render()).find('span').text + text = etree.fromstring(view1._render()).find('span').text self.assertEqual(text, u'5.0000') def test_xss_breakout(self): @@ -88,7 +88,7 @@ class TestQWebTField(TransactionCase): </t> """ }) - rendered = view.render({'malicious': '1</script><script>alert("pwned")</script><script>'}).decode() + rendered = view._render({'malicious': '1</script><script>alert("pwned")</script><script>'}).decode() self.assertIn('alert', rendered, "%r doesn't seem to be rendered" % rendered) doc = etree.fromstring(rendered) self.assertEqual(len(doc.xpath('//script')), 1) @@ -119,7 +119,7 @@ class TestQWebNS(TransactionCase): """ % expected_result }) - self.assertEqual(etree.fromstring(view1.render()), etree.fromstring(expected_result)) + self.assertEqual(etree.fromstring(view1._render()), etree.fromstring(expected_result)) def test_render_static_xml_with_namespace_2(self): """ Test the rendering on a namespaced view with no static content. The resulting string should be untouched. @@ -157,7 +157,7 @@ class TestQWebNS(TransactionCase): """ % expected_result }) - self.assertEqual(etree.fromstring(view1.render()), etree.fromstring(expected_result)) + self.assertEqual(etree.fromstring(view1._render()), etree.fromstring(expected_result)) def test_render_static_xml_with_useless_distributed_namespace(self): """ Test that redundant namespaces are stripped upon rendering. @@ -190,7 +190,7 @@ class TestQWebNS(TransactionCase): </root> """) - self.assertEqual(etree.fromstring(view1.render()), expected_result) + self.assertEqual(etree.fromstring(view1._render()), expected_result) def test_render_static_xml_with_namespace_3(self): expected_result = u""" @@ -205,7 +205,7 @@ class TestQWebNS(TransactionCase): """ % expected_result }) - self.assertEqual(etree.fromstring(view1.render()), etree.fromstring(expected_result)) + self.assertEqual(etree.fromstring(view1._render()), etree.fromstring(expected_result)) def test_render_dynamic_xml_with_namespace_t_esc(self): """ Test that rendering a template containing a node having both an ns declaration and a t-esc attribute correctly @@ -223,7 +223,7 @@ class TestQWebNS(TransactionCase): expected_result = etree.fromstring(u"""<Invoice xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2">test</Invoice>""") - self.assertEqual(etree.fromstring(view1.render()), expected_result) + self.assertEqual(etree.fromstring(view1._render()), expected_result) def test_render_dynamic_xml_with_namespace_t_esc_with_useless_distributed_namespace(self): """ Test that rendering a template containing a node having both an ns declaration and a t-esc attribute correctly @@ -247,7 +247,7 @@ class TestQWebNS(TransactionCase): </Invoice> """) - self.assertEqual(etree.fromstring(view1.render()), expected_result) + self.assertEqual(etree.fromstring(view1._render()), expected_result) def test_render_dynamic_xml_with_namespace_t_attf(self): """ Test that rendering a template containing a node having both an ns declaration and a t-attf attribute correctly @@ -287,7 +287,7 @@ class TestQWebNS(TransactionCase): </root> """) - self.assertEqual(etree.fromstring(view1.render()), expected_result) + self.assertEqual(etree.fromstring(view1._render()), expected_result) def test_render_dynamic_xml_with_namespace_t_attf_with_useless_distributed_namespace(self): """ Test that rendering a template containing a node having both an ns declaration and a t-attf attribute correctly @@ -329,7 +329,7 @@ class TestQWebNS(TransactionCase): """) - self.assertEqual(etree.fromstring(view1.render()), expected_result) + self.assertEqual(etree.fromstring(view1._render()), expected_result) def test_render_dynamic_xml_with_namespace_2(self): view1 = self.env['ir.ui.view'].create({ @@ -362,7 +362,7 @@ class TestQWebNS(TransactionCase): </Invoice> """) - self.assertEqual(etree.fromstring(view1.render({'version_id': 1.0})), expected_result) + self.assertEqual(etree.fromstring(view1._render({'version_id': 1.0})), expected_result) def test_render_static_xml_with_namespaced_attributes(self): view1 = self.env['ir.ui.view'].create({ @@ -377,7 +377,7 @@ class TestQWebNS(TransactionCase): expected_result = etree.fromstring(u"""<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd">abc</cfdi:Comprobante>""") - self.assertEqual(etree.fromstring(view1.render()), expected_result) + self.assertEqual(etree.fromstring(view1._render()), expected_result) def test_render_dynamic_xml_with_namespaced_attributes(self): view1 = self.env['ir.ui.view'].create({ @@ -392,7 +392,7 @@ class TestQWebNS(TransactionCase): expected_result = etree.fromstring("""<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd">abc</cfdi:Comprobante>""") - self.assertEqual(etree.fromstring(view1.render()), expected_result) + self.assertEqual(etree.fromstring(view1._render()), expected_result) def test_render_static_xml_with_t_call(self): view1 = self.env['ir.ui.view'].create({ @@ -426,7 +426,7 @@ class TestQWebNS(TransactionCase): """ }) - result = view2.render() + result = view2._render() result_etree = etree.fromstring(result) # check that the root tag has all its xmlns @@ -490,7 +490,7 @@ class TestQWebNS(TransactionCase): """) self.assertEqual( - etree.fromstring(view1.with_context(check_view_ids=[view1.id, view2.id]).render()), + etree.fromstring(view1.with_context(check_view_ids=[view1.id, view2.id])._render()), expected_result ) @@ -516,7 +516,7 @@ class TestQWebNS(TransactionCase): error_msg = e.args[0] with self.assertRaises(QWebException, msg=error_msg): - view1.render() + view1._render() def test_render_t_call_propagates_t_lang(self): current_lang = 'en_US' @@ -554,7 +554,7 @@ class TestQWebNS(TransactionCase): """ % other_lang }) - rendered = view2.with_context(lang=current_lang).render().strip() + rendered = view2.with_context(lang=current_lang)._render().strip() self.assertEqual(rendered, b'9/000/000*00') @@ -622,7 +622,7 @@ class TestQWeb(TransactionCase): result = doc.find('result[@id="{}"]'.format(template)).text self.assertEqual( - qweb.render(template, values=params, load=loader).strip(), + qweb._render(template, values=params, load=loader).strip(), (result or u'').strip().encode('utf-8'), template ) @@ -646,7 +646,7 @@ class TestPageSplit(TransactionCase): </t> ''' }) - rendered = html.fromstring(self.env['ir.qweb'].render(t.id)) + rendered = html.fromstring(self.env['ir.qweb']._render(t.id)) ref = E.div( E.table(E.tr()), E.div({'style': 'page-break-after: always'}), @@ -669,7 +669,7 @@ class TestPageSplit(TransactionCase): </t> ''' }) - rendered = html.fromstring(self.env['ir.qweb'].render(t.id)) + rendered = html.fromstring(self.env['ir.qweb']._render(t.id)) self.assertTreesEqual( rendered, E.div( @@ -694,7 +694,7 @@ class TestPageSplit(TransactionCase): </t> ''' }) - rendered = html.fromstring(self.env['ir.qweb'].render(t.id)) + rendered = html.fromstring(self.env['ir.qweb']._render(t.id)) self.assertTreesEqual( rendered, E.div(E.table(E.tr(), E.tr(), E.tr())) diff --git a/odoo/addons/base/tests/test_reports.py b/odoo/addons/base/tests/test_reports.py index bcbdb9bae0d..3ba9a669df6 100644 --- a/odoo/addons/base/tests/test_reports.py +++ b/odoo/addons/base/tests/test_reports.py @@ -28,6 +28,6 @@ class TestReports(odoo.tests.TransactionCase): report_records = report_records[:1] # Test report generation - report.render_qweb_html(report_records.ids) + report._render_qweb_html(report_records.ids) else: continue diff --git a/odoo/addons/base/tests/test_views.py b/odoo/addons/base/tests/test_views.py index 02ac6af18c2..27a465b713a 100644 --- a/odoo/addons/base/tests/test_views.py +++ b/odoo/addons/base/tests/test_views.py @@ -2855,8 +2855,8 @@ class TestQWebRender(ViewCase): }) # render view and child view with an id - content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id]).render(view1.id) - content2 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id]).render(view2.id) + content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id])._render(view1.id) + content2 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id])._render(view2.id) self.assertEqual(content1, content2) @@ -2866,14 +2866,14 @@ class TestQWebRender(ViewCase): self.env.cr.execute("INSERT INTO ir_model_data(name, model, res_id, module)" "VALUES ('dummy_ext', 'ir.ui.view', %s, 'base')" % view2.id) - content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id]).render('base.dummy') - content2 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id]).render('base.dummy_ext') + content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id])._render('base.dummy') + content2 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id])._render('base.dummy_ext') self.assertEqual(content1, content2) # render view and primary extension with an id - content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id]).render(view1.id) - content3 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id]).render(view3.id) + content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id])._render(view1.id) + content3 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id])._render(view3.id) self.assertNotEqual(content1, content3) @@ -2881,8 +2881,8 @@ class TestQWebRender(ViewCase): self.env.cr.execute("INSERT INTO ir_model_data(name, model, res_id, module)" "VALUES ('dummy_primary_ext', 'ir.ui.view', %s, 'base')" % view3.id) - content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id]).render('base.dummy') - content3 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id]).render('base.dummy_primary_ext') + content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id])._render('base.dummy') + content3 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id])._render('base.dummy_primary_ext') self.assertNotEqual(content1, content3) diff --git a/odoo/addons/base/wizard/base_document_layout.py b/odoo/addons/base/wizard/base_document_layout.py index d380c1c49a6..5232acb7f06 100644 --- a/odoo/addons/base/wizard/base_document_layout.py +++ b/odoo/addons/base/wizard/base_document_layout.py @@ -64,7 +64,7 @@ class BaseDocumentLayout(models.TransientModel): for wizard in self: if wizard.report_layout_id: ir_qweb = wizard.env['ir.qweb'] - wizard.preview = ir_qweb.render('base.layout_preview', {'company': wizard}) + wizard.preview = ir_qweb._render('base.layout_preview', {'company': wizard}) else: wizard.preview = False |
