From cf63d4d277ef1ba02ff4ebcdae8583332a1775b1 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Tue, 23 Jun 2015 14:39:37 +0200 Subject: [PATCH] [FIX] share,base: avoid loading order issues Move share column to base instead of module share. The column is used to filter some groups and make them hidden from the res.users form. However, if a module was loaded before the module share (e.g. depends only from base), when upgraded, the eventual update of a res.group regenerated the res.user view (to compute in_group_XX fields). This recomputation was done before the module share was loaded in the registry (due to the dependency graph) and the override of get_application_groups was not done, including shared groups in the user form. As we can not guarantee that a module is loaded, better to move to base module. As share depends only of mail and is autoinstall, it was installed on most instances anyway. Fixes #6324 Fixes #5820 --- addons/mail/views/res_users_views.xml | 12 ----- addons/share/__init__.py | 1 - addons/share/res_users.py | 53 -------------------- addons/share/res_users_view.xml | 57 ---------------------- openerp/addons/base/res/res_users.py | 27 +++++++++- openerp/addons/base/res/res_users_view.xml | 9 +++- 6 files changed, 34 insertions(+), 125 deletions(-) delete mode 100644 addons/share/res_users.py delete mode 100644 addons/share/res_users_view.xml diff --git a/addons/mail/views/res_users_views.xml b/addons/mail/views/res_users_views.xml index bee14dc64ec..d76e05d43cb 100644 --- a/addons/mail/views/res_users_views.xml +++ b/addons/mail/views/res_users_views.xml @@ -16,18 +16,6 @@ - - - res.users.form.mail diff --git a/addons/share/__init__.py b/addons/share/__init__.py index dd5cb0e353b..62d47e36261 100644 --- a/addons/share/__init__.py +++ b/addons/share/__init__.py @@ -2,5 +2,4 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import ir_model -import res_users import wizard diff --git a/addons/share/res_users.py b/addons/share/res_users.py deleted file mode 100644 index f0fcb6afdf4..00000000000 --- a/addons/share/res_users.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. -from openerp.osv import fields, osv -from openerp import SUPERUSER_ID - -class res_users(osv.osv): - _name = 'res.users' - _inherit = 'res.users' - - def _is_share(self, cr, uid, ids, name, args, context=None): - res = {} - for user in self.browse(cr, uid, ids, context=context): - res[user.id] = not self.has_group(cr, user.id, 'base.group_user') - return res - - def _get_users_from_group(self, cr, uid, ids, context=None): - result = set() - groups = self.pool['res.groups'].browse(cr, uid, ids, context=context) - # Clear cache to avoid perf degradation on databases with thousands of users - groups.invalidate_cache() - for group in groups: - result.update(user.id for user in group.users) - return list(result) - - _columns = { - 'share': fields.function(_is_share, string='Share User', type='boolean', - store={ - 'res.users': (lambda self, cr, uid, ids, c={}: ids, None, 50), - 'res.groups': (_get_users_from_group, None, 50), - }, help="External user with limited access, created only for the purpose of sharing data."), - } - - -class res_groups(osv.osv): - _name = "res.groups" - _inherit = 'res.groups' - _columns = { - 'share': fields.boolean('Share Group', readonly=True, - help="Group created to set access rights for sharing data with some users.") - } - - def init(self, cr): - # force re-generation of the user groups view without the shared groups - self.update_user_groups_view(cr, SUPERUSER_ID) - parent_class = super(res_groups, self) - if hasattr(parent_class, 'init'): - parent_class.init(cr) - - def get_application_groups(self, cr, uid, domain=None, context=None): - if domain is None: - domain = [] - domain.append(('share', '=', False)) - return super(res_groups, self).get_application_groups(cr, uid, domain=domain, context=context) diff --git a/addons/share/res_users_view.xml b/addons/share/res_users_view.xml deleted file mode 100644 index cd9f7ad4f4c..00000000000 --- a/addons/share/res_users_view.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - res.users.search.share - res.users - - - - - - - - - - - - - - Users - {'search_default_no_share': 1} - - - - res.groups.search.share - res.groups - - - - - - - - - - - - - Groups - {'search_default_no_share': 1} - - - res.groups.form - res.groups - - - - {'search_default_no_share':1} - - - - - - - - diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 5e01192fc1c..570db6f2e30 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -85,6 +85,8 @@ class res_groups(osv.osv): 'comment' : fields.text('Comment', size=250, translate=True), 'category_id': fields.many2one('ir.module.category', 'Application', select=True), 'full_name': fields.function(_get_full_name, type='char', string='Group Name', fnct_search=_search_group), + 'share': fields.boolean('Share Group', + help="Group created to set access rights for sharing data with some users.") } _sql_constraints = [ @@ -146,6 +148,21 @@ class res_users(osv.osv): def _get_password(self, cr, uid, ids, arg, karg, context=None): return dict.fromkeys(ids, '') + def _is_share(self, cr, uid, ids, name, args, context=None): + res = {} + for user in self.browse(cr, uid, ids, context=context): + res[user.id] = not self.has_group(cr, user.id, 'base.group_user') + return res + + def _get_users_from_group(self, cr, uid, ids, context=None): + result = set() + groups = self.pool['res.groups'].browse(cr, uid, ids, context=context) + # Clear cache to avoid perf degradation on databases with thousands of users + groups.invalidate_cache() + for group in groups: + result.update(user.id for user in group.users) + return list(result) + _columns = { 'id': fields.integer('ID'), 'login_date': fields.datetime('Latest connection', select=1, copy=False), @@ -171,6 +188,11 @@ class res_users(osv.osv): 'company_id': fields.many2one('res.company', 'Company', required=True, help='The company this user is currently working for.', context={'user_preference': True}), 'company_ids':fields.many2many('res.company','res_company_users_rel','user_id','cid','Companies'), + 'share': fields.function(_is_share, string='Share User', type='boolean', + store={ + 'res.users': (lambda self, cr, uid, ids, c={}: ids, None, 50), + 'res.groups': (_get_users_from_group, None, 50), + }, help="External user with limited access, created only for the purpose of sharing data."), } # overridden inherited fields to bypass access rights, in case you have @@ -759,7 +781,10 @@ class groups_view(osv.osv): return True def get_application_groups(self, cr, uid, domain=None, context=None): - return self.search(cr, uid, domain or []) + if domain is None: + domain = [] + domain.append(('share', '=', False)) + return self.search(cr, uid, domain, context=context) def get_groups_by_application(self, cr, uid, context=None): """ return all groups classified by application (module category), as a list of pairs: diff --git a/openerp/addons/base/res/res_users_view.xml b/openerp/addons/base/res/res_users_view.xml index 71ea27df5e4..c5fb955a8ac 100644 --- a/openerp/addons/base/res/res_users_view.xml +++ b/openerp/addons/base/res/res_users_view.xml @@ -43,6 +43,8 @@ + + @@ -55,10 +57,11 @@ + - +