diff options
| author | Kevin Baptiste <kba@odoo.com> | 2019-06-07 09:37:49 +0000 |
|---|---|---|
| committer | Yannick Tivisse <yti@odoo.com> | 2019-11-27 11:54:51 +0000 |
| commit | 82df1dfccc6b4e3031b1434c7ec1bec2bf7aeb2d (patch) | |
| tree | 3d72557711c10291004502c72bdb370b13c25e2f /addons/fleet/models/fleet_vehicle.py | |
| parent | c5398bd4bc84a4e2bce16eb22564c87073a28c30 (diff) | |
[IMP] fleet: model cleanup, dashboard
Purpose
=======
It is currently difficult to know exactly what is used for costs
and services on the contracts.
Hence it make it difficult to evolve the fleet application
We should clean the models in order to have something that is clearer
Specification
=============
Cleanup of models: removed Fuel and Cost. Contract and Services are no
longer inheriting Cost and are seperate models simplifying the use of
Fleet. A contract now has included services and they are no longer
generating cost.
closes odoo/odoo#34090
Taskid: 1931775
Related: odoo/enterprise#4572
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
Diffstat (limited to 'addons/fleet/models/fleet_vehicle.py')
| -rw-r--r-- | addons/fleet/models/fleet_vehicle.py | 81 |
1 files changed, 50 insertions, 31 deletions
diff --git a/addons/fleet/models/fleet_vehicle.py b/addons/fleet/models/fleet_vehicle.py index 6f61451c914..389b77a87a0 100644 --- a/addons/fleet/models/fleet_vehicle.py +++ b/addons/fleet/models/fleet_vehicle.py @@ -18,6 +18,7 @@ class FleetVehicle(models.Model): return state if state and state.id else False name = fields.Char(compute="_compute_vehicle_name", store=True) + description = fields.Text("Vehicle Description") active = fields.Boolean('Active', default=True, tracking=True) company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env.company) currency_id = fields.Many2one('res.currency', related='company_id.currency_id') @@ -28,16 +29,21 @@ class FleetVehicle(models.Model): future_driver_id = fields.Many2one('res.partner', 'Future Driver', tracking=True, help='Next Driver of the vehicle', copy=False, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]") 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') + manager_id = fields.Many2one('res.users', compute='_compute_manager_id', domain=lambda self: [('groups_id', 'in', self.env.ref('fleet.fleet_group_manager').id)], store=True, readonly=False) + + @api.depends('model_id') + def _compute_manager_id(self): + if self.model_id: + self.manager_id = self.model_id.manager_id + else: + self.manager_id = None + 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') log_services = fields.One2many('fleet.vehicle.log.services', 'vehicle_id', 'Services Logs') log_contracts = fields.One2many('fleet.vehicle.log.contract', 'vehicle_id', 'Contracts') - cost_count = fields.Integer(compute="_compute_count_all", string="Costs") contract_count = fields.Integer(compute="_compute_count_all", string='Contract Count') 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') @@ -108,16 +114,12 @@ class FleetVehicle(models.Model): def _compute_count_all(self): Odometer = self.env['fleet.vehicle.odometer'] - LogFuel = self.env['fleet.vehicle.log.fuel'] LogService = self.env['fleet.vehicle.log.services'] LogContract = self.env['fleet.vehicle.log.contract'] - Cost = self.env['fleet.vehicle.cost'] for record in self: 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.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') @@ -130,7 +132,7 @@ class FleetVehicle(models.Model): total = 0 name = '' for element in record.log_contracts: - if element.state in ('open', 'diesoon', 'expired') and element.expiration_date: + if element.state in ('open', 'expired') and element.expiration_date: current_date_str = fields.Date.context_today(record) due_time_str = element.expiration_date current_date = fields.Date.from_string(current_date_str) @@ -145,11 +147,11 @@ class FleetVehicle(models.Model): if overdue or due_soon: log_contract = self.env['fleet.vehicle.log.contract'].search([ ('vehicle_id', '=', record.id), - ('state', 'in', ('open', 'diesoon', 'expired')) + ('state', 'in', ('open', 'expired')) ], limit=1, order='expiration_date asc') if log_contract: # we display only the name of the oldest overdue/due soon contract - name = log_contract.cost_subtype_id.name + name = log_contract.name record.contract_renewal_overdue = overdue record.contract_renewal_due_soon = due_soon @@ -168,16 +170,11 @@ class FleetVehicle(models.Model): today = fields.Date.context_today(self) datetime_today = fields.Datetime.from_string(today) limit_date = fields.Datetime.to_string(datetime_today + relativedelta(days=+delay_alert_contract)) - self.env.cr.execute("""SELECT cost.vehicle_id, - count(contract.id) AS contract_number - FROM fleet_vehicle_cost cost - LEFT JOIN fleet_vehicle_log_contract contract ON contract.cost_id = cost.id - WHERE contract.expiration_date IS NOT NULL - AND contract.expiration_date > %s - AND contract.expiration_date < %s - AND contract.state IN ('open', 'diesoon', 'expired') - GROUP BY cost.vehicle_id""", (today, limit_date)) - res_ids = [x[0] for x in self.env.cr.fetchall()] + res_ids = self.env['fleet.vehicle.log.contract'].search([ + ('expiration_date', '>', today), + ('expiration_date', '<', limit_date), + ('state', 'in', ['open', 'expired']) + ]).mapped('id') res.append(('id', search_operator, res_ids)) return res @@ -189,26 +186,26 @@ class FleetVehicle(models.Model): else: search_operator = 'not in' today = fields.Date.context_today(self) - self.env.cr.execute('''SELECT cost.vehicle_id, - count(contract.id) AS contract_number - FROM fleet_vehicle_cost cost - LEFT JOIN fleet_vehicle_log_contract contract ON contract.cost_id = cost.id - WHERE contract.expiration_date IS NOT NULL - AND contract.expiration_date < %s - AND contract.state IN ('open', 'diesoon', 'expired') - GROUP BY cost.vehicle_id ''', (today,)) - res_ids = [x[0] for x in self.env.cr.fetchall()] + res_ids = self.env['fleet.vehicle.log.contract'].search([ + ('expiration_date', '!=', False), + ('expiration_date', '<', today), + ('state', 'in', ['open', 'expired']) + ]).mapped('id') res.append(('id', search_operator, res_ids)) return res @api.model def create(self, vals): - res = super(FleetVehicle, self).create(vals) + res = super(FleetVehicle, self.with_context({'odometer_no_chatter': True})).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}) + for rec in res: + if rec.odometer: + date = fields.Date.context_today(rec) + rec.message_post(body=_("Odometer on %s: %s %s") % (date, rec.odometer, rec.odometer_unit)) return res def write(self, vals): @@ -257,6 +254,12 @@ class FleetVehicle(models.Model): return self.env['fleet.vehicle.state'].search([], order=order) @api.model + def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True): + if 'co2' in fields: + fields.remove('co2') + return super(FleetVehicle, self).read_group(domain, fields, groupby, offset, limit, orderby, lazy) + + @api.model def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None): args = args or [] if operator == 'ilike' and not (name or '').strip(): @@ -337,6 +340,22 @@ class FleetVehicleOdometer(models.Model): if self.vehicle_id: self.unit = self.vehicle_id.odometer_unit + @api.model + def create(self, vals): + odometers = super(FleetVehicleOdometer, self).create(vals) + + for odometer in odometers: + if not self.env.context.get('odometer_no_chatter'): + odometer.vehicle_id.message_post(body=_("Odometer on %s: %s %s") % (odometer.date, odometer.value, odometer.unit)) + + return odometers + + def write(self, vals): + odometers = super(FleetVehicleOdometer, self).write(vals) + if 'value' in vals and not self.env.context.get('odometer_no_chatter'): + for odometer in self: + odometer.vehicle_id.message_post(body=_("Odometer on %s: %s %s") % (odometer.date, odometer.value, odometer.unit)) + return odometers class FleetVehicleState(models.Model): _name = 'fleet.vehicle.state' |
