Files
odoo_source/addons/hr_fleet/models/employee.py
T
Yannick Tivisse e8c48f824e [IMP] hr: Remove address_home_id field
Improve usability of employee form. It is confusing for end users
to create another record to encode the employee address.

Move all the private information on the hr.employee record itself.

Remove the M2O address_home_id.

TaskID: 3101400
2023-07-05 14:21:28 +02:00

82 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class Employee(models.Model):
_inherit = 'hr.employee'
employee_cars_count = fields.Integer(compute="_compute_employee_cars_count", string="Cars", groups="fleet.fleet_group_manager")
car_ids = fields.One2many(
'fleet.vehicle', 'driver_employee_id', string='Vehicles (private)',
groups="fleet.fleet_group_manager,hr.group_hr_user",
)
license_plate = fields.Char(compute="_compute_license_plate", search="_search_license_plate")
mobility_card = fields.Char(groups="fleet.fleet_group_user")
def action_open_employee_cars(self):
self.ensure_one()
return {
"type": "ir.actions.act_window",
"res_model": "fleet.vehicle.assignation.log",
"views": [[self.env.ref("hr_fleet.fleet_vehicle_assignation_log_employee_view_list").id, "tree"], [False, "form"]],
"domain": [("driver_employee_id", "in", self.ids)],
"context": dict(self._context, default_driver_id=self.user_id.partner_id.id, default_driver_employee_id=self.id),
"name": "History Employee Cars",
}
@api.depends('private_car_plate', 'car_ids.license_plate')
def _compute_license_plate(self):
for employee in self:
if employee.private_car_plate and employee.car_ids.license_plate:
employee.license_plate = ' '.join([employee.car_ids.license_plate, employee.private_car_plate])
else:
employee.license_plate = employee.car_ids.license_plate or employee.private_car_plate
def _search_license_plate(self, operator, value):
employees = self.env['hr.employee'].search(['|', ('car_ids.license_plate', operator, value), ('private_car_plate', operator, value)])
return [('id', 'in', employees.ids)]
def _compute_employee_cars_count(self):
rg = self.env['fleet.vehicle.assignation.log']._read_group([
('driver_employee_id', 'in', self.ids),
], ['driver_employee_id'], ['__count'])
cars_count = {driver_employee.id: count for driver_employee, count in rg}
for employee in self:
employee.employee_cars_count = cars_count.get(employee.id, 0)
@api.constrains('work_contact_id')
def _check_work_contact_id(self):
no_address = self.filtered(lambda r: not r.work_contact_id)
car_ids = self.env['fleet.vehicle'].sudo().search([
('driver_employee_id', 'in', no_address.ids),
])
# Prevent from removing employee address when linked to a car
if car_ids:
raise ValidationError(_('Cannot remove address from employees with linked cars.'))
def write(self, vals):
res = super().write(vals)
#Update car partner when it is changed on the employee
if 'work_contact_id' in vals:
car_ids = self.env['fleet.vehicle'].sudo().search([
('driver_employee_id', 'in', self.ids),
('driver_id', 'in', self.mapped('work_contact_id').ids),
])
if car_ids:
car_ids.write({'driver_id': vals['work_contact_id']})
if 'mobility_card' in vals:
#NOTE: keeping it as a search on driver_id but we might be able to use driver_employee_id in the future
vehicles = self.env['fleet.vehicle'].search([('driver_id', 'in', (self.user_id.partner_id | self.sudo().work_contact_id).ids)])
vehicles._compute_mobility_card()
return res
class EmployeePublic(models.Model):
_inherit = 'hr.employee.public'
mobility_card = fields.Char(readonly=True)