diff --git a/openerp/addons/base/ir/ir_ui_view.py b/openerp/addons/base/ir/ir_ui_view.py index db6447bdeac..f1dd0508dbe 100644 --- a/openerp/addons/base/ir/ir_ui_view.py +++ b/openerp/addons/base/ir/ir_ui_view.py @@ -560,7 +560,7 @@ class view(osv.osv): children = True modifiers = {} - Model = self.pool[model] + Model = self.pool.get(model) def encode(s): if isinstance(s, unicode): @@ -577,19 +577,17 @@ class view(osv.osv): :return: True if field should be included in the result of fields_view_get """ - if node.tag == 'field' and node.get('name') in Model._all_columns: + if Model and node.tag == 'field' and node.get('name') in Model._all_columns: column = Model._all_columns[node.get('name')].column - if column.groups and not self.user_has_groups(cr, user, - groups=column.groups, - context=context): + if column.groups and not self.user_has_groups( + cr, user, groups=column.groups, context=context): node.getparent().remove(node) fields.pop(node.get('name'), None) # no point processing view-level ``groups`` anymore, return return False if node.get('groups'): - can_see = self.user_has_groups(cr, user, - groups=node.get('groups'), - context=context) + can_see = self.user_has_groups( + cr, user, groups=node.get('groups'), context=context) if not can_see: node.set('invisible', '1') modifiers['invisible'] = True @@ -728,7 +726,7 @@ class view(osv.osv): def _disable_workflow_buttons(self, cr, user, model, node): """ Set the buttons in node to readonly if the user can't activate them. """ - if user == 1: + if model is None or user == 1: # admin user can always activate workflow buttons return node @@ -763,7 +761,8 @@ class view(osv.osv): """ fields = {} - Model = self.pool[model] + Model = self.pool.get(model) + if node.tag == 'diagram': if node.getchildren()[0].tag == 'node': node_model = self.pool[node.getchildren()[0].get('object')] @@ -774,8 +773,9 @@ class view(osv.osv): if node.getchildren()[1].tag == 'arrow': arrow_fields = self.pool[node.getchildren()[1].get('object')].fields_get(cr, user, None, context) fields.update(arrow_fields) - else: + elif Model: fields = Model.fields_get(cr, user, None, context) + fields_def = self.__view_look_dom(cr, user, model, node, view_id, False, fields, context=context) node = self._disable_workflow_buttons(cr, user, model, node) if node.tag in ('kanban', 'tree', 'form', 'gantt'): diff --git a/openerp/addons/base/tests/test_views.py b/openerp/addons/base/tests/test_views.py index 358d028073f..6bde7ec04c4 100644 --- a/openerp/addons/base/tests/test_views.py +++ b/openerp/addons/base/tests/test_views.py @@ -1,5 +1,6 @@ +# -*- encoding: utf-8 -*- from lxml import etree as ET -from lxml.builder import E +from lxml.builder import E, ElementMaker from openerp.tests import common import unittest2 @@ -220,3 +221,72 @@ class TestViewCombined(common.TransactionCase): * defaults mapping * ? """ + +class TestNoModel(common.TransactionCase): + def test_create_view_nomodel(self): + View = self.registry('ir.ui.view') + view_id = View.create(self.cr, self.uid, { + 'name': 'dummy', + 'arch': '
', + 'inherit_id': False + }) + [view] = View.read(self.cr, self.uid, [view_id]) + self.assertEqual(view, { + 'id': view_id, + 'name': 'dummy', + 'arch': '', + 'type': 'form', + 'priority': 16, + 'inherit_id': False, + 'field_parent': False, + 'groups_id': [], + 'xml_id': '', + 'model_ids': [], + 'model': '', + }) + + arch = E.body( + E.div( + E.h1("Title"), + id="header"), + E.p("Welcome!"), + E.div( + E.hr(), + E.p("Copyright copyrighter", {'class': 'legalese'}), + id="footer"), + {'class': "index"},) + def test_fields_mess(self): + """ + Try to call __view_look_dom_arch without a model provided, will need + to be altered once it's broken up into sane components + """ + View = self.registry('ir.ui.view') + + sarch, fields = View._view__view_look_dom_arch( + self.cr, self.uid, None, self.arch, None) + + self.assertEqual(sarch, ET.tostring(self.arch, encoding='utf-8')) + self.assertEqual(fields, {}) + + def test_mess_translation(self): + """ + Test if translations work correctly without a model + """ + View = self.registry('ir.ui.view') + self.registry('res.lang').load_lang(self.cr, self.uid, 'fr_FR') + self.registry('ir.translation').create(self.cr, self.uid, { + 'name': '', + 'type': 'view', + 'lang': 'fr_FR', + 'src': 'Copyright copyrighter', + 'value': u"Copyrighter, tous droits réservés", + }) + sarch, fields = View._view__view_look_dom_arch( + self.cr, self.uid, None,self.arch, None, {'lang': 'fr_FR'}) + self.assertEqual( + sarch, + ET.tostring(self.arch, encoding='utf-8') + .replace('Copyright copyrighter', + 'Copyrighter, tous droits réservés')) + self.assertEqual(fields, {}) +