hr_timesheet/models/hr_employee.py

71 lines
2.7 KiB
Python
Raw Permalink Normal View History

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from ast import literal_eval
from odoo import api, models, fields, _
from odoo.exceptions import UserError
class HrEmployee(models.Model):
_inherit = 'hr.employee'
has_timesheet = fields.Boolean(compute='_compute_has_timesheet')
def _compute_has_timesheet(self):
self.env.cr.execute("""
SELECT id, EXISTS(SELECT 1 FROM account_analytic_line WHERE project_id IS NOT NULL AND employee_id = e.id limit 1)
FROM hr_employee e
WHERE id in %s
""", (tuple(self.ids), ))
result = {eid[0]: eid[1] for eid in self.env.cr.fetchall()}
for employee in self:
employee.has_timesheet = result.get(employee.id, False)
@api.depends('company_id', 'user_id')
@api.depends_context('allowed_company_ids')
def _compute_display_name(self):
super()._compute_display_name()
allowed_company_ids = self.env.context.get('allowed_company_ids', [])
if len(allowed_company_ids) <= 1:
return
employees_count_per_user = {
user.id: count
for user, count in self.env['hr.employee'].sudo()._read_group(
[('user_id', 'in', self.user_id.ids), ('company_id', 'in', allowed_company_ids)],
['user_id'],
['__count'],
)
}
for employee in self:
if employees_count_per_user.get(employee.user_id.id, 0) > 1:
employee.display_name = f'{employee.display_name} - {employee.company_id.name}'
def action_unlink_wizard(self):
wizard = self.env['hr.employee.delete.wizard'].create({
'employee_ids': self.ids,
})
if not self.user_has_groups('hr_timesheet.group_hr_timesheet_approver') and wizard.has_timesheet and not wizard.has_active_employee:
raise UserError(_('You cannot delete employees who have timesheets.'))
return {
'name': _('Confirmation'),
'view_mode': 'form',
'res_model': 'hr.employee.delete.wizard',
'views': [(self.env.ref('hr_timesheet.hr_employee_delete_wizard_form').id, 'form')],
'type': 'ir.actions.act_window',
'res_id': wizard.id,
'target': 'new',
'context': self.env.context,
}
def action_timesheet_from_employee(self):
action = self.env["ir.actions.act_window"]._for_xml_id("hr_timesheet.timesheet_action_from_employee")
context = literal_eval(action['context'].replace('active_id', str(self.id)))
context['create'] = context.get('create', True) and self.active
context['grid_range'] = "week"
action['context'] = context
return action