From 3ec5a230074a1009218b4c99ad4e40331db39f2d Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 19 Oct 2016 15:20:14 +0200 Subject: [PATCH] [FIX] base: recompute view.model_data_id (#13885) The field was a stored computed field without dependencies, and therefore it was never (re)computed. Add a simple dependency on the model `ir.model.data` to make the recomputation everytime a view is modified. Moreover, when views are created from modules, delay the recomputation of view fields until their `ir.model.data` record is created. --- addons/website/tests/test_views.py | 21 +++++++++++++++++++++ openerp/addons/base/ir/ir_ui_view.py | 15 ++++++++++++--- openerp/addons/base/tests/test_views.py | 8 ++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/addons/website/tests/test_views.py b/addons/website/tests/test_views.py index 9ab3e77c987..6ec6bff72c7 100644 --- a/addons/website/tests/test_views.py +++ b/addons/website/tests/test_views.py @@ -141,6 +141,24 @@ class TestViewSaving(common.TransactionCase): Company = self.registry('res.company') View = self.registry('ir.ui.view') + # create a view with an xmlid, like the file import would + with self.env.norecompute(): + self.view_id = View.create(self.cr, self.uid, { + 'name': "Test View", + 'type': 'qweb', + 'arch': ET.tostring(self.arch, encoding='utf-8').decode('utf-8') + }) + imd = self.env['ir.model.data'].create({ + 'module': 'website', + 'name': 'test_view', + 'model': 'ir.ui.view', + 'res_id': self.view_id, + }) + + # the xml_id of the view should not be flagged as 'noupdate' + self.assertEqual(View.browse(self.cr, self.uid, self.view_id).model_data_id, imd) + self.assertFalse(imd.noupdate) + replacement = ET.tostring(h.DIV( h.H3("Column 2"), h.UL( @@ -152,6 +170,9 @@ class TestViewSaving(common.TransactionCase): View.save(self.cr, self.uid, res_id=self.view_id, value=replacement, xpath='/div/div[2]') + # the xml_id of the view should be flagged as 'noupdate' + self.assertTrue(imd.noupdate) + company = Company.browse(self.cr, self.uid, 1) self.assertEqual(company.name, "Acme Corporation") self.assertEqual(company.phone, "+12 3456789") diff --git a/openerp/addons/base/ir/ir_ui_view.py b/openerp/addons/base/ir/ir_ui_view.py index 52beff348da..cbef198c820 100644 --- a/openerp/addons/base/ir/ir_ui_view.py +++ b/openerp/addons/base/ir/ir_ui_view.py @@ -229,10 +229,11 @@ actual arch. for view, view_wo_lang in zip(self, self.with_context(lang=None)): view_wo_lang.arch = view.arch_base + @api.depends('write_date') def _compute_model_data_id(self): - # get the last ir_model_data record corresponding to self + # get the first ir_model_data record corresponding to self domain = [('model', '=', 'ir.ui.view'), ('res_id', 'in', self.ids)] - for data in self.env['ir.model.data'].search_read(domain, ['res_id']): + for data in self.env['ir.model.data'].search_read(domain, ['res_id'], order='id desc'): view = self.browse(data['res_id']) view.model_data_id = data['id'] @@ -337,7 +338,15 @@ actual arch. values['name'] = "%s %s" % (values.get('model'), values['type']) self.clear_caches() - return super(View, self).create(self._compute_defaults(values)) + + if 'install_mode_data' in self._context: + # the view is created from a data file by installing a module; delay + # the recomputation of field 'model_data_id' until its xmlid record + # is created + with self.env.norecompute(): + return super(View, self).create(self._compute_defaults(values)) + else: + return super(View, self).create(self._compute_defaults(values)) @api.multi def write(self, vals): diff --git a/openerp/addons/base/tests/test_views.py b/openerp/addons/base/tests/test_views.py index a4ef571f59a..7fbec8004e4 100644 --- a/openerp/addons/base/tests/test_views.py +++ b/openerp/addons/base/tests/test_views.py @@ -14,6 +14,14 @@ import openerp.tools Field = E.field +class ViewXMLID(common.TransactionCase): + def test_model_data_id(self): + """ Check whether views know their xmlid record. """ + view = self.env.ref('base.view_company_form') + self.assertTrue(view) + self.assertTrue(view.model_data_id) + self.assertEqual(view.model_data_id.complete_name, 'base.view_company_form') + class ViewCase(common.TransactionCase): def setUp(self): super(ViewCase, self).setUp()