[IMP] res_users: improve create, write, read, and default_get with group fields

bzr revid: rco@openerp.com-20111209134658-vmvfvlngoa1wd7y1
This commit is contained in:
Raphael Collet 2011-12-09 14:46:58 +01:00
parent e85fd9b685
commit a15cfa48c6
1 changed files with 40 additions and 39 deletions

View File

@ -800,59 +800,60 @@ class users_view(osv.osv):
_inherit = 'res.users'
def create(self, cr, uid, values, context=None):
self._process_values_groups(cr, uid, values, context)
self._set_reified_groups(values)
return super(users_view, self).create(cr, uid, values, context)
def write(self, cr, uid, ids, values, context=None):
self._process_values_groups(cr, uid, values, context)
self._set_reified_groups(values)
return super(users_view, self).write(cr, uid, ids, values, context)
def _process_values_groups(self, cr, uid, values, context=None):
""" transform all reified group fields into a 'groups_id', adding
also the implied groups """
def _set_reified_groups(self, values):
""" reflect reified group fields in values into 'groups_id' """
add, remove = [], []
for k in values.keys():
if is_boolean_group(k):
target = add if values.pop(k) else remove
target.append(get_boolean_group(k))
elif is_boolean_groups(k):
if not values.pop(k):
remove.extend(get_boolean_groups(k))
elif is_selection_groups(k):
remove.extend(get_selection_groups(k))
selected = values.pop(k)
for f in values.keys():
if is_boolean_group(f):
target = add if values.pop(f) else remove
target.append(get_boolean_group(f))
elif is_boolean_groups(f):
if not values.pop(f):
remove.extend(get_boolean_groups(f))
elif is_selection_groups(f):
remove.extend(get_selection_groups(f))
selected = values.pop(f)
if selected:
add.append(selected)
if add or remove:
# remove groups in 'remove' and add groups in 'add'
gdiff = [(3, id) for id in remove] + [(4, id) for id in add]
values.setdefault('groups_id', []).extend(gdiff)
return True
# remove groups in 'remove' and add groups in 'add'
gdiff = [(3, id) for id in remove] + [(4, id) for id in add]
values.setdefault('groups_id', []).extend(gdiff)
def default_get(self, cr, uid, fields, context=None):
group_fields, fields = partition(is_reified_group, fields)
fields.append('groups_id')
values = super(users_view, self).default_get(cr, uid, fields, context)
self._get_reified_groups(group_fields, values)
return values
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
if not fields:
fields = self.fields_get(cr, uid, context=context).keys()
group_fields, fields = partition(is_reified_group, fields)
fields.append('groups_id')
res = super(users_view, self).read(cr, uid, ids, fields, context=context, load=load)
for values in (res if isinstance(res, list) else [res]):
self._get_reified_groups(group_fields, values)
return res
if group_fields:
# first read the normal fields (and 'groups_id')
fields.append('groups_id')
res = super(users_view, self).read(cr, uid, ids, fields, context=context, load=load)
# add reified groups fields in result(s)
records = res if isinstance(res, list) else [res]
for record in records:
user_group_ids = set(record['groups_id'])
for f in group_fields:
if is_boolean_group(f):
record[f] = get_boolean_group(f) in user_group_ids
elif is_boolean_groups(f):
record[f] = not user_group_ids.isdisjoint(get_boolean_groups(f))
elif is_selection_groups(f):
selected = [gid for gid in get_selection_groups(f) if gid in user_group_ids]
record[f] = selected and selected[-1] or False
return res
return super(users_view, self).read(cr, uid, ids, fields, context=context, load=load)
def _get_reified_groups(self, fields, values):
""" compute the given reified group fields in the dictionary values """
gids = set(values.get('groups_id') or [])
for f in fields:
if is_boolean_group(f):
values[f] = get_boolean_group(f) in gids
elif is_boolean_groups(f):
values[f] = not gids.isdisjoint(get_boolean_groups(f))
elif is_selection_groups(f):
selected = [gid for gid in get_selection_groups(f) if gid in gids]
values[f] = selected and selected[-1] or False
def fields_get(self, cr, uid, allfields=None, context=None, write_access=True):
res = super(users_view, self).fields_get(cr, uid, allfields, context, write_access)