[IMP] fleet: add future drivers on cars + managers on models

Basically when someone requests a new car, getting that car ready takes
some time, this means that during the waiting period, that person is
still driving its old car.

This commit adds a field future_driver_id on fleet.vehicle to tackle
that problem and a boolean plan_to_change_car on the partner to track
who wants to change car.

+ Apply some linting to the files
This commit cleans the vehicle form view, the vehicle contract form
view, the cost list view and adds a manager_id field on the
vehicle.model which is then used as a related on the vehicle.

Task: 1930298

closes odoo/odoo#31197

Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
This commit is contained in:
RomainLibert
2019-04-18 11:55:25 +00:00
committed by Yannick Tivisse
parent 5b2cf15c05
commit 3c32f9b903
11 changed files with 187 additions and 76 deletions
+1 -1
View File
@@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from . import models
+22 -2
View File
@@ -399,12 +399,12 @@
<record id="type_contract_repairing" model="fleet.service.type">
<field name="name">Repairing</field>
<field name="category">service</field>
</record>
</record>
<record id="type_service_refueling" model="fleet.service.type">
<field name="name">Refueling</field>
<field name="category">service</field>
</record>
</record>
<record id="vehicle_tag_junior" model="fleet.vehicle.tag" >
<field name="name">Junior</field>
@@ -446,6 +446,26 @@
<field name="color" eval="8"/>
</record>
<record id="model_astra" model="fleet.vehicle.model">
<field name="manager_id" ref="base.user_admin"/>
</record>
<record id="model_corsa" model="fleet.vehicle.model">
<field name="manager_id" ref="base.user_admin"/>
</record>
<record id="model_serie1" model="fleet.vehicle.model">
<field name="manager_id" ref="base.user_admin"/>
</record>
<record id="model_a1" model="fleet.vehicle.model">
<field name="manager_id" ref="base.user_admin"/>
</record>
<record id="model_classa" model="fleet.vehicle.model">
<field name="manager_id" ref="base.user_admin"/>
</record>
<record id="vehicle_1" model="fleet.vehicle">
<field name="license_plate">1-ACK-205</field>
<field name="vin_sn">5454541</field>
+1
View File
@@ -5,3 +5,4 @@ from . import fleet_vehicle
from . import fleet_vehicle_cost
from . import fleet_vehicle_model
from . import res_config_settings
from . import res_partner
+50 -11
View File
@@ -19,13 +19,16 @@ class FleetVehicle(models.Model):
name = fields.Char(compute="_compute_vehicle_name", store=True)
active = fields.Boolean('Active', default=True, tracking=True)
company_id = fields.Many2one('res.company', 'Company')
company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env['res.company']._company_default_get())
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
license_plate = fields.Char(tracking=True,
help='License plate number of the vehicle (i = plate number for a car)')
vin_sn = fields.Char('Chassis Number', help='Unique number written on the vehicle motor (VIN/SN number)', copy=False)
driver_id = fields.Many2one('res.partner', 'Driver', tracking=True, help='Driver of the vehicle', copy=False, auto_join=True)
driver_id = fields.Many2one('res.partner', 'Driver', tracking=True, help='Driver of the vehicle', copy=False)
future_driver_id = fields.Many2one('res.partner', 'Future Driver', tracking=True, help='Next Driver of the vehicle', copy=False)
model_id = fields.Many2one('fleet.vehicle.model', 'Model',
tracking=True, required=True, help='Model of the vehicle')
manager_id = fields.Many2one('res.users', related='model_id.manager_id')
brand_id = fields.Many2one('fleet.vehicle.model.brand', 'Brand', related="model_id.brand_id", store=True, readonly=False)
log_drivers = fields.One2many('fleet.vehicle.assignation.log', 'vehicle_id', string='Assignation Logs')
log_fuel = fields.One2many('fleet.vehicle.log.fuel', 'vehicle_id', 'Fuel Logs')
@@ -36,6 +39,8 @@ class FleetVehicle(models.Model):
service_count = fields.Integer(compute="_compute_count_all", string='Services')
fuel_logs_count = fields.Integer(compute="_compute_count_all", string='Fuel Log Count')
odometer_count = fields.Integer(compute="_compute_count_all", string='Odometer')
history_count = fields.Integer(compute="_compute_count_all", string="Drivers History Count")
next_assignation_date = fields.Date('Assignation Date', help='This is the date at which the car will be available, if not set it means available instantly')
acquisition_date = fields.Date('Immatriculation Date', required=False,
default=fields.Date.today, help='Date when the vehicle has been immatriculated')
first_contract_date = fields.Date(string="First Contract Date", default=fields.Date.today)
@@ -46,7 +51,7 @@ class FleetVehicle(models.Model):
help='Current state of the vehicle', ondelete="set null")
location = fields.Char(help='Location of the vehicle (garage, ...)')
seats = fields.Integer('Seats Number', help='Number of seats of the vehicle')
model_year = fields.Char('Model Year',help='Year of the model')
model_year = fields.Char('Model Year', help='Year of the model')
doors = fields.Integer('Doors Number', help='Number of doors of the vehicle', default=5)
tag_ids = fields.Many2many('fleet.vehicle.tag', 'fleet_vehicle_vehicle_tag_rel', 'vehicle_tag_id', 'tag_id', 'Tags', copy=False)
odometer = fields.Float(compute='_get_odometer', inverse='_set_odometer', string='Last Odometer',
@@ -78,7 +83,9 @@ class FleetVehicle(models.Model):
contract_renewal_total = fields.Text(compute='_compute_contract_reminder', string='Total of contracts due or overdue minus one',
multi='contract_info')
car_value = fields.Float(string="Catalog Value (VAT Incl.)", help='Value of the bought vehicle')
net_car_value = fields.Float(string="Purchase Value", help="Purchase Value of the car")
residual_value = fields.Float()
plan_to_change_car = fields.Boolean(related='driver_id.plan_to_change_car', store=True, readonly=False)
@api.depends('model_id.brand_id.name', 'model_id.name', 'license_plate')
def _compute_vehicle_name(self):
@@ -111,8 +118,9 @@ class FleetVehicle(models.Model):
record.odometer_count = Odometer.search_count([('vehicle_id', '=', record.id)])
record.fuel_logs_count = LogFuel.search_count([('vehicle_id', '=', record.id)])
record.service_count = LogService.search_count([('vehicle_id', '=', record.id)])
record.contract_count = LogContract.search_count([('vehicle_id', '=', record.id),('state','!=','closed')])
record.contract_count = LogContract.search_count([('vehicle_id', '=', record.id), ('state', '!=', 'closed')])
record.cost_count = Cost.search_count([('vehicle_id', '=', record.id), ('parent_id', '=', False)])
record.history_count = self.env['fleet.vehicle.assignation.log'].search_count([('vehicle_id', '=', record.id)])
@api.depends('log_contracts')
def _compute_contract_reminder(self):
@@ -207,34 +215,65 @@ class FleetVehicle(models.Model):
res = super(FleetVehicle, self).create(vals)
if 'driver_id' in vals and vals['driver_id']:
res.create_driver_history(vals['driver_id'])
if 'future_driver_id' in vals and vals['future_driver_id']:
future_driver = self.env['res.partner'].browse(vals['future_driver_id'])
future_driver.write({'plan_to_change_car': True})
return res
@api.multi
def write(self, vals):
res = super(FleetVehicle, self).write(vals)
if 'driver_id' in vals and vals['driver_id']:
self.create_driver_history(vals['driver_id'])
driver_id = vals['driver_id']
self.filtered(lambda v: v.driver_id.id != driver_id).create_driver_history(driver_id)
if 'future_driver_id' in vals and vals['future_driver_id']:
future_driver = self.env['res.partner'].browse(vals['future_driver_id'])
future_driver.write({'plan_to_change_car': True})
res = super(FleetVehicle, self).write(vals)
if 'active' in vals and not vals['active']:
self.mapped('log_contracts').write({'active': False})
return res
def _close_driver_history(self):
self.env['fleet.vehicle.assignation.log'].search([
('vehicle_id', 'in', self.ids),
('driver_id', 'in', self.mapped('driver_id').ids),
('date_end', '=', False)
]).write({'date_end': fields.Date.today()})
def create_driver_history(self, driver_id):
for vehicle in self:
self.env['fleet.vehicle.assignation.log'].create({
'vehicle_id': vehicle.id,
'driver_id': driver_id,
'date_start': fields.Date.today(),
'date_start': fields.Date.today(),
})
def action_accept_driver_change(self):
# Find all the vehicles for which the driver is the future_driver_id
# remove their driver_id and close their history using current date
vehicles = self.search([('driver_id', 'in', self.mapped('future_driver_id').ids)])
vehicles.write({'driver_id': False})
vehicles._close_driver_history()
for vehicle in self:
vehicle.future_driver_id.write({'plan_to_change_car': False})
vehicle.driver_id = vehicle.future_driver_id
vehicle.future_driver_id = False
@api.model
def _read_group_stage_ids(self, stages, domain, order):
return self.env['fleet.vehicle.state'].search([], order=order)
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
domain = args or []
domain = expression.AND([domain, ['|', ('name', operator, name), ('driver_id.name', operator, name)]])
rec = self._search(domain, limit=limit, access_rights_uid=name_get_uid)
args = args or []
if operator == 'ilike' and not (name or '').strip():
domain = []
else:
domain = ['|', ('name', operator, name), ('driver_id.name', operator, name)]
rec = self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid)
return self.browse(rec).name_get()
@api.multi
@@ -347,7 +386,7 @@ class FleetServiceType(models.Model):
class FleetVehicleAssignationLog(models.Model):
_name = "fleet.vehicle.assignation.log"
_description = "Drivers history on a vehicle"
_order = "date_start"
_order = "create_date desc, date_start desc"
vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle", required=True)
driver_id = fields.Many2one('res.partner', string="Driver", required=True)
+3 -1
View File
@@ -32,6 +32,8 @@ class FleetVehicleCost(models.Model):
contract_id = fields.Many2one('fleet.vehicle.log.contract', 'Contract', help='Contract attached to this cost')
auto_generated = fields.Boolean('Automatically Generated', readonly=True)
description = fields.Char("Cost Description")
company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env['res.company']._company_default_get())
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
def _get_odometer(self):
for record in self:
@@ -135,7 +137,7 @@ class FleetVehicleLogContract(models.Model):
# (1) to address fields from inherited table
# (2) fields that aren't stored in database
cost_amount = fields.Float(related='cost_id.amount', string='Amount', store=True, readonly=False)
odometer = fields.Float(string='Odometer at creation',
odometer = fields.Float(string='Creation Contract Odometer',
help='Odometer measure of the vehicle at the moment of the contract creation')
@api.depends('vehicle_id', 'cost_subtype_id', 'date')
+3 -1
View File
@@ -10,8 +10,10 @@ class FleetVehicleModel(models.Model):
_order = 'name asc'
name = fields.Char('Model name', required=True)
brand_id = fields.Many2one('fleet.vehicle.model.brand', 'Make', required=True, help='Make of the vehicle')
brand_id = fields.Many2one('fleet.vehicle.model.brand', 'Manufacturer', required=True, help='Manufacturer of the vehicle')
vendors = fields.Many2many('res.partner', 'fleet_vehicle_model_vendors', 'model_id', 'partner_id', string='Vendors')
manager_id = fields.Many2one('res.users', 'Fleet Manager', default=lambda self: self.env.uid,
domain=lambda self: [('groups_id', 'in', self.env.ref('fleet.fleet_group_manager').id)])
image = fields.Binary(related='brand_id.image', string="Logo", readonly=False)
image_medium = fields.Binary(related='brand_id.image_medium', string="Logo (medium)", readonly=False)
image_small = fields.Binary(related='brand_id.image_small', string="Logo (small)", readonly=False)
+10
View File
@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
plan_to_change_car = fields.Boolean('Plan To Change Car', default=False)
+1 -1
View File
@@ -3,7 +3,7 @@ fleet_vehicle_model_access_right_user,fleet_vehicle_model_access_right,model_fle
fleet_vehicle_tag_access_right_user,fleet_vehicle_tag_access_right,model_fleet_vehicle_tag,fleet_group_user,1,0,0,0
fleet_vehicle_state_access_right_user,fleet_vehicle_state_access_right,model_fleet_vehicle_state,fleet_group_user,1,0,0,0
fleet_vehicle_model_brand_access_right_user,fleet_vehicle_model_brand_access_right,model_fleet_vehicle_model_brand,fleet_group_user,1,0,0,0
fleet_vehicle_access_right_user,fleet_vehicle_access_right",model_fleet_vehicle,fleet_group_user,1,1,0,0
fleet_vehicle_access_right_user,fleet_vehicle_access_right,model_fleet_vehicle,fleet_group_user,1,1,0,0
fleet_vehicle_log_services_access_right_user,fleet_vehicle_log_services_access_right,model_fleet_vehicle_log_services,fleet_group_user,1,0,0,0
fleet_vehicle_log_contract_access_right_user,fleet_vehicle_log_contract_access_right,model_fleet_vehicle_log_contract,fleet_group_user,1,0,0,0
fleet_service_type_access_right_user,fleet_service_type_access_right,model_fleet_service_type,fleet_group_user,1,0,0,0
Can't render this file because it contains an unexpected character in line 6 and column 59.
+26 -24
View File
@@ -6,10 +6,12 @@
<field name="model">fleet.vehicle.cost</field>
<field name="arch" type="xml">
<tree string="Vehicle Costs">
<field name="currency_id" invisible="1"/>
<field name="vehicle_id"/>
<field name="description"/>
<field name="cost_subtype_id"/>
<field name="date"/>
<field name="amount" sum="Cost" widget="monetary"/>
</tree>
</field>
</record>
@@ -19,6 +21,7 @@
<field name="model">fleet.vehicle.cost</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="currency_id"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
@@ -30,7 +33,7 @@
</div>
<div>
<field name="cost_subtype_id"/>
<span class="float-right"><field name="amount"/></span>
<span class="float-right"><field name="amount" widget="monetary"/></span>
</div>
</div>
</t>
@@ -117,11 +120,12 @@
<field name="arch" type="xml">
<form string="Vehicle costs">
<sheet>
<field name="currency_id" invisible="1"/>
<group col="2" string="Cost Details">
<group>
<field name="vehicle_id" />
<field name="cost_subtype_id"/>
<field name="amount"/>
<field name="amount" widget="monetary"/>
<field name="description"/>
</group>
<group>
@@ -177,24 +181,22 @@
<field name="state" widget="statusbar" />
</header>
<sheet>
<field name="currency_id" invisible="1"/>
<div class="oe_button_box" name="button_box">
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
<field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
</button>
</div>
<group col="2">
<group string="Contract details">
<field name="vehicle_id"/>
<group string="Contract Informations">
<field name="ins_ref"/>
<field name="cost_subtype_id" required="1" domain="['|',('category','=','contract'),('category','=','both')]"/>
<field name="insurer_id" context="{'default_supplier': True}"/>
<field name="user_id"/>
<field name="amount" string="Activation Cost" help="Cost that is paid only once at the creation of the contract"/>
<label for="cost_generated"/>
<div>
<field name="cost_generated" class="oe_inline" attrs="{'invisible': [('cost_frequency','=','no')]}" />
<field name="cost_frequency" class="oe_inline" />
</div>
</group>
<group string="Odometer details">
<group string="Vehicle Informations">
<field name="vehicle_id"/>
<field name="purchaser_id"/>
<label for="odometer"/>
<div class="o_row">
<field name="odometer"/>
@@ -204,14 +206,17 @@
</group>
<group col="2">
<group>
<field name="date" string="Invoice Date"/>
<field name="start_date"/>
<field name="expiration_date" />
<field name="amount" string="Activation Cost" help="Cost that is paid only once at the creation of the contract" widget="monetary"/>
<label for="cost_generated"/>
<div class="o_row">
<field name="cost_generated" attrs="{'invisible': [('cost_frequency','=','no')]}" widget="monetary"/>
<field name="cost_frequency"/>
</div>
</group>
<group>
<field name="insurer_id" context="{'default_supplier': True}"/>
<field name="purchaser_id" />
<field name="ins_ref" />
<field name="date" string="Invoice Date"/>
<field name="start_date"/>
<field name="expiration_date"/>
</group>
</group>
<notebook>
@@ -219,25 +224,22 @@
<group>
<field name="cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1">
<tree editable="bottom">
<field name="currency_id" invisible="1"/>
<field name="cost_subtype_id" string="Service" domain="[('category','=','service')]"/>
<field name="description"/>
<field name="amount" sum="Price" string="Indicative Cost" />
<field name="amount" sum="Price" string="Indicative Cost" widget="monetary"/>
</tree>
</field>
</group>
<div class="oe_right">
<group>
<field name="sum_cost" string="Indicative Costs Total"/>
</group>
</div>
</page>
<page string="Generated Recurring Costs">
<group>
<field name="generated_cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1" sum="amount">
<tree editable="bottom" >
<field name="currency_id" invisible="1"/>
<field name="date" />
<field name="amount" sum="amount"/>
<field name="amount" sum="amount" widget="monetary"/>
</tree>
</field>
@@ -17,6 +17,11 @@
<field name="brand_id" placeholder="e.g. Tesla"/>
</h2>
</div>
<group>
<group>
<field name="manager_id" groups="fleet.fleet_group_manager"/>
</group>
</group>
<notebook>
<page string="Vendors" name="vendors">
<field name="vendors">
@@ -143,13 +148,13 @@
</record>
<record id='fleet_vehicle_model_brand_action' model='ir.actions.act_window'>
<field name="name">Model make of Vehicle</field>
<field name="name">Car Manufacturers</field>
<field name="res_model">fleet.vehicle.model.brand</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new make
Create a new manufacturer
</p>
</field>
</record>
+63 -33
View File
@@ -10,13 +10,19 @@
<field name="state_id" widget="statusbar" options="{'clickable': '1'}"/>
</header>
<sheet>
<field name="currency_id" invisible="1"/>
<div class="oe_button_box" name="button_box">
<button name="open_assignation_logs" string="Drivers History" type="object" class="oe_stat_button" icon="fa-history"/>
<button name="open_assignation_logs"
type="object"
class="oe_stat_button"
icon="fa-history">
<field name="history_count" widget="statinfo" string="Drivers History"/>
</button>
<button name="return_action_to_open"
type="object"
class="oe_stat_button"
icon="fa-book"
context="{'xml_id':'fleet_vehicle_log_contract_action', 'search_default_open': 1}"
context="{'xml_id':'fleet_vehicle_log_contract_action'}"
help="show the contract for this vehicle">
<field name="contract_count" widget="statinfo" string="Contracts"/>
</button>
@@ -69,41 +75,54 @@
<label for="tag_ids" class="oe_edit_only"/>
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}"/>
</div>
<group col="2" string="General Properties">
<group >
<field name="driver_id" />
<field name="location" />
<field name="vin_sn" />
<field name="model_year"/>
<field name="company_id" groups="base.group_multi_company"/>
<group col="2">
<group string="Driver">
<field name="driver_id"/>
<label for="future_driver_id"/>
<div class="o_row">
<field name="future_driver_id"/>
<button string="Apply Change"
class="btn btn-primary"
type="object"
name="action_accept_driver_change"
attrs="{'invisible': [('future_driver_id', '=', False)]}"/>
</div>
<field name="plan_to_change_car" groups="fleet.fleet_group_manager"/>
<field name="next_assignation_date"/>
<field name="location"/>
</group>
<group >
<group string="Vehicle">
<label for="odometer"/>
<div class="o_row">
<field name="odometer"/>
<field name="odometer_unit"/>
</div>
<field name="acquisition_date" />
<field name="acquisition_date"/>
<field name="vin_sn"/>
<field name="car_value" widget="monetary"/>
<field name="net_car_value" widget="monetary"/>
<field name="residual_value" widget="monetary"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
<group string="Contract">
<field name="manager_id"/>
<field name="first_contract_date"/>
<field name="car_value" />
<field name="residual_value"/>
</group>
</group>
<group col="2">
<group string="Additional Properties">
<field name="seats" />
<field name="doors" />
<field name="color" />
<group string="Model">
<field name="seats"/>
<field name="doors"/>
<field name="color"/>
<field name="model_year"/>
</group>
<group string="Engine Options">
<field name="transmission" />
<field name="fuel_type" />
<group string="Engine">
<field name="transmission"/>
<field name="fuel_type"/>
<label for="co2"/>
<div class="o_row" name="co2">
<field name="co2"/><span>g/km</span>
</div>
<field name="horsepower" />
<field name="horsepower_tax" />
<field name="horsepower"/>
<field name="horsepower_tax" widget="monetary"/>
<label for="power"/>
<div class="o_row">
<field name="power"/><span>kW</span>
@@ -119,21 +138,23 @@
</form>
</field>
</record>
<record id='fleet_vehicle_view_tree' model='ir.ui.view'>
<field name="name">fleet.vehicle.tree</field>
<field name="model">fleet.vehicle</field>
<field name="arch" type="xml">
<tree string="Vehicle" decoration-warning="contract_renewal_due_soon and not contract_renewal_overdue" decoration-danger="contract_renewal_overdue">
<field name="active" invisible="1"/>
<field name="license_plate" />
<field name="model_id" />
<field name="driver_id" />
<field name="license_plate"/>
<field name="model_id"/>
<field name="driver_id"/>
<field name="future_driver_id"/>
<field name="log_drivers" invisible="1"/>
<field name="vin_sn" />
<field name="acquisition_date" />
<field name="vin_sn"/>
<field name="acquisition_date"/>
<field name="state_id"/>
<field name="contract_renewal_due_soon" invisible="1"/>
<field name="contract_renewal_overdue" invisible="1" />
<field name="contract_renewal_overdue" invisible="1"/>
<field name="contract_renewal_total" invisible="1"/>
</tree>
</field>
@@ -147,9 +168,14 @@
<field name="name" filter_domain="['|', ('name','ilike',self), ('license_plate','ilike',self)]" string="Vehicle"/>
<field name="log_drivers" filter_domain="[('log_drivers.driver_id.name', 'ilike', self)]" string="Drivers History"/>
<field name="driver_id"/>
<field name="future_driver_id"/>
<field name="tag_ids"/>
<field name="location"/>
<field name="state_id" />
<field name="state_id"/>
<filter name="available" string="Is Available"
domain="['&amp;', ('future_driver_id', '=', False), '|', ('driver_id', '=', False), ('plan_to_change_car', '=', True)]"/>
<filter name="planned" string="Planned for Change" domain="[('plan_to_change_car', '=', True)]"/>
<separator/>
<filter name="alert_true" domain="['|',('contract_renewal_due_soon','=',True),('contract_renewal_overdue','=',True)]" string="Has Alert(s)"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
@@ -180,6 +206,7 @@
<field name="license_plate" />
<field name="model_id" />
<field name="driver_id" />
<field name="future_driver_id" />
<field name="location" />
<field name="state_id" />
<field name="id" />
@@ -211,6 +238,9 @@
<li>
<t t-if="record.driver_id.raw_value"><field name="driver_id"/></t>
</li>
<li>
<t t-if="record.future_driver_id.raw_value">Future Driver : <field name="future_driver_id"/></t>
</li>
<li>
<t t-if="record.location.raw_value"><field name="location"/></t>
</li>
@@ -219,7 +249,7 @@
<div class="o_kanban_button">
<a t-if="record.contract_count.raw_value>0" data-type="object"
data-name="return_action_to_open" href="#" class="oe_kanban_action oe_kanban_action_a"
data-context='{"xml_id":"fleet_vehicle_log_contract_action","search_default_open": 1}'>
data-context='{"xml_id":"fleet_vehicle_log_contract_action"}'>
<field name="contract_count"/>
Contract(s)
<span t-if="record.contract_renewal_due_soon.raw_value and !record.contract_renewal_overdue.raw_value"
@@ -359,7 +389,7 @@
</record>
<menuitem action="fleet_vehicle_odometer_action" parent="fleet_vehicles" id="fleet_vehicle_odometer_menu" groups="fleet_group_user"/>
<record id='fleet_vehicle_service_types_view_tree' model='ir.ui.view'>
<field name="name">fleet.service.type.tree</field>
<field name="model">fleet.service.type</field>