From 0b1a3da01fdae92587619fcd16bca4eadc367733 Mon Sep 17 00:00:00 2001 From: David Beguin Date: Tue, 3 Jul 2018 12:28:13 +0000 Subject: [PATCH] [IMP] base : adds direct access to groups, record rules and access rights from user form Adds 3 smart buttons with count to see : - Groups - Access Controls - Record Rules Buttons available in debug mode only Every user that have access to user form has at least admin / Settings or Admin / Access rights. Admin / Settings includes Admin / Access Rights Create and delete are not allowed for those views. Indeed users may think they are modifying current user's access whereas they are modifying the whole group access. To avoid confusion, the user's access rights list is now not editable. Clicking on a row redirects to form view that can be edited. A warning has been added on access rights form to be sure the user is aware of what he is doing. Task ID : 1830142 Closes PR #25587 Co-authored-by: David Beguin Co-authored-by: FMDL --- odoo/addons/base/models/ir_model.py | 1 + odoo/addons/base/models/ir_rule.py | 2 +- odoo/addons/base/models/res_users.py | 54 ++++++++++++++++++++++ odoo/addons/base/views/ir_model_views.xml | 24 +++++++++- odoo/addons/base/views/res_users_views.xml | 9 ++++ 5 files changed, 88 insertions(+), 2 deletions(-) diff --git a/odoo/addons/base/models/ir_model.py b/odoo/addons/base/models/ir_model.py index 76524a10814..afdae0d03d3 100644 --- a/odoo/addons/base/models/ir_model.py +++ b/odoo/addons/base/models/ir_model.py @@ -1118,6 +1118,7 @@ class IrModelRelation(models.Model): class IrModelAccess(models.Model): _name = 'ir.model.access' _description = 'Model Access' + _order = 'model_id,group_id,name,id' name = fields.Char(required=True, index=True) active = fields.Boolean(default=True, help='If you uncheck the active field, it will disable the ACL without deleting it (if you delete a native ACL, it will be re-created when you reload the module).') diff --git a/odoo/addons/base/models/ir_rule.py b/odoo/addons/base/models/ir_rule.py index 90869ef45ac..a011272d855 100644 --- a/odoo/addons/base/models/ir_rule.py +++ b/odoo/addons/base/models/ir_rule.py @@ -13,7 +13,7 @@ from odoo.tools.safe_eval import safe_eval class IrRule(models.Model): _name = 'ir.rule' _description = 'Record Rule' - _order = 'model_id DESC' + _order = 'model_id DESC,id' _MODES = ['read', 'write', 'create', 'unlink'] name = fields.Char(index=True) diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py index d7e6ada0efb..0c09d89ca9c 100644 --- a/odoo/addons/base/models/res_users.py +++ b/odoo/addons/base/models/res_users.py @@ -251,6 +251,13 @@ class Users(models.Model): name = fields.Char(related='partner_id.name', inherited=True, readonly=False) email = fields.Char(related='partner_id.email', inherited=True, readonly=False) + accesses_count = fields.Integer('# Access Rights', help='Number of access rights that apply to the current user', + compute='_compute_accesses_count') + rules_count = fields.Integer('# Record Rules', help='Number of record rules that apply to the current user', + compute='_compute_accesses_count') + groups_count = fields.Integer('# Groups', help='Number of groups that apply to the current user', + compute='_compute_accesses_count') + _sql_constraints = [ ('login_key', 'UNIQUE (login)', 'You can not have two users with the same login !') ] @@ -350,6 +357,14 @@ class Users(models.Model): for user in self: user.tz_offset = datetime.datetime.now(pytz.timezone(user.tz or 'GMT')).strftime('%z') + @api.depends('groups_id') + def _compute_accesses_count(self): + for user in self: + groups = user.groups_id + user.accesses_count = len(groups.mapped('model_access')) + user.rules_count = len(groups.mapped('rule_groups')) + user.groups_count = len(groups) + @api.onchange('login') def on_change_login(self): if self.login and tools.single_email_re.match(self.login): @@ -697,6 +712,45 @@ class Users(models.Model): # for a few places explicitly clearing the has_group cache has_group.clear_cache = _has_group.clear_cache + def action_show_groups(self): + self.ensure_one() + return { + 'name': _('Groups'), + 'view_type': 'form', + 'view_mode': 'tree,form', + 'res_model': 'res.groups', + 'type': 'ir.actions.act_window', + 'context': {'create': False, 'delete': False}, + 'domain': [('id','in', self.groups_id.ids)], + 'target': 'current', + } + + def action_show_accesses(self): + self.ensure_one() + return { + 'name': _('Access Rights'), + 'view_type': 'form', + 'view_mode': 'tree,form', + 'res_model': 'ir.model.access', + 'type': 'ir.actions.act_window', + 'context': {'create': False, 'delete': False}, + 'domain': [('id', 'in', self.mapped('groups_id.model_access').ids)], + 'target': 'current', + } + + def action_show_rules(self): + self.ensure_one() + return { + 'name': _('Record Rules'), + 'view_type': 'form', + 'view_mode': 'tree,form', + 'res_model': 'ir.rule', + 'type': 'ir.actions.act_window', + 'context': {'create': False, 'delete': False}, + 'domain': [('id', 'in', self.mapped('groups_id.rule_groups').ids)], + 'target': 'current', + } + @api.multi def _is_public(self): self.ensure_one() diff --git a/odoo/addons/base/views/ir_model_views.xml b/odoo/addons/base/views/ir_model_views.xml index 60385fb46db..092f87a49bb 100644 --- a/odoo/addons/base/views/ir_model_views.xml +++ b/odoo/addons/base/views/ir_model_views.xml @@ -530,6 +530,25 @@ + ir.model.access.view.tree + ir.model.access + + + + + + + + + + + + + + ir.model.access.view.tree.edition ir.model.access
+ @@ -590,7 +612,7 @@ Access Rights ir.model.access form - + diff --git a/odoo/addons/base/views/res_users_views.xml b/odoo/addons/base/views/res_users_views.xml index 88aca904336..e895d88eff3 100644 --- a/odoo/addons/base/views/res_users_views.xml +++ b/odoo/addons/base/views/res_users_views.xml @@ -163,6 +163,15 @@
+ + +