Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions base_user_role/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions base_user_role/security/ir.model.access.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions base_user_role/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from . import test_user_role
from . import test_role_add_users_wizard
118 changes: 118 additions & 0 deletions base_user_role/tests/test_role_add_users_wizard.py
Original file line number Diff line number Diff line change
@@ -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")
7 changes: 7 additions & 0 deletions base_user_role/views/role.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@
<field name="implied_ids" nolabel="1" />
</page>
<page string="Users">
<button
name="%(action_add_multiple_users_wizard)d"
type="action"
string="Add Multiple Users"
icon="fa-users"
class="btn-primary mb-3"
/>
<field name="line_ids" nolabel="1">
<list
editable="bottom"
Expand Down
1 change: 1 addition & 0 deletions base_user_role/wizards/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
from . import create_from_user
from . import role_add_users_wizard
from . import wizard_groups_into_role
35 changes: 35 additions & 0 deletions base_user_role/wizards/role_add_users_wizard.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from odoo import fields, models


class RoleAddUsersWizard(models.TransientModel):
_name = "role.add.users.wizard"
_description = "Wizard to add multiple users to a role"

role_id = fields.Many2one(
comodel_name="res.users.role",
required=True,
ondelete="cascade",
)
user_ids = fields.Many2many(
comodel_name="res.users",
string="Users",
required=True,
)
date_from = fields.Date("From")
date_to = fields.Date("To")

def action_add_users(self):
existing_users = self.role_id.line_ids.user_id
new_users = self.user_ids - existing_users
self.env["res.users.role.line"].create(
[
{
"role_id": self.role_id.id,
"user_id": user.id,
"date_from": self.date_from,
"date_to": self.date_to,
}
for user in new_users
]
)
return {"type": "ir.actions.act_window_close"}
39 changes: 39 additions & 0 deletions base_user_role/wizards/role_add_users_wizard_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="action_add_multiple_users_wizard" model="ir.actions.act_window">
<field name="name">Add Multiple Users</field>
<field name="res_model">role.add.users.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="context">{'default_role_id': active_id}</field>
</record>

<record id="view_res_users_role_add_users_wizard" model="ir.ui.view">
<field name="name">role.add.users.wizard.form</field>
<field name="model">role.add.users.wizard</field>
<field name="arch" type="xml">
<form>
<group>
<field name="role_id" readonly="1" />
<field
name="user_ids"
widget="many2many_tags"
options="{'no_create': True, 'no_create_edit': True}"
domain="[('share','=',False)]"
/>
<field name="date_from" />
<field name="date_to" />
</group>
<footer>
<button
name="action_add_users"
string="Add Users"
type="object"
class="btn-primary"
/>
<button string="Cancel" special="cancel" />
</footer>
</form>
</field>
</record>
</odoo>