1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import http
from odoo.exceptions import AccessError
from odoo.http import request
class HrOrgChartController(http.Controller):
_managers_level = 5 # FP request
def _check_employee(self, employee_id, **kw):
if not employee_id: # to check
return None
employee_id = int(employee_id)
if 'allowed_company_ids' in request.env.context:
cids = request.env.context['allowed_company_ids']
else:
cids = [request.env.company.id]
Employee = request.env['hr.employee.public'].with_context(allowed_company_ids=cids)
# check and raise
if not Employee.check_access_rights('read', raise_exception=False):
return None
try:
Employee.browse(employee_id).check_access_rule('read')
except AccessError:
return None
else:
return Employee.browse(employee_id)
def _prepare_employee_data(self, employee):
job = employee.sudo().job_id
return dict(
id=employee.id,
name=employee.name,
link='/mail/view?model=%s&res_id=%s' % ('hr.employee.public', employee.id,),
job_id=job.id,
job_name=job.name or '',
job_title=employee.job_title or '',
direct_sub_count=len(employee.child_ids),
indirect_sub_count=employee.child_all_count,
)
@http.route('/hr/get_redirect_model', type='json', auth='user')
def get_redirect_model(self):
if request.env['hr.employee'].check_access_rights('read', raise_exception=False):
return 'hr.employee'
return 'hr.employee.public'
@http.route('/hr/get_org_chart', type='json', auth='user')
def get_org_chart(self, employee_id, **kw):
employee = self._check_employee(employee_id, **kw)
if not employee: # to check
return {
'managers': [],
'children': [],
}
# compute employee data for org chart
ancestors, current = request.env['hr.employee.public'].sudo(), employee.sudo()
while current.parent_id and len(ancestors) < self._managers_level+1:
ancestors += current.parent_id
current = current.parent_id
values = dict(
self=self._prepare_employee_data(employee),
managers=[
self._prepare_employee_data(ancestor)
for idx, ancestor in enumerate(ancestors)
if idx < self._managers_level
],
managers_more=len(ancestors) > self._managers_level,
children=[self._prepare_employee_data(child) for child in employee.child_ids],
)
values['managers'].reverse()
return values
@http.route('/hr/get_subordinates', type='json', auth='user')
def get_subordinates(self, employee_id, subordinates_type=None, **kw):
"""
Get employee subordinates.
Possible values for 'subordinates_type':
- 'indirect'
- 'direct'
"""
employee = self._check_employee(employee_id, **kw)
if not employee: # to check
return {}
if subordinates_type == 'direct':
res = employee.child_ids.ids
elif subordinates_type == 'indirect':
res = (employee.subordinate_ids - employee.child_ids).ids
else:
res = employee.subordinate_ids.ids
return res
|