diff --git a/base_user_role/README.rst b/base_user_role/README.rst index 1ad67ef5..944af875 100644 --- a/base_user_role/README.rst +++ b/base_user_role/README.rst @@ -13,17 +13,11 @@ User roles .. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--backend-lightgray.png?logo=github - :target: https://github.com/OCA/server-backend/tree/12.0/base_user_role - :alt: OCA/server-backend -.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/server-backend-12-0/server-backend-12-0-base_user_role - :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/253/12.0 - :alt: Try me on Runbot +.. |badge3| image:: https://img.shields.io/badge/github-oca%2Fserver--backend-lightgray.png?logo=github + :target: https://github.com/oca/server-backend/tree/12.0/base_user_role + :alt: oca/server-backend -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| This module was written to extend the standard functionality regarding users and groups management. @@ -98,10 +92,10 @@ To use this module, you need to: Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -119,6 +113,8 @@ Contributors * Sébastien Alix * Duc, Dao Dong (https://komit-consulting.com) * Jean-Charles Drubay (https://komit-consulting.com) +* Pierrick Brun +* Kevin Khao Do not contact contributors directly about support or help with technical issues. @@ -133,16 +129,6 @@ Images Maintainers ~~~~~~~~~~~ -This module is maintained by the OCA. - -.. image:: https://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: https://odoo-community.org - -OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use. - .. |maintainer-ABF OSIELL| image:: https://github.com/ABF OSIELL.png?size=40px :target: https://github.com/ABF OSIELL :alt: ABF OSIELL @@ -150,10 +136,10 @@ promote its widespread use. :target: https://github.com/jcdrubay :alt: jcdrubay -Current `maintainers `__: +Current maintainers: |maintainer-ABF OSIELL| |maintainer-jcdrubay| -This module is part of the `OCA/server-backend `_ project on GitHub. +This module is part of the `oca/server-backend `_ project on GitHub. -You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. +You are welcome to contribute. diff --git a/base_user_role/__manifest__.py b/base_user_role/__manifest__.py index e0cb210e..a1526dbc 100644 --- a/base_user_role/__manifest__.py +++ b/base_user_role/__manifest__.py @@ -2,22 +2,20 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'User roles', - 'version': '12.0.1.1.0', - 'category': 'Tools', - 'author': 'ABF OSIELL, Odoo Community Association (OCA)', - 'license': 'AGPL-3', - 'maintainers': ['ABF OSIELL', 'jcdrubay'], - 'website': 'https://github.com/OCA/server-backend', - 'depends': [ - 'base', + "name": "User roles", + "version": "12.0.1.1.1", + "category": "Tools", + "author": "ABF OSIELL, Odoo Community Association (OCA)", + "license": "AGPL-3", + "maintainers": ["ABF OSIELL", "jcdrubay"], + "website": "https://github.com/OCA/server-backend", + "depends": ["base"], + "data": [ + "security/ir.model.access.csv", + "data/ir_cron.xml", + "data/ir_module_category.xml", + "views/role.xml", + "views/user.xml", ], - 'data': [ - 'security/ir.model.access.csv', - 'data/ir_cron.xml', - 'data/ir_module_category.xml', - 'views/role.xml', - 'views/user.xml', - ], - 'installable': True, + "installable": True, } diff --git a/base_user_role/models/role.py b/base_user_role/models/role.py index 2d99b8e8..9cb6b5de 100644 --- a/base_user_role/models/role.py +++ b/base_user_role/models/role.py @@ -10,34 +10,42 @@ _logger = logging.getLogger(__name__) class ResUsersRole(models.Model): - _name = 'res.users.role' - _inherits = {'res.groups': 'group_id'} + _name = "res.users.role" + _inherits = {"res.groups": "group_id"} _description = "User role" group_id = fields.Many2one( - comodel_name='res.groups', required=True, ondelete='cascade', - readonly=True, string="Associated group") - line_ids = fields.One2many( - comodel_name='res.users.role.line', - inverse_name='role_id', string="Role lines") - user_ids = fields.One2many( - comodel_name='res.users', string="Users list", - compute='_compute_user_ids') - group_category_id = fields.Many2one( - related='group_id.category_id', - default=lambda cls: cls.env.ref( - 'base_user_role.ir_module_category_role').id, - string="Associated category", - help="Associated group's category") - comment = fields.Html( - string="Internal Notes", + comodel_name="res.groups", + required=True, + ondelete="cascade", + readonly=True, + string="Associated group", ) + line_ids = fields.One2many( + comodel_name="res.users.role.line", + inverse_name="role_id", + string="Role lines", + ) + user_ids = fields.One2many( + comodel_name="res.users", + string="Users list", + compute="_compute_user_ids", + ) + group_category_id = fields.Many2one( + related="group_id.category_id", + default=lambda cls: cls.env.ref( + "base_user_role.ir_module_category_role" + ).id, + string="Associated category", + help="Associated group's category", + ) + comment = fields.Html(string="Internal Notes") @api.multi - @api.depends('line_ids.user_id') + @api.depends("line_ids.user_id") def _compute_user_ids(self): for role in self: - role.user_ids = role.line_ids.mapped('user_id') + role.user_ids = role.line_ids.mapped("user_id") @api.model def create(self, vals): @@ -53,7 +61,7 @@ class ResUsersRole(models.Model): @api.multi def unlink(self): - users = self.mapped('user_ids') + users = self.mapped("user_ids") res = super(ResUsersRole, self).unlink() users.set_groups_from_roles(force=True) return res @@ -61,7 +69,7 @@ class ResUsersRole(models.Model): @api.multi def update_users(self): """Update all the users concerned by the roles identified by `ids`.""" - users = self.mapped('user_ids') + users = self.mapped("user_ids") users.set_groups_from_roles() return True @@ -72,20 +80,22 @@ class ResUsersRole(models.Model): class ResUsersRoleLine(models.Model): - _name = 'res.users.role.line' - _description = 'Users associated to a role' + _name = "res.users.role.line" + _description = "Users associated to a role" role_id = fields.Many2one( - comodel_name='res.users.role', string="Role", - ondelete='cascade') - user_id = fields.Many2one( - comodel_name='res.users', string="User") + comodel_name="res.users.role", string="Role", ondelete="cascade" + ) + user_id = fields.Many2one(comodel_name="res.users", string="User") date_from = fields.Date("From") date_to = fields.Date("To") - is_enabled = fields.Boolean("Enabled", compute='_compute_is_enabled') + is_enabled = fields.Boolean("Enabled", compute="_compute_is_enabled") + company_id = fields.Many2one( + "res.company", "Company", default=lambda self: self.env.user.company_id + ) @api.multi - @api.depends('date_from', 'date_to') + @api.depends("date_from", "date_to") def _compute_is_enabled(self): today = datetime.date.today() for role_line in self: @@ -101,7 +111,7 @@ class ResUsersRoleLine(models.Model): @api.multi def unlink(self): - users = self.mapped('user_id') + users = self.mapped("user_id") res = super(ResUsersRoleLine, self).unlink() users.set_groups_from_roles(force=True) return res diff --git a/base_user_role/models/user.py b/base_user_role/models/user.py index 1eda54c3..f90e4b57 100644 --- a/base_user_role/models/user.py +++ b/base_user_role/models/user.py @@ -4,38 +4,43 @@ from odoo import api, fields, models class ResUsers(models.Model): - _inherit = 'res.users' + _inherit = "res.users" role_line_ids = fields.One2many( - comodel_name='res.users.role.line', - inverse_name='user_id', + comodel_name="res.users.role.line", + inverse_name="user_id", string="Role lines", - default=lambda self: self._default_role_lines() + default=lambda self: self._default_role_lines(), ) role_ids = fields.One2many( - comodel_name='res.users.role', string="Roles", - compute='_compute_role_ids') + comodel_name="res.users.role", + string="Roles", + compute="_compute_role_ids", + ) @api.model def _default_role_lines(self): default_user = self.env.ref( - 'base.default_user', raise_if_not_found=False) + "base.default_user", raise_if_not_found=False + ) default_values = [] if default_user: for role_line in default_user.role_line_ids: - default_values.append({ - 'role_id': role_line.role_id.id, - 'date_from': role_line.date_from, - 'date_to': role_line.date_to, - 'is_enabled': role_line.is_enabled, - }) + default_values.append( + { + "role_id": role_line.role_id.id, + "date_from": role_line.date_from, + "date_to": role_line.date_to, + "is_enabled": role_line.is_enabled, + } + ) return default_values @api.multi - @api.depends('role_line_ids.role_id') + @api.depends("role_line_ids.role_id") def _compute_role_ids(self): for user in self: - user.role_ids = user.role_line_ids.mapped('role_id') + user.role_ids = user.role_line_ids.mapped("role_id") @api.model def create(self, vals): @@ -49,6 +54,14 @@ class ResUsers(models.Model): self.sudo().set_groups_from_roles() return res + def _get_applicable_roles(self): + return self.role_line_ids.filtered( + lambda rec: rec.is_enabled + and ( + not rec.company_id or rec.company_id == rec.user_id.company_id + ) + ) + @api.multi def set_groups_from_roles(self, force=False): """Set (replace) the groups following the roles defined on users. @@ -58,21 +71,23 @@ class ResUsers(models.Model): role_groups = {} # We obtain all the groups associated to each role first, so that # it is faster to compare later with each user's groups. - for role in self.mapped('role_line_ids.role_id'): - role_groups[role] = list(set( - role.group_id.ids + role.implied_ids.ids + - role.trans_implied_ids.ids)) + for role in self.mapped("role_line_ids.role_id"): + role_groups[role] = list( + set( + role.group_id.ids + + role.implied_ids.ids + + role.trans_implied_ids.ids + ) + ) for user in self: if not user.role_line_ids and not force: continue group_ids = [] - role_lines = user.role_line_ids.filtered( - lambda rec: rec.is_enabled) - for role_line in role_lines: + for role_line in user._get_applicable_roles(): role = role_line.role_id if role: group_ids += role_groups[role] - group_ids = list(set(group_ids)) # Remove duplicates IDs + group_ids = list(set(group_ids)) # Remove duplicates IDs groups_to_add = list(set(group_ids) - set(user.groups_id.ids)) groups_to_remove = list(set(user.groups_id.ids) - set(group_ids)) to_add = [(4, gr) for gr in groups_to_add] @@ -80,7 +95,7 @@ class ResUsers(models.Model): groups = to_remove + to_add if groups: vals = { - 'groups_id': groups, + "groups_id": groups, } super(ResUsers, user).write(vals) return True diff --git a/base_user_role/readme/CONTRIBUTORS.rst b/base_user_role/readme/CONTRIBUTORS.rst index 4510b413..8297f5f3 100644 --- a/base_user_role/readme/CONTRIBUTORS.rst +++ b/base_user_role/readme/CONTRIBUTORS.rst @@ -1,5 +1,7 @@ * Sébastien Alix * Duc, Dao Dong (https://komit-consulting.com) * Jean-Charles Drubay (https://komit-consulting.com) +* Pierrick Brun +* Kevin Khao Do not contact contributors directly about support or help with technical issues. diff --git a/base_user_role/static/description/index.html b/base_user_role/static/description/index.html index f5e7beb5..95b2247b 100644 --- a/base_user_role/static/description/index.html +++ b/base_user_role/static/description/index.html @@ -367,7 +367,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/server-backend Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 oca/server-backend

This module was written to extend the standard functionality regarding users and groups management. It helps creating well-defined user roles and associating them to users.

@@ -445,10 +445,10 @@ section). ]

Bug Tracker

-

Bugs are tracked on GitHub Issues. +

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -465,6 +465,8 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
  • Sébastien Alix <sebastien.alix@osiell.com>
  • Duc, Dao Dong <duc.dd@komit-consulting.com> (https://komit-consulting.com)
  • Jean-Charles Drubay <jc@komit-consulting.com> (https://komit-consulting.com)
  • +
  • Pierrick Brun <pierrick.brun@akretion.com>
  • +
  • Kevin Khao <kevin.khao@akretion.com>
  • Do not contact contributors directly about support or help with technical issues.

    @@ -479,15 +481,10 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

    Maintainers

    -

    This module is maintained by the OCA.

    -Odoo Community Association -

    OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use.

    -

    Current maintainers:

    +

    Current maintainers:

    ABF OSIELL jcdrubay

    -

    This module is part of the OCA/server-backend project on GitHub.

    -

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    +

    This module is part of the oca/server-backend project on GitHub.

    +

    You are welcome to contribute.

    diff --git a/base_user_role/tests/test_user_role.py b/base_user_role/tests/test_user_role.py index e5b05565..e25da499 100644 --- a/base_user_role/tests/test_user_role.py +++ b/base_user_role/tests/test_user_role.py @@ -7,23 +7,24 @@ from odoo.tests.common import TransactionCase class TestUserRole(TransactionCase): - def setUp(self): super(TestUserRole, self).setUp() - self.user_model = self.env['res.users'] - self.role_model = self.env['res.users.role'] + self.user_model = self.env["res.users"] + self.role_model = self.env["res.users.role"] - self.default_user = self.env.ref('base.default_user') + self.default_user = self.env.ref("base.default_user") self.user_id = self.user_model.create( - {'name': "USER TEST (ROLES)", 'login': 'user_test_roles'}) + {"name": "USER TEST (ROLES)", "login": "user_test_roles"} + ) # ROLE_1 - self.group_user_id = self.env.ref('base.group_user') - self.group_no_one_id = self.env.ref('base.group_no_one') + self.group_user_id = self.env.ref("base.group_user") + self.group_no_one_id = self.env.ref("base.group_no_one") vals = { - 'name': "ROLE_1", - 'implied_ids': [ - (6, 0, [self.group_user_id.id, self.group_no_one_id.id])], + "name": "ROLE_1", + "implied_ids": [ + (6, 0, [self.group_user_id.id, self.group_no_one_id.id]) + ], } self.role1_id = self.role_model.create(vals) @@ -31,22 +32,42 @@ class TestUserRole(TransactionCase): # Must have group_user in order to have sufficient groups. Check: # github.com/odoo/odoo/commit/c3717f3018ce0571aa41f70da4262cc946d883b4 self.group_multi_currency_id = self.env.ref( - 'base.group_multi_currency') - self.group_settings_id = self.env.ref('base.group_system') + "base.group_multi_currency" + ) + self.group_settings_id = self.env.ref("base.group_system") vals = { - 'name': "ROLE_2", - 'implied_ids': [ - (6, 0, [self.group_user_id.id, + "name": "ROLE_2", + "implied_ids": [ + ( + 6, + 0, + [ + self.group_user_id.id, self.group_multi_currency_id.id, - self.group_settings_id.id])], + self.group_settings_id.id, + ], + ) + ], } self.role2_id = self.role_model.create(vals) + self.company1 = self.env.ref("base.main_company") + self.company2 = self.env["res.company"].create({"name": "company2"}) + self.user_id.write( + { + "company_ids": [ + (4, self.company1.id, 0), + (4, self.company2.id, 0), + ] + } + ) def test_role_1(self): self.user_id.write( - {'role_line_ids': [(0, 0, {'role_id': self.role1_id.id})]}) - user_group_ids = sorted(set( - [group.id for group in self.user_id.groups_id])) + {"role_line_ids": [(0, 0, {"role_id": self.role1_id.id})]} + ) + user_group_ids = sorted( + set([group.id for group in self.user_id.groups_id]) + ) role_group_ids = self.role1_id.trans_implied_ids.ids role_group_ids.append(self.role1_id.group_id.id) role_group_ids = sorted(set(role_group_ids)) @@ -54,9 +75,11 @@ class TestUserRole(TransactionCase): def test_role_2(self): self.user_id.write( - {'role_line_ids': [(0, 0, {'role_id': self.role2_id.id})]}) - user_group_ids = sorted(set( - [group.id for group in self.user_id.groups_id])) + {"role_line_ids": [(0, 0, {"role_id": self.role2_id.id})]} + ) + user_group_ids = sorted( + set([group.id for group in self.user_id.groups_id]) + ) role_group_ids = self.role2_id.trans_implied_ids.ids role_group_ids.append(self.role2_id.group_id.id) role_group_ids = sorted(set(role_group_ids)) @@ -64,12 +87,16 @@ class TestUserRole(TransactionCase): def test_role_1_2(self): self.user_id.write( - {'role_line_ids': [ - (0, 0, {'role_id': self.role1_id.id}), - (0, 0, {'role_id': self.role2_id.id}), - ]}) - user_group_ids = sorted(set( - [group.id for group in self.user_id.groups_id])) + { + "role_line_ids": [ + (0, 0, {"role_id": self.role1_id.id}), + (0, 0, {"role_id": self.role2_id.id}), + ] + } + ) + user_group_ids = sorted( + set([group.id for group in self.user_id.groups_id]) + ) role1_group_ids = self.role1_id.trans_implied_ids.ids role1_group_ids.append(self.role1_id.group_id.id) role2_group_ids = self.role2_id.trans_implied_ids.ids @@ -83,15 +110,29 @@ class TestUserRole(TransactionCase): yesterday = today - datetime.timedelta(days=1) yesterday_str = fields.Date.to_string(yesterday) self.user_id.write( - {'role_line_ids': [ - # Role 1 should be enabled - (0, 0, {'role_id': self.role1_id.id, 'date_from': today_str}), - # Role 2 should be disabled - (0, 0, - {'role_id': self.role2_id.id, 'date_to': yesterday_str}), - ]}) - user_group_ids = sorted(set( - [group.id for group in self.user_id.groups_id])) + { + "role_line_ids": [ + # Role 1 should be enabled + ( + 0, + 0, + {"role_id": self.role1_id.id, "date_from": today_str}, + ), + # Role 2 should be disabled + ( + 0, + 0, + { + "role_id": self.role2_id.id, + "date_to": yesterday_str, + }, + ), + ] + } + ) + user_group_ids = sorted( + set([group.id for group in self.user_id.groups_id]) + ) role1_group_ids = self.role1_id.trans_implied_ids.ids role1_group_ids.append(self.role1_id.group_id.id) role_group_ids = sorted(set(role1_group_ids)) @@ -103,10 +144,13 @@ class TestUserRole(TransactionCase): role2_groups = self.role2_id.implied_ids | self.role2_id.group_id # Configure the user with role1 and role2 self.user_id.write( - {'role_line_ids': [ - (0, 0, {'role_id': self.role1_id.id}), - (0, 0, {'role_id': self.role2_id.id}), - ]}) + { + "role_line_ids": [ + (0, 0, {"role_id": self.role1_id.id}), + (0, 0, {"role_id": self.role2_id.id}), + ] + } + ) # Check user has groups from role1 and role2 self.assertLessEqual(role1_groups, self.user_id.groups_id) self.assertLessEqual(role2_groups, self.user_id.groups_id) @@ -127,40 +171,109 @@ class TestUserRole(TransactionCase): role2_groups = self.role2_id.implied_ids | self.role2_id.group_id # Configure the user with role1 and role2 self.user_id.write( - {'role_line_ids': [ - (0, 0, {'role_id': self.role1_id.id}), - (0, 0, {'role_id': self.role2_id.id}), - ]}) + { + "role_line_ids": [ + (0, 0, {"role_id": self.role1_id.id}), + (0, 0, {"role_id": self.role2_id.id}), + ] + } + ) # Check user has groups from role1 and role2 self.assertLessEqual(role1_groups, self.user_id.groups_id) self.assertLessEqual(role2_groups, self.user_id.groups_id) # Remove role2 from the user self.user_id.role_line_ids.filtered( - lambda l: l.role_id.id == self.role2_id.id).unlink() + lambda l: l.role_id.id == self.role2_id.id + ).unlink() # Check user has groups from only role1 self.assertLessEqual(role1_groups, self.user_id.groups_id) self.assertFalse(role2_groups <= self.user_id.groups_id) # Remove role1 from the user self.user_id.role_line_ids.filtered( - lambda l: l.role_id.id == self.role1_id.id).unlink() + lambda l: l.role_id.id == self.role1_id.id + ).unlink() # Check user has no groups from role1 and role2 self.assertFalse(role1_groups <= self.user_id.groups_id) self.assertFalse(role2_groups <= self.user_id.groups_id) def test_default_user_roles(self): - self.default_user.write({ - 'role_line_ids': [ - (0, 0, { - 'role_id': self.role1_id.id, - }), - (0, 0, { - 'role_id': self.role2_id.id, - }) - ] - }) - user = self.user_model.create({ - 'name': "USER TEST (DEFAULT ROLES)", - 'login': 'user_test_default_roles' - }) + self.default_user.write( + { + "role_line_ids": [ + (0, 0, {"role_id": self.role1_id.id}), + (0, 0, {"role_id": self.role2_id.id}), + ] + } + ) + user = self.user_model.create( + { + "name": "USER TEST (DEFAULT ROLES)", + "login": "user_test_default_roles", + } + ) roles = self.role_model.browse([self.role1_id.id, self.role2_id.id]) self.assertEqual(user.role_ids, roles) + + def test_user_role_different_company(self): + self.user_id.write({"company_id": self.company1.id}) + self.user_id.write( + { + "role_line_ids": [ + ( + 0, + 0, + { + "role_id": self.role2_id.id, + "company_id": self.company2.id, + }, + ) + ] + } + ) + # Check that user does not have any groups + self.assertEquals( + self.user_id.groups_id, self.env["res.groups"].browse() + ) + + def test_user_role_same_company(self): + self.user_id.write({"company_id": self.company1.id}) + self.user_id.write( + { + "role_line_ids": [ + ( + 0, + 0, + { + "role_id": self.role1_id.id, + "company_id": self.company1.id, + }, + ) + ] + } + ) + user_group_ids = sorted( + set([group.id for group in self.user_id.groups_id]) + ) + role_group_ids = self.role1_id.trans_implied_ids.ids + role_group_ids.append(self.role1_id.group_id.id) + role_group_ids = sorted(set(role_group_ids)) + # Check that user have groups implied by role 1 + self.assertEqual(user_group_ids, role_group_ids) + + def test_user_role_no_company(self): + self.user_id.write({"company_id": self.company1.id}) + self.user_id.write( + { + "role_line_ids": [ + (0, 0, {"role_id": self.role2_id.id, "company_id": False}) + ] + } + ) + user_group_ids = sorted( + set([group.id for group in self.user_id.groups_id]) + ) + role_group_ids = self.role2_id.trans_implied_ids.ids + role_group_ids.append(self.role2_id.group_id.id) + role_group_ids = sorted(set(role_group_ids)) + # Check that user have groups implied by role 2 + self.assertEqual(user_group_ids, role_group_ids) diff --git a/base_user_role/views/role.xml b/base_user_role/views/role.xml index edcee9d8..35a29465 100644 --- a/base_user_role/views/role.xml +++ b/base_user_role/views/role.xml @@ -24,6 +24,7 @@ + diff --git a/base_user_role/views/user.xml b/base_user_role/views/user.xml index 09ba5e66..ae5a179c 100644 --- a/base_user_role/views/user.xml +++ b/base_user_role/views/user.xml @@ -16,6 +16,7 @@ +