summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@openerp.com>2016-10-19 15:20:14 +0200
committerGitHub <noreply@github.com>2016-10-19 15:20:14 +0200
commit3ec5a230074a1009218b4c99ad4e40331db39f2d (patch)
tree7031bbf81e788c887f10a932c99b2ea603969151
parentd3e2aa5551403606087b3247edf4cf683ac02671 (diff)
[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.
-rw-r--r--addons/website/tests/test_views.py21
-rw-r--r--openerp/addons/base/ir/ir_ui_view.py15
-rw-r--r--openerp/addons/base/tests/test_views.py8
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()