90 lines
3.8 KiB
Python
90 lines
3.8 KiB
Python
|
|
from odoo.tests import TransactionCase, tagged, Form
|
||
|
|
from odoo import Command
|
||
|
|
|
||
|
|
|
||
|
|
@tagged("-at_install", "post_install")
|
||
|
|
class TestPortalAccess(TransactionCase):
|
||
|
|
@classmethod
|
||
|
|
def setUpClass(cls):
|
||
|
|
super().setUpClass()
|
||
|
|
|
||
|
|
def test_portal_access_attribution_and_revocation(self):
|
||
|
|
"""Test that granting and revoking portal access works correctly."""
|
||
|
|
# Create a partner for our test
|
||
|
|
partner = self.env["res.partner"].create({
|
||
|
|
"name": "John Therapist",
|
||
|
|
"email": "john.therapist@example.com",
|
||
|
|
})
|
||
|
|
|
||
|
|
# Create a team
|
||
|
|
team = self.env["sports.team"].create({
|
||
|
|
"name": "Test Team",
|
||
|
|
})
|
||
|
|
|
||
|
|
# Create team staff record
|
||
|
|
staff = self.env["sports.team.staff"].create({
|
||
|
|
"team_id": team.id,
|
||
|
|
"partner_id": partner.id,
|
||
|
|
"role": "therapist",
|
||
|
|
})
|
||
|
|
|
||
|
|
# Initially staff should not have portal access
|
||
|
|
self.assertFalse(staff.has_portal_access, "New staff should not have portal access")
|
||
|
|
|
||
|
|
# Try to grant portal access - this creates a portal user and sends invitation
|
||
|
|
wizard_action = staff.action_grant_portal_access()
|
||
|
|
self.assertTrue(wizard_action, "Should return wizard action")
|
||
|
|
|
||
|
|
# Check the portal.wizard created, complete the process
|
||
|
|
wizard_id = wizard_action['res_id']
|
||
|
|
portal_wizard = self.env['portal.wizard'].browse(wizard_id)
|
||
|
|
# In Odoo 18.0, portal.wizard API has changed - we need to handle user creation and permissions manually
|
||
|
|
|
||
|
|
# Create a user for the partner if it doesn't exist yet
|
||
|
|
user = self.env['res.users'].search([('partner_id', '=', partner.id)])
|
||
|
|
if not user:
|
||
|
|
# Create new portal user
|
||
|
|
user_values = {
|
||
|
|
'partner_id': partner.id,
|
||
|
|
'login': partner.email,
|
||
|
|
'password': 'test123',
|
||
|
|
'name': partner.name,
|
||
|
|
'active': True,
|
||
|
|
'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])]
|
||
|
|
}
|
||
|
|
user = self.env['res.users'].with_context(no_reset_password=True).create(user_values)
|
||
|
|
else:
|
||
|
|
# Ensure the existing user is active and has portal access
|
||
|
|
user.write({
|
||
|
|
'active': True,
|
||
|
|
'groups_id': [(4, self.env.ref('base.group_portal').id)]
|
||
|
|
})
|
||
|
|
|
||
|
|
# Invalidate cache to ensure computed fields are recalculated
|
||
|
|
self.env.invalidate_all()
|
||
|
|
|
||
|
|
# Refresh the record and check if portal access was granted
|
||
|
|
staff.invalidate_recordset()
|
||
|
|
self.assertTrue(staff.has_portal_access, "Staff should have portal access after granting it")
|
||
|
|
|
||
|
|
# Check that a user was created with the correct group
|
||
|
|
user = self.env['res.users'].search([('partner_id', '=', partner.id)])
|
||
|
|
self.assertTrue(user, "User should be created")
|
||
|
|
self.assertTrue(user.has_group('base.group_portal'), "User should be in portal group")
|
||
|
|
self.assertTrue(user.active, "User should be active")
|
||
|
|
|
||
|
|
# Now revoke portal access
|
||
|
|
staff.action_revoke_portal_access()
|
||
|
|
|
||
|
|
# Refresh and check that access was revoked
|
||
|
|
staff.invalidate_recordset()
|
||
|
|
user.invalidate_recordset()
|
||
|
|
|
||
|
|
# The user should still exist but be inactive and not in portal group
|
||
|
|
self.assertFalse(user.active, "User should be inactive after revoking access")
|
||
|
|
self.assertFalse(user.has_group('base.group_portal'), "User should not be in portal group")
|
||
|
|
|
||
|
|
# Computing portal access should now return false
|
||
|
|
staff.invalidate_recordset(['has_portal_access'])
|
||
|
|
self.assertFalse(staff.has_portal_access, "Staff should not have portal access after revoking it")
|