82 lines
4.0 KiB
Python
82 lines
4.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import api, fields, models, _
|
|
from pypinyin import pinyin,lazy_pinyin
|
|
from odoo.osv import expression
|
|
|
|
|
|
class YuthonUserRole(models.Model):
|
|
_name = 'soong.user.role'
|
|
_order = 'number asc'
|
|
|
|
name = fields.Char(string="角色名称")
|
|
number = fields.Char(string="序号", store=True)
|
|
user_type = fields.Selection([("system_global_user", "系统全局角色"),
|
|
("departmental_role", "部门私有角色"),
|
|
("lv_role", "部门层级角色")], string="角色类型")
|
|
department_id = fields.Many2one('hr.department', string="所属机构部门")
|
|
create_time = fields.Date(string="创建时间", default=fields.Datetime.today())
|
|
end_time = fields.Date(string="结束时间")
|
|
parent_id = fields.Many2one('soong.user.role', string='上级角色', index=True)
|
|
personnel_ids = fields.Many2many('hr.employee', string='在岗人员', store=True)
|
|
number_people = fields.Integer(string="在岗人数", compute='_compute_employee_ids', store=True)
|
|
personnel = fields.Text(string="在岗人员", store=True)
|
|
employee_ids = fields.One2many('hr.employee', 'user_role_id')
|
|
child_ids = fields.One2many('soong.user.role', 'parent_id', string='下级角色', index=True)
|
|
company_id = fields.Many2one('res.company', string="所属公司", index=True, default=lambda self: self.env.company)
|
|
pinyin_name = fields.Char(string="拼音名称", compute='_compute_pinyin', index=True, store=True)
|
|
|
|
def write(self, vals):
|
|
res = super(YuthonUserRole, self).write(vals)
|
|
if 'personnel_ids' in vals:
|
|
for record in self:
|
|
for personnel_id in record.personnel_ids:
|
|
personnel_id.write({'user_role_id': record.id})
|
|
return res
|
|
|
|
@api.depends('department_id', 'name')
|
|
def _compute_display_name(self):
|
|
for record in self:
|
|
if record.department_id and record.name:
|
|
record.display_name = record.department_id.name + ' - ' + record.name
|
|
|
|
@api.depends('name')
|
|
def _compute_pinyin(self):
|
|
for employee in self:
|
|
employee.pinyin_name = ''.join(lazy_pinyin(employee.name))
|
|
|
|
@api.model
|
|
def _name_search(self, name, domain=None, operator='ilike', limit=None, order=None):
|
|
domain = domain or []
|
|
if name:
|
|
input_pinyin = ''.join(lazy_pinyin(name))
|
|
search_domain = ['|', ('pinyin_name', operator, input_pinyin), ('name', operator, name)]
|
|
domain = expression.AND([search_domain, domain])
|
|
return self._search(domain, limit=limit, order=order)
|
|
|
|
def _compute_employee_ids(self):
|
|
for rec in self:
|
|
employee_ids = rec.env['hr.employee'].search(['|', ('user_role_id', '=', rec.id), ('user_role_ids', 'in', [rec.id])])
|
|
employee_list = [rec.id for rec in employee_ids]
|
|
rec.personnel_ids = employee_list
|
|
rec.number_people = len(employee_list)
|
|
|
|
|
|
def f5_new(self):
|
|
job_ids = self.env["soong.user.role"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
|
for job in job_ids:
|
|
department_id = self.env['hr.department'].search([('name', '=', job.department_id.name)])
|
|
if department_id:
|
|
job.sudo().write({'department_id': department_id.id if len(department_id) == 1 else department_id[0].id})
|
|
|
|
def sync_new(self):
|
|
job_ids = self.env["soong.user.role"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
|
for job in job_ids:
|
|
employee_ids = self.env['hr.employee'].search([('id', 'in', job.personnel_ids.ids)])
|
|
for employee_id in employee_ids:
|
|
if employee_id.user_role_ids:
|
|
current_role_ids = employee_id.user_role_ids.ids
|
|
missing_role_ids = [child.id for child in job.child_ids if child.id not in current_role_ids]
|
|
if missing_role_ids:
|
|
employee_id.user_role_ids = [(4, role_id) for role_id in missing_role_ids]
|
|
|