[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:
@@ -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,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>
|
||||
Reference in New Issue
Block a user