diff --git a/base_user_role/__manifest__.py b/base_user_role/__manifest__.py
index 184effe36..9f83615f3 100644
--- a/base_user_role/__manifest__.py
+++ b/base_user_role/__manifest__.py
@@ -16,6 +16,7 @@
"security/ir.model.access.csv",
"data/ir_cron.xml",
"data/ir_module_category.xml",
+ "wizards/role_add_users_wizard_views.xml",
"views/role.xml",
"views/user.xml",
"views/group.xml",
diff --git a/base_user_role/security/ir.model.access.csv b/base_user_role/security/ir.model.access.csv
index e58fa6f95..74d2512af 100644
--- a/base_user_role/security/ir.model.access.csv
+++ b/base_user_role/security/ir.model.access.csv
@@ -3,3 +3,4 @@ access_res_users_role,access_res_users_role,model_res_users_role,"base.group_erp
access_res_users_role_line,access_res_users_role_line,model_res_users_role_line,"base.group_erp_manager",1,1,1,1
access_wizard_create_role_from_user,access_wizard_create_role_from_user,model_wizard_create_role_from_user,"base.group_erp_manager",1,1,1,1
access_wizard_groups_into_role,access_wizard_groups_into_role,model_wizard_groups_into_role,"base.group_erp_manager",1,1,1,1
+access_role_add_users_wizard,access_role_add_users_wizard,model_role_add_users_wizard,base.group_erp_manager,1,1,1,1
diff --git a/base_user_role/tests/__init__.py b/base_user_role/tests/__init__.py
index f8c808c78..af6857eef 100644
--- a/base_user_role/tests/__init__.py
+++ b/base_user_role/tests/__init__.py
@@ -1 +1,2 @@
from . import test_user_role
+from . import test_role_add_users_wizard
diff --git a/base_user_role/tests/test_role_add_users_wizard.py b/base_user_role/tests/test_role_add_users_wizard.py
new file mode 100644
index 000000000..3ae637bce
--- /dev/null
+++ b/base_user_role/tests/test_role_add_users_wizard.py
@@ -0,0 +1,118 @@
+from odoo import Command
+from odoo.tests.common import TransactionCase
+
+
+class TestRoleAddUsersWizard(TransactionCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.role = cls.env["res.users.role"].create(
+ {
+ "name": "Test Role",
+ }
+ )
+ cls.user1 = cls.env["res.users"].create(
+ {
+ "name": "Test User 1",
+ "login": "testuser1",
+ "email": "testuser1@example.com",
+ }
+ )
+ cls.user2 = cls.env["res.users"].create(
+ {
+ "name": "Test User 2",
+ "login": "testuser2",
+ "email": "testuser2@example.com",
+ }
+ )
+ cls.user3 = cls.env["res.users"].create(
+ {
+ "name": "Test User 3",
+ "login": "testuser3",
+ "email": "testuser3@example.com",
+ }
+ )
+
+ def test_add_new_users_to_role(self):
+ """Test adding new users to a role without existing users"""
+ wizard = self.env["role.add.users.wizard"].create(
+ {
+ "role_id": self.role.id,
+ "user_ids": [Command.set([self.user1.id, self.user2.id])],
+ "date_from": "2024-01-01",
+ "date_to": "2024-12-31",
+ }
+ )
+
+ result = wizard.action_add_users()
+ self.assertEqual(result["type"], "ir.actions.act_window_close")
+ self.assertEqual(len(self.role.line_ids), 2)
+ self.assertIn(self.user1, self.role.line_ids.mapped("user_id"))
+ self.assertIn(self.user2, self.role.line_ids.mapped("user_id"))
+ for line in self.role.line_ids:
+ self.assertEqual(str(line.date_from), "2024-01-01")
+ self.assertEqual(str(line.date_to), "2024-12-31")
+
+ def test_add_users_with_existing_users(self):
+ """Test adding users when some already exist in the role"""
+ self.env["res.users.role.line"].create(
+ {
+ "role_id": self.role.id,
+ "user_id": self.user1.id,
+ }
+ )
+
+ wizard = self.env["role.add.users.wizard"].create(
+ {
+ "role_id": self.role.id,
+ "user_ids": [Command.set([self.user1.id, self.user2.id])],
+ }
+ )
+
+ wizard.action_add_users()
+ self.assertEqual(len(self.role.line_ids), 2)
+ users_in_role = self.role.line_ids.mapped("user_id")
+ self.assertIn(self.user1, users_in_role)
+ self.assertIn(self.user2, users_in_role)
+
+ user1_lines = self.role.line_ids.filtered(
+ lambda line: line.user_id == self.user1
+ )
+ self.assertEqual(len(user1_lines), 1)
+
+ def test_add_users_without_dates(self):
+ """Test adding users without specifying dates"""
+ wizard = self.env["role.add.users.wizard"].create(
+ {
+ "role_id": self.role.id,
+ "user_ids": [Command.set([self.user3.id])],
+ }
+ )
+
+ wizard.action_add_users()
+ self.assertEqual(len(self.role.line_ids), 1)
+ line = self.role.line_ids[0]
+ self.assertEqual(line.user_id, self.user3)
+ self.assertFalse(line.date_from)
+ self.assertFalse(line.date_to)
+
+ def test_add_multiple_new_users(self):
+ """Test adding multiple new users at once"""
+ wizard = self.env["role.add.users.wizard"].create(
+ {
+ "role_id": self.role.id,
+ "user_ids": [
+ Command.set([self.user1.id, self.user2.id, self.user3.id])
+ ],
+ "date_from": "2024-06-01",
+ }
+ )
+
+ wizard.action_add_users()
+ self.assertEqual(len(self.role.line_ids), 3)
+ users_in_role = self.role.line_ids.mapped("user_id")
+ self.assertEqual(
+ set(users_in_role.ids), {self.user1.id, self.user2.id, self.user3.id}
+ )
+ for line in self.role.line_ids:
+ self.assertEqual(str(line.date_from), "2024-06-01")
diff --git a/base_user_role/views/role.xml b/base_user_role/views/role.xml
index a489dfa0c..acd2aae4b 100644
--- a/base_user_role/views/role.xml
+++ b/base_user_role/views/role.xml
@@ -44,6 +44,13 @@
+
+
+
+ Add Multiple Users
+ role.add.users.wizard
+ form
+ new
+ {'default_role_id': active_id}
+
+
+
+ role.add.users.wizard.form
+ role.add.users.wizard
+
+
+
+
+