diff --git a/openerp/addons/base/ir/ir_ui_view.py b/openerp/addons/base/ir/ir_ui_view.py
index 7a14bf561e4..393e5cf6545 100644
--- a/openerp/addons/base/ir/ir_ui_view.py
+++ b/openerp/addons/base/ir/ir_ui_view.py
@@ -125,11 +125,15 @@ class view(osv.osv):
try:
fvg = self.pool.get(view.model).fields_view_get(cr, uid, view_id=view.id, view_type=view.type, context=context)
return fvg['arch']
- except:
+ except Exception:
_logger.exception("Can't render view %s for model: %s", view.xml_id, view.model)
return False
def _check_xml(self, cr, uid, ids, context=None):
+ if context is None:
+ context = {}
+ context['check_view_ids'] = ids
+
for view in self.browse(cr, uid, ids, context):
# Sanity check: the view should not break anything upon rendering!
view_arch_utf8 = self._check_render_view(cr, uid, view, context=context)
@@ -175,13 +179,15 @@ class view(osv.osv):
:rtype: list of tuples
:return: [(view_arch,view_id), ...]
"""
+
user_groups = frozenset(self.pool.get('res.users').browse(cr, 1, uid, context).groups_id)
if self.pool._init:
# Module init currently in progress, only consider views from modules whose code was already loaded
+ check_view_ids = context and context.get('check_view_ids') or (0,)
query = """SELECT v.id FROM ir_ui_view v LEFT JOIN ir_model_data md ON (md.model = 'ir.ui.view' AND md.res_id = v.id)
- WHERE v.inherit_id=%s AND v.model=%s AND (md.module IS NULL or md.module in %s)
+ WHERE v.inherit_id=%s AND v.model=%s AND (md.module in %s OR v.id in %s)
ORDER BY priority"""
- query_params = (view_id, model, tuple(self.pool._init_modules))
+ query_params = (view_id, model, tuple(self.pool._init_modules), tuple(check_view_ids))
else:
# Modules fully loaded, consider all views
query = """SELECT v.id FROM ir_ui_view v
diff --git a/openerp/addons/base/tests/__init__.py b/openerp/addons/base/tests/__init__.py
index d891bc06fda..f4432f6e1eb 100644
--- a/openerp/addons/base/tests/__init__.py
+++ b/openerp/addons/base/tests/__init__.py
@@ -4,6 +4,7 @@ import test_ir_attachment
import test_ir_values
import test_menu
import test_search
+import test_views
checks = [
test_base,
@@ -12,4 +13,5 @@ checks = [
test_ir_values,
test_menu,
test_search,
+ test_views,
]
diff --git a/openerp/addons/base/tests/test_views.py b/openerp/addons/base/tests/test_views.py
new file mode 100644
index 00000000000..74f6f847dba
--- /dev/null
+++ b/openerp/addons/base/tests/test_views.py
@@ -0,0 +1,44 @@
+import unittest2
+
+import openerp.tests.common as common
+from openerp.osv.orm import except_orm
+from openerp.tools import mute_logger
+
+class test_views(common.TransactionCase):
+
+ @mute_logger('openerp.osv.orm', 'openerp.addons.base.ir.ir_ui_view')
+ def test_00_init_check_views(self):
+ Views = self.registry('ir.ui.view')
+
+ self.assertTrue(Views.pool._init)
+
+ error_msg = "Invalid XML for View Architecture"
+ # test arch check is call for views without xmlid during registry initialization
+ with self.assertRaisesRegexp(except_orm, error_msg):
+ Views.create(self.cr, self.uid, {
+ 'name': 'Test View #1',
+ 'model': 'ir.ui.view',
+ 'arch': """
+
+
+
+ """,
+ })
+
+ # same for inherited views
+ with self.assertRaisesRegexp(except_orm, error_msg):
+ # Views.pudb = True
+ Views.create(self.cr, self.uid, {
+ 'name': 'Test View #2',
+ 'model': 'ir.ui.view',
+ 'inherit_id': self.browse_ref('base.view_view_tree').id,
+ 'arch': """
+
+
+
+ """,
+ })
+
+
+if __name__ == '__main__':
+ unittest2.main()
diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index 9ee5d5416d5..6dbc91de0e7 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -2190,7 +2190,7 @@ class BaseModel(object):
are applied
"""
- sql_inherit = self.pool.get('ir.ui.view').get_inheriting_views_arch(cr, user, inherit_id, self._name)
+ sql_inherit = self.pool.get('ir.ui.view').get_inheriting_views_arch(cr, user, inherit_id, self._name, context=context)
for (view_arch, view_id) in sql_inherit:
source = apply_inheritance_specs(source, view_arch, view_id)
source = apply_view_inheritance(cr, user, source, view_id)