19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:31:56 +01:00
parent a2f74aefd8
commit 4a4d12c333
844 changed files with 212348 additions and 270090 deletions

View file

@ -4,10 +4,11 @@
from odoo import Command
from odoo.addons.project.tests.test_access_rights import TestProjectPortalCommon
from odoo.exceptions import AccessError
from odoo.tests import HttpCase
from odoo.tools import mute_logger
class TestPortalProject(TestProjectPortalCommon):
class TestPortalProject(TestProjectPortalCommon, HttpCase):
@mute_logger('odoo.addons.base.models.ir_model')
def test_portal_project_access_rights(self):
pigs = self.project_pigs
@ -45,11 +46,12 @@ class TestPortalProject(TestProjectPortalCommon):
self.project_pigs.privacy_visibility = 'portal'
self.assertFalse(self.project_pigs.access_token, 'The access token should not yet available since the project has not been shared yet.')
wizard = self.env['project.share.wizard'].create({
'access_mode': 'read',
'res_model': 'project.project',
'res_id': self.project_pigs.id,
'partner_ids': [
Command.link(self.partner_1.id),
'collaborator_ids': [
Command.create({
'partner_id': self.partner_1.id,
}),
]
})
wizard.action_send_mail()
@ -81,3 +83,74 @@ class TestPortalProject(TestProjectPortalCommon):
self.project_pigs.privacy_visibility = 'employees'
self.assertFalse(self.project_pigs.access_token, 'The access token should no longer be set since now the project is only available by internal users.')
self.assertFalse(all(self.project_pigs.tasks.mapped('access_token')), 'The access token should no longer be set in any tasks linked to the project since now the project is only available by internal users.')
def test_search_validates_results(self):
project_manager = self.env['res.users'].search([
('group_ids', 'in', [self.env.ref('project.group_project_manager').id])
],limit=1)
self.authenticate(project_manager.login, project_manager.login)
self.project_1 = self.env['project.project'].create({'name': 'Portal Search Project 1'})
self.project_2 = self.env['project.project'].create({'name': 'Portal Search Project 2'})
self.task_1 = self.env['project.task'].create({
'name': 'Test Task Name Match',
'project_id': self.project_1.id,
'user_ids': project_manager,
})
self.task_2 = self.env['project.task'].create({
'name': 'Another Task For Searching',
'project_id': self.project_2.id,
'user_ids': project_manager,
})
url = '/my/tasks'
response = self.url_open(url)
self.assertIn(self.task_1.name, response.text)
self.assertIn(self.task_2.name, response.text)
url = '/my/tasks?search_in=name&search=Test+Task+Name+Match'
response = self.url_open(url)
self.assertIn(self.task_1.name, response.text)
self.assertNotIn(self.task_2.name, response.text)
url = '/my/tasks?search_in=project_id&search=%s' % (self.project_1.name)
response = self.url_open(url)
self.assertIn(self.task_1.name, response.text)
self.assertNotIn(self.task_2.name, response.text)
def test_task_templates_visibility_portal(self):
"""
Verify that a portal user can see regular tasks but not task templates or their subtasks.
"""
self.authenticate(self.user_portal.login, self.user_portal.login)
portal_project = self.env['project.project'].create({'name': 'Portal Project'})
portal_project.message_subscribe(partner_ids=[self.user_portal.partner_id.id])
task, task_template = self.env['project.task'].create([
{
'name': 'Visible Task',
'project_id': portal_project.id,
},
{
'name': 'Invisible Template Task',
'project_id': portal_project.id,
'is_template': True,
'child_ids': [
Command.create({'name': 'Sub Task of Template Task 1'}),
Command.create({'name': 'Sub Task of Template Task 2'}),
]
}
])
# Check the portal my tasks page
my_tasks_response = self.url_open('/my/tasks')
self.assertIn(task.name, my_tasks_response.text)
self.assertNotIn(task_template.name, my_tasks_response.text)
self.assertNotIn(task_template.child_ids[0].name, my_tasks_response.text)
self.assertNotIn(task_template.child_ids[1].name, my_tasks_response.text)
# Check the tasks page for the specific project
project_tasks_response = self.url_open('/my/projects/%s' % (portal_project.id))
self.assertIn(task.name, project_tasks_response.text)
self.assertNotIn(task_template.name, project_tasks_response.text)
self.assertNotIn(task_template.child_ids[0].name, project_tasks_response.text)
self.assertNotIn(task_template.child_ids[1].name, project_tasks_response.text)