diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py
index 46a89a76d41..c2eb62acfb5 100644
--- a/addons/website/models/ir_ui_view.py
+++ b/addons/website/models/ir_ui_view.py
@@ -272,6 +272,31 @@ class View(models.Model):
# prefer inactive website-specific views over active generic ones
return views.filter_duplicate().filtered('active')
+ @api.model
+ def _get_filter_xmlid_query(self):
+ """This method add some specific view that do not have XML ID
+ """
+ if not self._context.get('website_id'):
+ return super()._get_filter_xmlid_query()
+ else:
+ return """SELECT res_id
+ FROM ir_model_data
+ WHERE res_id IN %(res_ids)s
+ AND model = 'ir.ui.view'
+ AND module IN %(modules)s
+ UNION
+ SELECT sview.id
+ FROM ir_ui_view sview
+ INNER JOIN ir_ui_view oview USING (key)
+ INNER JOIN ir_model_data d
+ ON oview.id = d.res_id
+ AND d.model = 'ir.ui.view'
+ AND d.module IN %(modules)s
+ WHERE sview.id IN %(res_ids)s
+ AND sview.website_id IS NOT NULL
+ AND oview.website_id IS NULL;
+ """
+
@api.model
@tools.ormcache_context('self.env.uid', 'self.env.su', 'xml_id', keys=('website_id',))
def get_view_id(self, xml_id):
diff --git a/addons/website/tests/test_views.py b/addons/website/tests/test_views.py
index 3b43f058d68..ad060103d24 100644
--- a/addons/website/tests/test_views.py
+++ b/addons/website/tests/test_views.py
@@ -896,6 +896,54 @@ class TestCowViewSaving(common.TransactionCase):
# 5 | Extension | , extended content | 1 | 4 | website.extension_view
# 3 | Extension 2 | , extended content 2 | 1 | 5 | website.extension_view_2
+ def test_cow_extension_with_install(self):
+ View = self.env['ir.ui.view']
+ # Base
+ v1 = View.create({
+ 'name': 'Base',
+ 'type': 'qweb',
+ 'arch': '
base content
',
+ 'key': 'website.base_view_v1',
+ }).with_context(load_all_views=True)
+ self.env['ir.model.data'].create({
+ 'module': 'website',
+ 'name': 'base_view_v1',
+ 'model': v1._name,
+ 'res_id': v1.id,
+ })
+
+ # Extension
+ v2 = View.create({
+ 'name': 'Extension',
+ 'mode': 'extension',
+ 'inherit_id': v1.id,
+ 'arch': 'extended content
',
+ 'key': 'website.extension_view_v2',
+ })
+ self.env['ir.model.data'].create({
+ 'module': 'website',
+ 'name': 'extension_view_v2',
+ 'model': v2._name,
+ 'res_id': v2.id,
+ })
+
+ # multiwebsite specific
+ v1.with_context(website_id=1).write({'name': 'Extension Specific'})
+
+ original_pool_init = View.pool._init
+ View.pool._init = True
+
+ try:
+ # Simulate module install
+ View._load_records([dict(xml_id='website.extension2_view', values={
+ 'name': ' ---',
+ 'mode': 'extension',
+ 'inherit_id': v1.id,
+ 'arch': 'EXTENSION
',
+ 'key': 'website.extension2_view',
+ })])
+ finally:
+ View.pool._init = original_pool_init
@tagged('-at_install', 'post_install')
class Crawler(HttpCase):
diff --git a/odoo/addons/base/models/ir_ui_view.py b/odoo/addons/base/models/ir_ui_view.py
index 10fdd4d0eb7..efa4dcce214 100644
--- a/odoo/addons/base/models/ir_ui_view.py
+++ b/odoo/addons/base/models/ir_ui_view.py
@@ -526,6 +526,14 @@ actual arch.
['active', '=', True],
]
+ @api.model
+ def _get_filter_xmlid_query(self):
+ """This method is meant to be overridden by other modules.
+ """
+ return """SELECT res_id FROM ir_model_data
+ WHERE res_id IN %(res_ids)s AND model = 'ir.ui.view' AND module IN %(modules)s
+ """
+
def get_inheriting_views_arch(self, model):
"""Retrieves the sets of views that should currently be used in the
system in the right order. During the module upgrade phase it
@@ -571,11 +579,8 @@ actual arch.
ids_to_check = [vid for vid in view_ids if vid not in check_view_ids]
if ids_to_check:
loaded_modules = tuple(self.pool._init_modules) + (self._context.get('install_module'),)
- query = """
- SELECT res_id FROM ir_model_data
- WHERE res_id IN %s AND model = 'ir.ui.view' AND module IN %s
- """
- self.env.cr.execute(query, [tuple(ids_to_check), loaded_modules])
+ query = self._get_filter_xmlid_query()
+ self.env.cr.execute(query, {'res_ids': tuple(ids_to_check), 'modules': loaded_modules})
valid_view_ids = [r[0] for r in self.env.cr.fetchall()] + check_view_ids
view_ids = [vid for vid in view_ids if vid in valid_view_ids]