[IMP] hr_fleet: add wizard to convert fleet categories

Adds a wizard to migrate a fleet from an external to an internal one.

Task ID: 2415309
This commit is contained in:
William Braeckman
2021-07-09 14:51:26 +02:00
parent 677d51e7b0
commit 317d26c62d
5 changed files with 147 additions and 0 deletions
+2
View File
@@ -9,11 +9,13 @@
'depends': ['hr', 'fleet'],
'data': [
'data/hr_fleet_data.xml',
'security/ir.model.access.csv',
'views/employee_views.xml',
'views/fleet_category_views.xml',
'views/fleet_vehicle_views.xml',
'views/fleet_vehicle_cost_views.xml',
'wizard/hr_departure_wizard_views.xml',
'wizard/fleet_convert_wizard_views.xml',
],
'demo': [
'data/hr_fleet_demo.xml',
@@ -0,0 +1,4 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
hr_fleet_convert_wizard_access_right_user,hr_fleet_convert_wizard_access_right,model_hr_fleet_convert_wizard,fleet.fleet_group_user,1,1,1,1
hr_fleet_convert_wizard_line_access_right_user,hr_fleet_convert_wizard_line_access_right,model_hr_fleet_convert_wizard_line,fleet.fleet_group_user,1,1,1,1
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 hr_fleet_convert_wizard_access_right_user hr_fleet_convert_wizard_access_right model_hr_fleet_convert_wizard fleet.fleet_group_user 1 1 1 1
3 hr_fleet_convert_wizard_line_access_right_user hr_fleet_convert_wizard_line_access_right model_hr_fleet_convert_wizard_line fleet.fleet_group_user 1 1 1 1
+1
View File
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import fleet_convert_wizard
from . import hr_departure_wizard
@@ -0,0 +1,95 @@
# -*- 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 UserError
class FleetConvertWizard(models.TransientModel):
_name = 'hr.fleet.convert.wizard'
_description = 'Convert external fleet to internal'
@api.model
def default_get(self, field_list=None):
if self.env['fleet.category'].browse(self.env.context.get('active_id', None)).internal:
raise UserError(_('This wizard can only be executed if the \'internal\' checkbox is unchecked.'))
return super().default_get(field_list)
def _default_line_ids(self):
fleet_id = self.env['fleet.category'].browse(self.env.context.get('active_id', False))
line_ids = []
if fleet_id:
lines = self.env['hr.fleet.convert.wizard.line']
vehicles = fleet_id.vehicle_ids.filtered(lambda v: v.driver_id and not v.driver_employee_id)
partners = vehicles.driver_id | vehicles.future_driver_id
employees = self.env['hr.employee'].search([
('address_home_id', 'in', partners.ids)
])
partner_employee_map = \
{partner: employees.filtered(lambda e: e.address_home_id == partner) for partner in partners}
for vehicle in vehicles:
lines |= lines.new({
'vehicle_id': vehicle,
'employee_id': partner_employee_map[vehicle.driver_id][0] \
if vehicle.driver_id and partner_employee_map[vehicle.driver_id] else False,
'future_employee_id': partner_employee_map[vehicle.future_driver_id][0] \
if vehicle.future_driver_id and partner_employee_map[vehicle.future_driver_id] else False,
})
# Order invalids first, _order doesn't seem to affect the view
line_ids = lines.sorted(key=lambda l: (
not l.invalid_driver, not l.invalid_future_driver, l.license_plate
)
)
return line_ids
fleet_id = fields.Many2one(
'fleet.category',
string='Fleet',
default=lambda self: self.env.context.get('active_id', None),
readonly=True,
)
line_ids = fields.One2many(
'hr.fleet.convert.wizard.line',
'convert_wizard_id',
default=_default_line_ids,
)
def action_validate(self):
for wizard in self:
lines = wizard.line_ids
wizard.fleet_id.write({'internal': True})
lines.filtered(lambda l: l.invalid_driver).vehicle_id.write({'driver_id': False})
lines.filtered(lambda l: l.invalid_future_driver).vehicle_id.write({'future_driver_id': False})
for line in lines.filtered(lambda l: not l.invalid_driver):
line.vehicle_id.write({
'driver_employee_id': line.employee_id.id,
'future_driver_employee_id': line.future_employee_id.id,
})
return True
class FleetConvertWizardLine(models.TransientModel):
_name = 'hr.fleet.convert.wizard.line'
_description = 'External fleet conversion data'
_order = 'invalid_driver asc'
convert_wizard_id = fields.Many2one('hr.fleet.convert.wizard', required=True, ondelete='cascade')
vehicle_id = fields.Many2one('fleet.vehicle', required=False, ondelete='cascade')
vehicle_name = fields.Char(related='vehicle_id.name', readonly=True)
license_plate = fields.Char(related='vehicle_id.license_plate')
driver_id = fields.Many2one(related='vehicle_id.driver_id')
future_driver_id = fields.Many2one(related='vehicle_id.future_driver_id')
employee_id = fields.Many2one('hr.employee', string='Employee')
future_employee_id = fields.Many2one('hr.employee', string='Future Employee')
invalid_driver = fields.Boolean(compute='_compute_invalid')
invalid_future_driver = fields.Boolean(compute='_compute_invalid')
@api.depends('employee_id', 'future_employee_id')
def _compute_invalid(self):
invalids = self.filtered(lambda r: not r.employee_id or (r.employee_id and not r.employee_id.address_home_id))
valids = (self - invalids)
invalids.write({'invalid_driver': True})
valids.write({'invalid_driver': False})
invalids = self.filtered(lambda r: (r.future_driver_id and not r.future_employee_id) or \
(r.future_employee_id and not r.future_employee_id.address_home_id))
valids = (self - invalids)
invalids.write({'invalid_future_driver': True})
valids.write({'invalid_future_driver': False})
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_fleet_convert_wizard_view_form" model="ir.ui.view">
<field name="name">hr.fleet.convert.wizard.view.form</field>
<field name="model">hr.fleet.convert.wizard</field>
<field name="arch" type="xml">
<form string="Convert Fleet">
<sheet>
<group>
<field name="fleet_id" widget="many2one_fleet_category" options="{'no_open': True}"/>
</group>
<field name="line_ids">
<tree decoration-danger="invalid_driver" decoration-warning="invalid_future_driver"
create="false" delete="false" editable="bottom">
<field name="invalid_driver" invisible="1"/>
<field name="invalid_future_driver" invisible="1"/>
<field name="convert_wizard_id" invisible="1"/>
<field name="vehicle_id" invisible="1"/>
<field name="vehicle_name" string="Vehicle"/>
<field name="license_plate"/>
<field name="driver_id" options="{'no_open': True}"/>
<field name="future_driver_id" options="{'no_open': True}"/>
<field name="employee_id" options="{'no_create': True, 'no_open': True}"/>
<field name="future_employee_id" options="{'no_create': True, 'no_open': True}"/>
</tree>
</field>
</sheet>
<footer>
<button name="action_validate" string="Apply" type="object" class="oe_highlight"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="hr_fleet_convert_wizard_action" model="ir.actions.act_window">
<field name="name">Convert Fleet</field>
<field name="res_model">hr.fleet.convert.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="binding_model_id" ref="model_fleet_category"/>
<field name="binding_view_types">form</field>
<field name="groups_id" eval="[(4, ref('base.group_no_one'))]"/>
</record>
</odoo>