From fea00d94296fd6d0511e5165e070c4acc61acab0 Mon Sep 17 00:00:00 2001
From: Christophe Simonis <chs@openerp.com>
Date: Fri, 7 May 2010 15:50:02 +0200
Subject: [PATCH] [FIX]orm: invisible fields with widget=selection must have at
 least the default value into the selection

lp bug: https://launchpad.net/bugs/575748 fixed

bzr revid: chs@openerp.com-20100507135002-78s6p0rwccu1vrdd
---
 bin/osv/orm.py | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/bin/osv/orm.py b/bin/osv/orm.py
index 133f6cdda68e..6a96f22ff404 100644
--- a/bin/osv/orm.py
+++ b/bin/osv/orm.py
@@ -1153,12 +1153,8 @@ class orm_template(object):
         def check_group(node):
             if node.get('groups'):
                 groups = node.get('groups').split(',')
-                can_see = False
                 access_pool = self.pool.get('ir.model.access')
-                for group in groups:
-                    can_see = can_see or access_pool.check_groups(cr, user, group)
-                    if can_see:
-                        break
+                can_see = any(access_pool.check_groups(cr, user, group) for group in groups)
                 if not can_see:
                     node.set('invisible', '1')
                     if 'attrs' in node.attrib:
@@ -1199,7 +1195,8 @@ class orm_template(object):
                     column = False
 
                 if column:
-                    relation = column._obj
+                    relation = self.pool.get(column._obj)
+
                     childs = False
                     views = {}
                     for f in node:
@@ -1207,7 +1204,7 @@ class orm_template(object):
                             node.remove(f)
                             ctx = context.copy()
                             ctx['base_model_name'] = self._name
-                            xarch, xfields = self.pool.get(relation).__view_look_dom_arch(cr, user, f, view_id, ctx)
+                            xarch, xfields = relation.__view_look_dom_arch(cr, user, f, view_id, ctx)
                             views[str(f.tag)] = {
                                 'arch': xarch,
                                 'fields': xfields
@@ -1215,7 +1212,13 @@ class orm_template(object):
                     attrs = {'views': views}
                     if node.get('widget') and node.get('widget') == 'selection':
                         if not check_group(node):
-                            attrs['selection'] = []
+                            # the field is just invisible. default value must be in the selection
+                            name = node.get('name')
+                            default = self.default_get(cr, user, [name], context=context).get(name)
+                            if default:
+                                attrs['selection'] = relation.name_get(cr, 1, default, context=context)
+                            else:
+                                attrs['selection'] = []
                         # We can not use the 'string' domain has it is defined according to the record !
                         else:
                             dom = []
@@ -1223,7 +1226,7 @@ class orm_template(object):
                                 dom = column._domain
                             dom += eval(node.get('domain','[]'), {'uid':user, 'time':time})
                             context.update(eval(node.get('context','{}')))
-                            attrs['selection'] = self.pool.get(relation)._name_search(cr, user, '', dom, context=context, limit=None, name_get_uid=1)
+                            attrs['selection'] = relation._name_search(cr, user, '', dom, context=context, limit=None, name_get_uid=1)
                             if (node.get('required') and not int(node.get('required'))) or not column.required:
                                 attrs['selection'].append((False,''))
                 fields[node.get('name')] = attrs
-- 
GitLab