flectra/addons/hr_org_chart/controllers/hr_org_chart.py
2018-01-16 02:34:37 -08:00

55 lines
1.9 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
from flectra import http
from flectra.exceptions import AccessError
from flectra.http import request
class HrOrgChartController(http.Controller):
_managers_level = 2 # FP request
def _prepare_employee_data(self, employee):
job = employee.sudo().job_id
return dict(
id=employee.id,
name=employee.name,
link='/mail/view?model=hr.employee&res_id=%s' % employee.id,
job_id=job.id,
job_name=job.name or '',
direct_sub_count=len(employee.child_ids),
indirect_sub_count=employee.child_all_count,
)
@http.route('/hr/get_org_chart', type='json', auth='user')
def get_org_chart(self, employee_id):
if not employee_id: # to check
return {}
employee_id = int(employee_id)
Employee = request.env['hr.employee']
# check and raise
if not Employee.check_access_rights('read', raise_exception=False):
return {}
try:
Employee.browse(employee_id).check_access_rule('read')
except AccessError:
return {}
else:
employee = Employee.browse(employee_id)
# compute employee data for org chart
ancestors, current = request.env['hr.employee'], employee
while current.parent_id:
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