19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:31:00 +01:00
parent a1137a1456
commit e1d89e11e3
2789 changed files with 1093187 additions and 605897 deletions

View file

@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import test_employee
from . import test_employee_deletion
from . import test_employee_ui

View file

@ -0,0 +1,121 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.tests import tagged
from odoo.addons.hr.tests.common import TestHrCommon
@tagged('-at_install', 'post_install')
class TestEmployee(TestHrCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.employee_georges, cls.employee_paul, cls.employee_pierre = cls.env['hr.employee'].with_user(cls.res_users_hr_officer).create([
{'name': 'Georges'},
{'name': 'Paul'},
{'name': 'Pierre'},
])
def test_is_subordinate(self):
self.res_users_hr_officer.employee_id = self.employee_georges
self.employee_paul.parent_id = self.employee_georges
employees = self.employee_paul + self.employee_pierre
self.assertTrue(
self.employee_paul.is_subordinate,
'Paul should be a subordinate of the current user since the current is his manager.')
self.assertFalse(
self.employee_pierre.is_subordinate,
'Pierre should not be a subordinate of the current user since Pierre has no manager.')
def _filtered_is_subordinate(flag):
dom = employees._search_is_subordinate('in', [True])
if not flag:
dom = ['!', *dom]
return employees.filtered_domain(dom)
self.assertEqual(_filtered_is_subordinate(True), self.employee_paul)
self.assertEqual(_filtered_is_subordinate(False), self.employee_pierre)
self.employee_pierre.parent_id = self.employee_paul
self.assertTrue(
self.employee_paul.is_subordinate,
'Paul should be a subordinate of the current user since the current is his manager.')
self.assertTrue(
self.employee_pierre.is_subordinate,
"Pierre should now be a subordinate of the current user since Paul is his manager and the current user is the Paul's manager.")
self.assertEqual(_filtered_is_subordinate(True), employees)
self.assertFalse(_filtered_is_subordinate(False))
self.employee_paul.parent_id = False
employees._compute_is_subordinate()
self.assertFalse(
self.employee_paul.is_subordinate,
'Paul should no longer be a subordinate of the current user since Paul has no manager.')
self.assertFalse(
self.employee_pierre.is_subordinate,
"Pierre should not be a subordinate of the current user since Paul is his manager and the current user is not the Paul's manager.")
self.assertFalse(_filtered_is_subordinate(True))
self.assertEqual(_filtered_is_subordinate(False), employees)
def test_hierarchy_read(self):
HrEmployee = self.env['hr.employee']
employees = self.employee_georges + self.employee_paul + self.employee_pierre
specification = {'id': {}}
def get_expected_dict(employee):
return {
'id': employee.id,
'parent_id':
employee.parent_id.id
and {'id': employee.parent_id.id, 'display_name': employee.parent_id.display_name},
}
result = HrEmployee.hierarchy_read([('id', 'in', employees.ids)], specification, 'parent_id')
for emp in employees:
self.assertIn(get_expected_dict(emp), result)
self.employee_georges.parent_id = self.employee_paul
self.employee_pierre.parent_id = self.employee_paul
result = HrEmployee.hierarchy_read([('id', 'in', employees.ids)], specification, 'parent_id')
self.assertEqual(len(result), 3)
for emp in employees:
emp_dict = get_expected_dict(emp)
if not emp.parent_id:
emp_dict['__child_ids__'] = [self.employee_georges.id, self.employee_pierre.id]
self.assertIn(emp_dict, result)
employee_count = HrEmployee.search_count([('id', 'not in', employees.ids), ('parent_id', '=', False)])
result = HrEmployee.hierarchy_read([('parent_id', '=', False)], specification, 'parent_id')
self.assertEqual(len(result), 1 + employee_count)
for employee_dict in result:
self.assertFalse(employee_dict['parent_id'], "Each employee in the result should not have any parent set.")
expected_emp_dict = get_expected_dict(self.employee_paul)
self.assertIn(
{**expected_emp_dict, '__child_ids__': [self.employee_georges.id, self.employee_pierre.id]},
result
)
result = HrEmployee.hierarchy_read([('id', '=', self.employee_paul.id)], specification, 'parent_id')
self.assertEqual(len(result), 3)
for emp in employees:
self.assertIn(get_expected_dict(emp), result)
result = HrEmployee.hierarchy_read([('id', '=', self.employee_georges.id)], specification, 'parent_id')
self.assertEqual(len(result), 3)
for emp in employees:
self.assertIn(get_expected_dict(emp), result)
self.employee_pierre.parent_id = self.employee_georges
result = HrEmployee.hierarchy_read([('id', '=', self.employee_georges.id)], specification, 'parent_id')
self.assertEqual(len(result), 3)
for emp in employees:
self.assertIn(get_expected_dict(emp), result)
result = HrEmployee.hierarchy_read([('id', '=', self.employee_pierre.id)], specification, 'parent_id')
self.assertEqual(len(result), 2)
self.assertIn(get_expected_dict(self.employee_pierre), result)
self.assertIn(get_expected_dict(self.employee_georges), result)

View file

@ -0,0 +1,57 @@
from odoo.tests import HttpCase, tagged
from odoo.addons.hr.tests.common import TestHrCommon
@tagged('-at_install', 'post_install')
class TestEmployeeUi(TestHrCommon, HttpCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.employee_georges, cls.employee_paul, cls.employee_pierre = cls.env['hr.employee'].with_user(cls.res_users_hr_officer).create([
{'name': 'Georges'},
{'name': 'Paul'},
{'name': 'Pierre'},
])
def test_indirect_subordinates(self):
self.res_users_hr_officer.employee_id = self.employee_georges
self.employee_paul.parent_id = self.employee_georges
self.employee_pierre.parent_id = self.employee_paul
self.start_tour(f"/odoo/employees/{self.employee_georges.id}", 'indirect_subordinates_tour', login="admin")
indirect_subordinates = len(self.employee_georges.subordinate_ids - self.employee_georges.child_ids)
self.assertEqual(indirect_subordinates, 1,
"Georges should have 1 indirect subordinates: Pierre."
)
def test_employee_view_access_multicompany(self):
"""checks that an employee still has access to the organization chart even if the manager was created with
another company, to which that employee doesn't have access."""
company_0, company_1 = self.env['res.company'].create([{
'name': "Company 0",
},
{
'name': "Company 1",
}])
self.env = self.env(context=dict(self.env.context, allowed_company_ids=[company_0.id, company_1.id]))
employee_a = self.env['hr.employee'].with_company(company_0).create({
'name': 'Employee A',
})
employee_b = self.env['hr.employee'].with_company(company_1).create({
'name': 'Employee B',
'parent_id': employee_a.id,
})
self.env['hr.employee'].with_company(company_1).create({
'name': 'Employee C',
'parent_id': employee_b.id,
})
self.env = self.env(context=dict(self.env.context, allowed_company_ids=[company_1.id]))
self.restricted_user = self.env['res.users'].with_company(company_1).create({
'name': 'Restricted User (Test)',
'login': 'restricted_user',
'password': 'restricted_user',
'group_ids': [(6, 0, self.res_users_hr_manager.group_ids.ids)],
})
self.start_tour("/odoo/employees", 'employee_view_access_multicompany', login="restricted_user")