From 24713b76b597345abcbf57925e9085b6e34fe187 Mon Sep 17 00:00:00 2001 From: Yannick Tivisse Date: Mon, 23 Aug 2021 15:06:57 +0000 Subject: [PATCH] [REV] fleet: Revert multiple fleet mechanism I don't get why you don't get it... Partial revert of the taskID: 2415309 Com PR: https://github.com/odoo/odoo/pull/70313 Ent PR: https://github.com/odoo/enterprise/pull/18114 Upg PR: https://github.com/odoo/upgrade/pull/2447 closes odoo/odoo#75475 Related: odoo/enterprise#20406 Related: odoo/upgrade#2765 Signed-off-by: Yannick Tivisse (yti) --- addons/fleet/__manifest__.py | 2 - addons/fleet/data/fleet_data.xml | 18 --- addons/fleet/data/fleet_demo.xml | 5 - addons/fleet/models/__init__.py | 2 - addons/fleet/models/fleet_category.py | 90 ----------- addons/fleet/models/fleet_category_tag.py | 15 -- addons/fleet/models/fleet_vehicle.py | 23 +-- .../models/fleet_vehicle_log_contract.py | 2 +- addons/fleet/report/fleet_report.py | 19 +-- addons/fleet/security/fleet_security.xml | 5 - addons/fleet/security/ir.model.access.csv | 4 - .../static/src/js/fleet_category_widget.js | 37 ----- addons/fleet/static/src/js/fleet_kanban.js | 4 +- addons/fleet/static/src/scss/fleet.scss | 9 -- addons/fleet/tests/test_access_rights.py | 5 - addons/fleet/views/fleet_board_view.xml | 1 - .../fleet/views/fleet_category_tag_views.xml | 36 ----- addons/fleet/views/fleet_category_views.xml | 123 --------------- .../fleet/views/fleet_vehicle_cost_views.xml | 4 +- addons/fleet/views/fleet_vehicle_views.xml | 11 +- addons/hr/__manifest__.py | 1 + addons/hr/models/res_partner.py | 22 ++- addons/hr/views/res_partner_views.xml | 18 +++ addons/hr_fleet/__manifest__.py | 3 - addons/hr_fleet/data/hr_fleet_data.xml | 6 - addons/hr_fleet/models/__init__.py | 1 - addons/hr_fleet/models/employee.py | 2 - addons/hr_fleet/models/fleet_category.py | 23 --- addons/hr_fleet/models/fleet_vehicle.py | 119 +++++--------- .../models/fleet_vehicle_assignation_log.py | 3 +- .../models/fleet_vehicle_log_contract.py | 3 +- .../models/fleet_vehicle_log_services.py | 7 +- .../hr_fleet/models/fleet_vehicle_odometer.py | 2 +- addons/hr_fleet/security/ir.model.access.csv | 2 - addons/hr_fleet/tests/__init__.py | 4 - addons/hr_fleet/tests/test_fleet_category.py | 146 ------------------ .../hr_fleet/views/fleet_category_views.xml | 24 --- .../views/fleet_vehicle_cost_views.xml | 31 +--- addons/hr_fleet/views/fleet_vehicle_views.xml | 59 +++---- addons/hr_fleet/wizard/__init__.py | 1 - .../hr_fleet/wizard/fleet_convert_wizard.py | 95 ------------ .../wizard/fleet_convert_wizard_views.xml | 45 ------ 42 files changed, 122 insertions(+), 910 deletions(-) delete mode 100644 addons/fleet/models/fleet_category.py delete mode 100644 addons/fleet/models/fleet_category_tag.py delete mode 100644 addons/fleet/static/src/js/fleet_category_widget.js delete mode 100644 addons/fleet/static/src/scss/fleet.scss delete mode 100644 addons/fleet/views/fleet_category_tag_views.xml delete mode 100644 addons/fleet/views/fleet_category_views.xml create mode 100644 addons/hr/views/res_partner_views.xml delete mode 100644 addons/hr_fleet/data/hr_fleet_data.xml delete mode 100644 addons/hr_fleet/models/fleet_category.py delete mode 100644 addons/hr_fleet/tests/__init__.py delete mode 100644 addons/hr_fleet/tests/test_fleet_category.py delete mode 100644 addons/hr_fleet/views/fleet_category_views.xml delete mode 100644 addons/hr_fleet/wizard/fleet_convert_wizard.py delete mode 100644 addons/hr_fleet/wizard/fleet_convert_wizard_views.xml diff --git a/addons/fleet/__manifest__.py b/addons/fleet/__manifest__.py index 53ec36c0c90..3f52117fafa 100644 --- a/addons/fleet/__manifest__.py +++ b/addons/fleet/__manifest__.py @@ -35,8 +35,6 @@ Main Features 'views/fleet_vehicle_views.xml', 'views/fleet_vehicle_cost_views.xml', 'views/fleet_board_view.xml', - 'views/fleet_category_views.xml', - 'views/fleet_category_tag_views.xml', 'views/mail_activity_views.xml', 'views/res_config_settings_views.xml', 'data/fleet_cars_data.xml', diff --git a/addons/fleet/data/fleet_data.xml b/addons/fleet/data/fleet_data.xml index 0b0a05141cc..a7d52b59b88 100644 --- a/addons/fleet/data/fleet_data.xml +++ b/addons/fleet/data/fleet_data.xml @@ -1,24 +1,6 @@ - - Internal - - - - - External - - - - - My Fleet - My Fleet - - - - - Fleet: Generate contracts costs based on costs frequency diff --git a/addons/fleet/data/fleet_demo.xml b/addons/fleet/data/fleet_demo.xml index 752d7045efc..df6db89ed51 100644 --- a/addons/fleet/data/fleet_demo.xml +++ b/addons/fleet/data/fleet_demo.xml @@ -444,7 +444,6 @@ Grand-Rosiere 5 - kilometers @@ -460,7 +459,6 @@ Grand-Rosiere 5 - kilometers @@ -476,7 +474,6 @@ Grand-Rosiere 3 - kilometers @@ -492,7 +489,6 @@ Grand-Rosiere 3 - kilometers @@ -508,7 +504,6 @@ Grand-Rosiere 5 - kilometers diff --git a/addons/fleet/models/__init__.py b/addons/fleet/models/__init__.py index 165cfe1bc5e..d20eb92da38 100644 --- a/addons/fleet/models/__init__.py +++ b/addons/fleet/models/__init__.py @@ -2,8 +2,6 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import fleet_service_type -from . import fleet_category -from . import fleet_category_tag from . import fleet_vehicle from . import fleet_vehicle_assignation_log from . import fleet_vehicle_log_contract diff --git a/addons/fleet/models/fleet_category.py b/addons/fleet/models/fleet_category.py deleted file mode 100644 index 31cbe8ff17a..00000000000 --- a/addons/fleet/models/fleet_category.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding:utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import _, api, fields, models - -class FleetCategory(models.Model): - _name = 'fleet.category' - _description = 'Vehicle Fleet' - - def _get_default_favorite_user_ids(self): - return [(6, 0, [self.env.uid])] - - name = fields.Char() - active = fields.Boolean(default=True) - tag_ids = fields.Many2many('fleet.category.tag', string='Tags') - description = fields.Text() - manager_id = fields.Many2one( - 'res.users', string='Fleet Manager', - default=lambda self: self.env.user, - domain=lambda self: [('groups_id', 'in', self.env.ref('fleet.fleet_group_manager').id)], - ) - - company_id = fields.Many2one( - 'res.company', string='Company', - default=lambda self: self.env.company, - ) - color = fields.Integer() - - vehicle_ids = fields.One2many('fleet.vehicle', 'fleet_id', string='Vehicles') - car_count = fields.Integer(compute='_compute_vehicle_counts') - bike_count = fields.Integer(compute='_compute_vehicle_counts') - - favorite_user_ids = fields.Many2many('res.users', default=_get_default_favorite_user_ids) - is_favorite = fields.Boolean( - compute='_compute_is_favorite', inverse='_inverse_is_favorite', - string='Add to favorite', - help='Whether this fleet is in your favorites or not.', - ) - - @api.depends('vehicle_ids') - def _compute_vehicle_counts(self): - for fleet in self: - car_ids = fleet.vehicle_ids.filtered(lambda v: v.model_id.vehicle_type == 'car') - fleet.car_count = len(car_ids) - bike_ids = fleet.vehicle_ids - car_ids - fleet.bike_count = len(bike_ids) - - def _compute_is_favorite(self): - for fleet in self: - fleet.is_favorite = self.env.user in fleet.favorite_user_ids - - def _inverse_is_favorite(self): - # We may not have write access - favorites = not_favorites = self.env['fleet.category'].sudo() - for category in self: - if self.env.user in category.favorite_user_ids: - favorites |= category - else: - not_favorites |= category - - not_favorites.write({'favorite_user_ids': [(4, self.env.uid)]}) - favorites.write({'favorite_user_ids': [(3, self.env.uid)]}) - - def toggle_active(self): - res = super().toggle_active() - archived = self.filtered(lambda c: not c.active) - for category in archived: - category.vehicle_ids.write({ - 'fleet_id': False, - }) - return res - - def action_view_vehicles(self): - self.ensure_one() - return { - 'type': 'ir.actions.act_window', - 'name': _('Fleet Vehicles'), - 'res_model': 'fleet.vehicle', - 'view_mode': 'tree,kanban,form', - 'views': [[False, 'list'], [False, 'kanban'], [False, 'form']], - 'domain': [('fleet_id', '=', self.id)], - 'context': {'default_fleet_id': self.id}, - } - - def write(self, vals): - # directly compute is_favorite to dodge allow write access right - if 'is_favorite' in vals: - vals.pop('is_favorite') - self._fields['is_favorite'].determine_inverse(self) - return super().write(vals) if vals else True diff --git a/addons/fleet/models/fleet_category_tag.py b/addons/fleet/models/fleet_category_tag.py deleted file mode 100644 index 6a269affa9a..00000000000 --- a/addons/fleet/models/fleet_category_tag.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import fields, models - -class FleetCategoryTag(models.Model): - _name = 'fleet.category.tag' - _description = 'Vehicle Fleet Category' - - _sql_constraints = [ - ('unique_name', 'UNIQUE(name)', 'Name must be unique.'), - ] - - name = fields.Char() - color = fields.Integer() diff --git a/addons/fleet/models/fleet_vehicle.py b/addons/fleet/models/fleet_vehicle.py index e808aea6c7e..fb0295a0d1f 100644 --- a/addons/fleet/models/fleet_vehicle.py +++ b/addons/fleet/models/fleet_vehicle.py @@ -29,19 +29,14 @@ class FleetVehicle(models.Model): name = fields.Char(compute="_compute_vehicle_name", store=True) description = fields.Html("Vehicle Description", help="Add a note about this vehicle") active = fields.Boolean('Active', default=True, tracking=True) - fleet_id = fields.Many2one('fleet.category', string='Fleet') manager_id = fields.Many2one( - 'res.users', 'Manager', + 'res.users', 'Fleet Manager', compute='_compute_manager_id', store=True, readonly=False, domain=lambda self: [('groups_id', 'in', self.env.ref('fleet.fleet_group_manager').id)], ) - #Company should always be the same as fleet_id, but since we do have a case where fleet_id is null - # and we want the vehicle to be company bound we need to store it aswell, fleet_id.company_id is not editable company_id = fields.Many2one( 'res.company', 'Company', - compute='_compute_company_id', default=lambda self: self.env.company, - store=True, ) currency_id = fields.Many2one('res.currency', related='company_id.currency_id') country_id = fields.Many2one('res.country', related='company_id.country_id') @@ -50,8 +45,8 @@ class FleetVehicle(models.Model): 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) trailer_hook = fields.Boolean(default=False, string='Trailer Hitch', compute='_compute_model_fields', store=True, readonly=False) - 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, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]") + driver_id = fields.Many2one('res.partner', 'Driver', tracking=True, help='Driver address of the vehicle', copy=False) + future_driver_id = fields.Many2one('res.partner', 'Future Driver', tracking=True, help='Next Driver Address 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') @@ -115,18 +110,6 @@ class FleetVehicle(models.Model): electric_assistance = fields.Boolean(compute='_compute_model_fields', store=True, readonly=False) frame_size = fields.Float() - @api.depends('fleet_id') - def _compute_manager_id(self): - for record in self: - record.manager_id = record.fleet_id.manager_id - - @api.depends('fleet_id') - def _compute_company_id(self): - for record in self: - # Retain company when fleet is unset - if record.fleet_id: - record.company_id = record.fleet_id.company_id - @api.depends('model_id') def _compute_model_fields(self): ''' diff --git a/addons/fleet/models/fleet_vehicle_log_contract.py b/addons/fleet/models/fleet_vehicle_log_contract.py index d9ca28dcfa8..92097729d8b 100644 --- a/addons/fleet/models/fleet_vehicle_log_contract.py +++ b/addons/fleet/models/fleet_vehicle_log_contract.py @@ -35,7 +35,7 @@ class FleetVehicleLogContract(models.Model): help='Date when the coverage of the contract expirates (by default, one year after begin date)') days_left = fields.Integer(compute='_compute_days_left', string='Warning Date') insurer_id = fields.Many2one('res.partner', 'Vendor') - purchaser_id = fields.Many2one(related='vehicle_id.driver_id', string='Current Driver') + purchaser_id = fields.Many2one(related='vehicle_id.driver_id', string='Driver') ins_ref = fields.Char('Reference', size=64, copy=False) state = fields.Selection( [('futur', 'Incoming'), diff --git a/addons/fleet/report/fleet_report.py b/addons/fleet/report/fleet_report.py index 73f57472579..312e8fd3752 100644 --- a/addons/fleet/report/fleet_report.py +++ b/addons/fleet/report/fleet_report.py @@ -12,7 +12,6 @@ class FleetReport(models.Model): _auto = False _order = 'date_start desc' - fleet_id = fields.Many2one('fleet.category', 'Fleet', readonly=True) company_id = fields.Many2one('res.company', 'Company', readonly=True) vehicle_id = fields.Many2one('fleet.vehicle', 'Vehicle', readonly=True) name = fields.Char('Vehicle Name', readonly=True) @@ -32,8 +31,7 @@ class FleetReport(models.Model): WITH service_costs AS ( SELECT ve.id AS vehicle_id, - fl.id as fleet_id, - fl.company_id AS company_id, + ve.company_id AS company_id, ve.name AS name, ve.driver_id AS driver_id, ve.fuel_type AS fuel_type, @@ -46,8 +44,6 @@ WITH service_costs AS ( fleet_vehicle ve JOIN fleet_vehicle_model vem ON vem.id = ve.model_id - JOIN - fleet_category fl ON fl.id = ve.fleet_id CROSS JOIN generate_series(( SELECT min(date) @@ -58,8 +54,7 @@ WITH service_costs AS ( ve.active AND se.active AND se.state != 'cancelled' GROUP BY ve.id, - fl.id, - fl.company_id, + ve.company_id, vem.vehicle_type, ve.name, date_start, @@ -71,8 +66,7 @@ WITH service_costs AS ( contract_costs AS ( SELECT ve.id AS vehicle_id, - fl.id as fleet_id, - fl.company_id AS company_id, + ve.company_id AS company_id, ve.name AS name, ve.driver_id AS driver_id, ve.fuel_type AS fuel_type, @@ -85,8 +79,6 @@ contract_costs AS ( fleet_vehicle ve JOIN fleet_vehicle_model vem ON vem.id = ve.model_id - JOIN - fleet_category fl ON fl.id = ve.fleet_id CROSS JOIN generate_series(( SELECT min(acquisition_date) @@ -110,8 +102,7 @@ contract_costs AS ( ve.active GROUP BY ve.id, - fl.id, - fl.company_id, + ve.company_id, vem.vehicle_type, ve.name, date_start, @@ -122,7 +113,6 @@ contract_costs AS ( ) SELECT vehicle_id AS id, - fleet_id, company_id, vehicle_id, name, @@ -137,7 +127,6 @@ FROM UNION ALL ( SELECT vehicle_id AS id, - fleet_id, company_id, vehicle_id, name, diff --git a/addons/fleet/security/fleet_security.xml b/addons/fleet/security/fleet_security.xml index 25a04672234..9edad23b81a 100644 --- a/addons/fleet/security/fleet_security.xml +++ b/addons/fleet/security/fleet_security.xml @@ -80,11 +80,6 @@ - - Fleet: Multi Company - - ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] - Fleet vehicle: Multi Company diff --git a/addons/fleet/security/ir.model.access.csv b/addons/fleet/security/ir.model.access.csv index 98dbb445222..273322f89e2 100644 --- a/addons/fleet/security/ir.model.access.csv +++ b/addons/fleet/security/ir.model.access.csv @@ -1,6 +1,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink -fleet_category_access_right_user,fleet_category_access_right,model_fleet_category,fleet_group_user,1,0,0,0 -fleet_category_tag_model_acces_right_user,fleet_category_tag_access_right,model_fleet_category_tag,fleet_group_user,1,0,0,0 fleet_vehicle_model_access_right_user,fleet_vehicle_model_access_right,model_fleet_vehicle_model,fleet_group_user,1,0,0,0 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 @@ -10,8 +8,6 @@ fleet_vehicle_access_right_user,fleet_vehicle_access_right,model_fleet_vehicle,f 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 -fleet_category_access_right,fleet_category_access_right,model_fleet_category,fleet_group_manager,1,1,1,1 -fleet_category_tag_model_acces_right,fleet_category_tag_access_right,model_fleet_category_tag,fleet_group_manager,1,1,1,1 fleet_vehicle_model_access_right,fleet_vehicle_model_access_right,model_fleet_vehicle_model,fleet_group_manager,1,1,1,1 fleet_vehicle_tag_access_right,fleet_vehicle_tag_access_right,model_fleet_vehicle_tag,fleet_group_manager,1,1,1,1 fleet_vehicle_state_access_right,fleet_vehicle_state_access_right,model_fleet_vehicle_state,fleet_group_manager,1,1,1,1 diff --git a/addons/fleet/static/src/js/fleet_category_widget.js b/addons/fleet/static/src/js/fleet_category_widget.js deleted file mode 100644 index 2bb7ea02aa5..00000000000 --- a/addons/fleet/static/src/js/fleet_category_widget.js +++ /dev/null @@ -1,37 +0,0 @@ -odoo.define('fleet.many2one_fleet_category', function (require) { -"use strict;" - -const relationalFields = require('web.relational_fields'); -const FieldMany2One = relationalFields.FieldMany2One; -const FieldRegistry = require('web.field_registry'); - -const FieldMany2OneFleetCategory = FieldMany2One.extend({ - /** - * Opens the list view on the vehicles in the fleet instead of the form view - * - * @param {*} event - * @private - */ - _onClick: function (event) { - var self = this; - if (this.mode === 'readonly') { - event.preventDefault(); - if (this.noOpen) { - this._super(...arguments); - } else { - event.stopPropagation(); - this._rpc({ - model: 'fleet.category', - method: 'action_view_vehicles', - args: [[this.value.res_id]], - }).then(function (action) { - self.trigger_up('do_action', {action: action}); - }); - } - } - } -}) - -FieldRegistry.add('many2one_fleet_category', FieldMany2OneFleetCategory); -return FieldMany2OneFleetCategory; -}); diff --git a/addons/fleet/static/src/js/fleet_kanban.js b/addons/fleet/static/src/js/fleet_kanban.js index ce0db37553f..e731146a26c 100644 --- a/addons/fleet/static/src/js/fleet_kanban.js +++ b/addons/fleet/static/src/js/fleet_kanban.js @@ -10,9 +10,7 @@ odoo.define('fleet.fleet_kanban', function (require) { * @private */ _openRecord() { - if (this.modelName === 'fleet.category' && this.$(".oe_kanban_fleet_vehicle").length) { - this.$(".oe_kanban_fleet_vehicle").first().click(); - } else if (this.modelName === 'fleet.vehicle.model.brand' && this.$(".oe_kanban_fleet_model").length) { + if (this.modelName === 'fleet.vehicle.model.brand' && this.$(".oe_kanban_fleet_model").length) { this.$('.oe_kanban_fleet_model').first().click(); } else { this._super.apply(this, arguments); diff --git a/addons/fleet/static/src/scss/fleet.scss b/addons/fleet/static/src/scss/fleet.scss deleted file mode 100644 index 7c744829520..00000000000 --- a/addons/fleet/static/src/scss/fleet.scss +++ /dev/null @@ -1,9 +0,0 @@ -.o_fleet_category_kanban { - .o_kanban_fleet_category_footer { - z-index: 0; - - .o_fleet_avatar_user { - margin-right: -10px - } - } -} diff --git a/addons/fleet/tests/test_access_rights.py b/addons/fleet/tests/test_access_rights.py index b8b32def8e2..23b7c808997 100644 --- a/addons/fleet/tests/test_access_rights.py +++ b/addons/fleet/tests/test_access_rights.py @@ -8,10 +8,6 @@ class TestFleet(common.TransactionCase): def test_manager_create_vehicle(self): manager = new_test_user(self.env, "test fleet manager", groups="fleet.fleet_group_manager,base.group_partner_manager") user = new_test_user(self.env, "test base user", groups="base.group_user") - fleet = self.env['fleet.category'].with_user(manager).create({ - 'name': 'Test Fleet', - 'description': 'Testing Fleet', - }) brand = self.env["fleet.vehicle.model.brand"].create({ "name": "Audi", }) @@ -22,6 +18,5 @@ class TestFleet(common.TransactionCase): self.env["fleet.vehicle"].with_user(manager).create({ "model_id": model.id, "driver_id": user.partner_id.id, - "fleet_id": fleet.id, "plan_to_change_car": False }) diff --git a/addons/fleet/views/fleet_board_view.xml b/addons/fleet/views/fleet_board_view.xml index 752468fbd0a..8fdd22a5744 100644 --- a/addons/fleet/views/fleet_board_view.xml +++ b/addons/fleet/views/fleet_board_view.xml @@ -8,7 +8,6 @@ - diff --git a/addons/fleet/views/fleet_category_tag_views.xml b/addons/fleet/views/fleet_category_tag_views.xml deleted file mode 100644 index c5acfcdd12d..00000000000 --- a/addons/fleet/views/fleet_category_tag_views.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - Fleet Tags - fleet.category.tag - tree - - - - fleet.category.tag.view.form - fleet.category.tag - -
- -

- -
-
-
-
- - - fleet.category.tag.view.tree - fleet.category.tag - - - - - - - - - -
diff --git a/addons/fleet/views/fleet_category_views.xml b/addons/fleet/views/fleet_category_views.xml deleted file mode 100644 index 63ea2c2430e..00000000000 --- a/addons/fleet/views/fleet_category_views.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - Fleets - fleet.category - kanban,form - {'search_default_my_favorites': 1} - -

- Create a new fleet -

- Manage multiple fleets! -

-
-
- - - - - fleet.category.view.form - fleet.category - -
- - -

- - - - - - - - - - - -
-
-
-
- - - fleet.category.view.kanban - fleet.category - - - - - - - - - - - + @@ -159,7 +158,7 @@ - + @@ -174,7 +173,6 @@ - @@ -193,7 +191,6 @@ - @@ -335,7 +332,7 @@
- @@ -536,7 +533,7 @@ - + diff --git a/addons/hr/__manifest__.py b/addons/hr/__manifest__.py index 7a34fc83f59..48df0416c0d 100644 --- a/addons/hr/__manifest__.py +++ b/addons/hr/__manifest__.py @@ -39,6 +39,7 @@ 'views/res_config_settings_views.xml', 'views/mail_channel_views.xml', 'views/res_users.xml', + 'views/res_partner_views.xml', 'data/hr_data.xml', ], 'demo': [ diff --git a/addons/hr/models/res_partner.py b/addons/hr/models/res_partner.py index e51f0069dd7..b0329927416 100644 --- a/addons/hr/models/res_partner.py +++ b/addons/hr/models/res_partner.py @@ -1,14 +1,18 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import models +from odoo import fields, models, _ from odoo.exceptions import AccessError class Partner(models.Model): - _inherit = ['res.partner'] + employee_ids = fields.One2many( + 'hr.employee', 'address_home_id', string='Employees', groups="hr.group_hr_user", + help="Related employees based on their private address") + employees_count = fields.Integer(compute='_compute_employees_count', groups="hr.group_hr_user") + def name_get(self): """ Override to allow an employee to see its private address in his profile. This avoids to relax access rules on `res.parter` and to add an `ir.rule`. @@ -21,3 +25,17 @@ class Partner(models.Model): if len(self) == 1 and self in self.env.user.employee_ids.mapped('address_home_id'): return super(Partner, self.sudo()).name_get() raise e + + def _compute_employees_count(self): + for partner in self: + partner.employees_count = len(partner.employee_ids) + + def action_open_employees(self): + self.ensure_one() + return { + 'name': _('Related Employees'), + 'type': 'ir.actions.act_window', + 'res_model': 'hr.employee', + 'view_mode': 'kanban,tree,form', + 'domain': [('id', 'in', self.employee_ids.ids)], + } diff --git a/addons/hr/views/res_partner_views.xml b/addons/hr/views/res_partner_views.xml new file mode 100644 index 00000000000..cf8062b32c2 --- /dev/null +++ b/addons/hr/views/res_partner_views.xml @@ -0,0 +1,18 @@ + + + + res.partner.view.form.inherit.hr + res.partner + + +
+ +
+
+
+
diff --git a/addons/hr_fleet/__manifest__.py b/addons/hr_fleet/__manifest__.py index 39a945f7abd..32dddcd8052 100644 --- a/addons/hr_fleet/__manifest__.py +++ b/addons/hr_fleet/__manifest__.py @@ -8,15 +8,12 @@ 'description': "", 'depends': ['hr', 'fleet'], 'data': [ - 'data/hr_fleet_data.xml', 'security/ir.model.access.csv', 'security/hr_fleet_security.xml', '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', diff --git a/addons/hr_fleet/data/hr_fleet_data.xml b/addons/hr_fleet/data/hr_fleet_data.xml deleted file mode 100644 index cc36e514a44..00000000000 --- a/addons/hr_fleet/data/hr_fleet_data.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/addons/hr_fleet/models/__init__.py b/addons/hr_fleet/models/__init__.py index bc9700e0568..69700e79eb1 100644 --- a/addons/hr_fleet/models/__init__.py +++ b/addons/hr_fleet/models/__init__.py @@ -4,7 +4,6 @@ from . import employee from . import res_users from . import fleet_vehicle_assignation_log -from . import fleet_category from . import fleet_vehicle from . import fleet_vehicle_log_contract from . import fleet_vehicle_log_services diff --git a/addons/hr_fleet/models/employee.py b/addons/hr_fleet/models/employee.py index b813bd856c3..c72d97eea06 100644 --- a/addons/hr_fleet/models/employee.py +++ b/addons/hr_fleet/models/employee.py @@ -46,7 +46,6 @@ class Employee(models.Model): no_address = self.filtered(lambda r: not r.address_home_id) car_ids = self.env['fleet.vehicle'].sudo().search([ ('driver_employee_id', 'in', no_address.ids), - ('fleet_id.internal', '=', True), ]) # Prevent from removing employee address when linked to a car if car_ids: @@ -60,7 +59,6 @@ class Employee(models.Model): car_ids = self.env['fleet.vehicle'].sudo().search([ ('driver_employee_id', 'in', self.ids), ('driver_id', 'in', self.mapped('address_home_id').ids), - ('fleet_id.internal', '=', True), ]) if car_ids: car_ids.write({'driver_id': vals['address_home_id']}) diff --git a/addons/hr_fleet/models/fleet_category.py b/addons/hr_fleet/models/fleet_category.py deleted file mode 100644 index b49265f8d7b..00000000000 --- a/addons/hr_fleet/models/fleet_category.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding:utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import fields, models - -class FleetCategory(models.Model): - _inherit = 'fleet.category' - - internal = fields.Boolean(default=True) - - def action_view_vehicles(self): - res = super().action_view_vehicles() - res['context']['internal'] = self.internal - return res - - def write(self, vals): - res = super().write(vals) - if 'internal' in vals and not vals['internal']: - self.vehicle_ids.write({ - 'driver_employee_id': False, - 'future_driver_employee_id': False, - }) - return res diff --git a/addons/hr_fleet/models/fleet_vehicle.py b/addons/hr_fleet/models/fleet_vehicle.py index e9884fd35fd..e35f6fc54c9 100644 --- a/addons/hr_fleet/models/fleet_vehicle.py +++ b/addons/hr_fleet/models/fleet_vehicle.py @@ -10,15 +10,37 @@ class FleetVehicle(models.Model): mobility_card = fields.Char(compute='_compute_mobility_card', store=True) driver_employee_id = fields.Many2one( 'hr.employee', 'Driver (Employee)', + compute='_compute_driver_employee_id', store=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", tracking=True, ) + driver_employee_name = fields.Char(related="driver_employee_id.name") future_driver_employee_id = fields.Many2one( 'hr.employee', 'Future Driver (Employee)', + compute='_compute_future_driver_employee_id', store=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", tracking=True, ) - fleet_is_internal = fields.Boolean(related='fleet_id.internal') + + @api.depends('driver_id') + def _compute_driver_employee_id(self): + for vehicle in self: + if vehicle.driver_id: + vehicle.driver_employee_id = self.env['hr.employee'].search([ + ('address_home_id', '=', vehicle.driver_id.id), + ], limit=1) + else: + vehicle.driver_employee_id = False + + @api.depends('future_driver_id') + def _compute_future_driver_employee_id(self): + for vehicle in self: + if vehicle.future_driver_id: + vehicle.future_driver_employee_id = self.env['hr.employee'].search([ + ('address_home_id', '=', vehicle.future_driver_id.id), + ], limit=1) + else: + vehicle.future_driver_employee_id = False @api.depends('driver_id') def _compute_mobility_card(self): @@ -30,57 +52,14 @@ class FleetVehicle(models.Model): employee = employee.search([('user_id.partner_id', '=', vehicle.driver_id.id)], limit=1) vehicle.mobility_card = employee.mobility_card - @api.constrains('driver_employee_id', 'future_driver_employee_id') - def _constrain_employee_has_address(self): - wrongs = self.filtered(lambda v: ( - (v.driver_employee_id and not v.driver_employee_id.address_home_id) or - (v.future_driver_employee_id and not v.future_driver_employee_id.address_home_id) - )) - if wrongs: - raise ValidationError(_( - 'The following vehicles have invalid employees: %s\n' - 'Please assign addresses to the employees you want to assign a car to.' - ) % wrongs.mapped('name')) - - def _get_driver_history_data(self, vals): - res = super()._get_driver_history_data(vals) - if self.fleet_is_internal and 'driver_employee_id' in vals: - res['driver_employee_id'] = vals['driver_employee_id'] - return res - - def action_accept_driver_change(self): - super(FleetVehicle, self.filtered(lambda v: not v.fleet_id.internal)).action_accept_driver_change() - #Unfortunate code duplication to avoid creating unwanted vehicle logs - internals = self.filtered(lambda v: v.fleet_id.internal) - for vehicle in internals: - if vehicle.vehicle_type == 'bike': - vehicle.future_driver_id.sudo().write({'plan_to_change_bike': False}) - if vehicle.vehicle_type == 'car': - vehicle.future_driver_id.sudo().write({'plan_to_change_car': False}) - vehicle.driver_employee_id = vehicle.future_driver_employee_id - vehicle.future_driver_employee_id = False - def _update_create_write_vals(self, vals): - # wbr NOTE: can't use inverse without breaking history - # We do not want to link vehicles to employee when their fleet is not internal - # but since this method is called within the write function we are not guaranteed - # to always have one record, check if all fleet are internal - # This is an edge case, it is better not to link an employee to a car when they should than to link - # against cars when they shouldn't, usually you will not update multiple vehicles from many different fleets - is_internal = len(self) > 0 and len(self.filtered(lambda v: not v.fleet_id.internal)) == 0 - # Use fleet_id in vals if it gets updated - if 'fleet_id' in vals: - fleet_id = self.env['fleet.category'].sudo().browse(vals['fleet_id']) - is_internal = fleet_id.internal - - # Compute partner from employee if 'driver_employee_id' in vals: partner = False if vals['driver_employee_id']: employee = self.env['hr.employee'].sudo().browse(vals['driver_employee_id']) partner = employee.address_home_id.id vals['driver_id'] = partner - elif 'driver_id' in vals and is_internal: + elif 'driver_id' in vals: # Reverse the process if we can find a single employee employee = False if vals['driver_id']: @@ -99,7 +78,7 @@ class FleetVehicle(models.Model): employee = self.env['hr.employee'].sudo().browse(vals['future_driver_employee_id']) partner = employee.address_home_id.id vals['future_driver_id'] = partner - elif 'future_driver_id' in vals and is_internal: + elif 'future_driver_id' in vals: # Reverse the process if we can find a single employee employee = False if vals['future_driver_id']: @@ -111,44 +90,6 @@ class FleetVehicle(models.Model): employee = employee_ids[0].id vals['future_driver_employee_id'] = employee - # Cases when fleet_id changes but driver_id and future_driver_id do not - # 1: not internal -> remove eployee related data - # 2: internal -> compute employee for each vehicle in the case no employee can be computed for the address - # we remove it's current driver_id - if 'fleet_id' in vals: - if not is_internal: - vals['driver_employee_id'] = False - vals['future_driver_employee_id'] = False - else: - # Prefetch all employees we will need - employees = self.env['hr.employee'].search([ - ('address_home_id', 'in', (self.driver_id | self.future_driver_id).ids), - ]) - for vehicle in self: - if 'driver_employee_id' not in vals: - driver_id = vals['driver_id'] if 'driver_id' in vals else vehicle.driver_id.id - driver_employee_id = employees.filtered(lambda e: e.address_home_id.id == driver_id) - if len(driver_employee_id) == 1: - vehicle.driver_employee_id = driver_employee_id - else: - vehicle.write({ - 'driver_id': False, - 'driver_employee_id': False, - }) - if 'future_driver_employee_id' not in vals: - future_driver_id = vals['future_driver_id'] if 'future_driver_id' in vals else \ - vehicle.future_driver_id.id - future_driver_employee_id = employees.filtered(lambda e: ( - e.address_home_id.id == future_driver_id - )) - if len(future_driver_employee_id) == 1: - vehicle.future_driver_employee_id = future_driver_employee_id - else: - vehicle.write({ - 'future_driver_id': False, - 'future_driver_employee_id': False, - }) - @api.model def create(self, vals): self._update_create_write_vals(vals) @@ -165,3 +106,13 @@ class FleetVehicle(models.Model): partners_to_unsubscribe.append(employee.user_id.partner_id.id) vehicle.message_unsubscribe(partner_ids=partners_to_unsubscribe) return super().write(vals) + + def action_open_employee(self): + self.ensure_one() + return { + 'name': _('Related Employee'), + 'type': 'ir.actions.act_window', + 'res_model': 'hr.employee', + 'view_mode': 'form', + 'res_id': self.driver_employee_id.id, + } diff --git a/addons/hr_fleet/models/fleet_vehicle_assignation_log.py b/addons/hr_fleet/models/fleet_vehicle_assignation_log.py index c21836ef42d..343d24dcccf 100644 --- a/addons/hr_fleet/models/fleet_vehicle_assignation_log.py +++ b/addons/hr_fleet/models/fleet_vehicle_assignation_log.py @@ -7,8 +7,7 @@ from odoo import fields, models class FleetVehicleAssignationLog(models.Model): _inherit = 'fleet.vehicle.assignation.log' - driver_employee_id = fields.Many2one('hr.employee', 'Driver (Employee)') - fleet_is_internal = fields.Boolean(related='vehicle_id.fleet_is_internal') + driver_employee_id = fields.Many2one(related="vehicle_id.driver_employee_id", string='Driver (Employee)') attachment_number = fields.Integer('Number of Attachments', compute='_compute_attachment_number') def _compute_attachment_number(self): diff --git a/addons/hr_fleet/models/fleet_vehicle_log_contract.py b/addons/hr_fleet/models/fleet_vehicle_log_contract.py index 6b947cbc3ff..987fb62277a 100644 --- a/addons/hr_fleet/models/fleet_vehicle_log_contract.py +++ b/addons/hr_fleet/models/fleet_vehicle_log_contract.py @@ -8,6 +8,5 @@ class FleetVehicleLogContract(models.Model): purchaser_employee_id = fields.Many2one( related='vehicle_id.driver_employee_id', - string='Current Driver (Employee)', + string='Driver (Employee)', ) - fleet_is_internal = fields.Boolean(related='vehicle_id.fleet_is_internal') diff --git a/addons/hr_fleet/models/fleet_vehicle_log_services.py b/addons/hr_fleet/models/fleet_vehicle_log_services.py index 6a79d809b08..6cc1e3b6e3f 100644 --- a/addons/hr_fleet/models/fleet_vehicle_log_services.py +++ b/addons/hr_fleet/models/fleet_vehicle_log_services.py @@ -10,13 +10,12 @@ class FleetVehicleLogServices(models.Model): 'hr.employee', string="Driver (Employee)", compute='_compute_purchaser_employee_id', readonly=False, store=True, ) - fleet_is_internal = fields.Boolean(related='vehicle_id.fleet_is_internal') @api.depends('vehicle_id', 'purchaser_employee_id') def _compute_purchaser_id(self): - internal = self.filtered(lambda r: r.fleet_is_internal) - super(FleetVehicleLogServices, (self - internal))._compute_purchaser_id() - for service in internal: + internals = self.filtered(lambda r: r.purchaser_employee_id) + super(FleetVehicleLogServices, (self - internals))._compute_purchaser_id() + for service in internals: service.purchaser_id = service.purchaser_employee_id.address_home_id @api.depends('vehicle_id') diff --git a/addons/hr_fleet/models/fleet_vehicle_odometer.py b/addons/hr_fleet/models/fleet_vehicle_odometer.py index 41dbee7dbea..474b5ba03f2 100644 --- a/addons/hr_fleet/models/fleet_vehicle_odometer.py +++ b/addons/hr_fleet/models/fleet_vehicle_odometer.py @@ -8,6 +8,6 @@ class FleetVehicleOdometer(models.Model): _inherit = 'fleet.vehicle.odometer' driver_employee_id = fields.Many2one( - related='vehicle_id.driver_employee_id', string='Current Driver (Employee)', + related='vehicle_id.driver_employee_id', string='Driver (Employee)', readonly=True, ) diff --git a/addons/hr_fleet/security/ir.model.access.csv b/addons/hr_fleet/security/ir.model.access.csv index 900b6293ba6..dbaa45b8f0a 100644 --- a/addons/hr_fleet/security/ir.model.access.csv +++ b/addons/hr_fleet/security/ir.model.access.csv @@ -1,4 +1,2 @@ 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_manager,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_manager,1,1,1,1 hr_fleet_vehicle_access_right_hr_officer,hr_fleet_vehicle_access_right_hr_officer,model_fleet_vehicle,hr.group_hr_user,1,0,0,0 diff --git a/addons/hr_fleet/tests/__init__.py b/addons/hr_fleet/tests/__init__.py deleted file mode 100644 index dde410329f5..00000000000 --- a/addons/hr_fleet/tests/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import test_fleet_category diff --git a/addons/hr_fleet/tests/test_fleet_category.py b/addons/hr_fleet/tests/test_fleet_category.py deleted file mode 100644 index 66b4e08943b..00000000000 --- a/addons/hr_fleet/tests/test_fleet_category.py +++ /dev/null @@ -1,146 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo.tests import new_test_user -from odoo.tests.common import tagged, TransactionCase - -@tagged('post_install', '-at_install', 'hr_fleet_categories') -class TestFleetCategory(TransactionCase): - - def setUp(self): - super().setUp() - self.company = self.env['res.company'].create({ - 'name': 'Taxi Dermi', - }) - self.manager = new_test_user(self.env, login='dermi', groups='fleet.fleet_group_manager', company_id=self.company.id) - self.addresses = self.env['res.partner'].create([ - { - 'name': 'Address 1', - 'company_id': self.company.id, - 'type': 'private', - }, - { - 'name': 'Address 2', - 'company_id': self.company.id, - 'type': 'private', - }, - { - 'name': 'Address 3', - 'company_id': self.company.id, - 'type': 'private', - }, - { - 'name': 'Address 4', - 'company_id': self.company.id, - 'type': 'private', - }, - ]) - self.employees = self.env['hr.employee'].create([ - { - 'name': 'Employee 1', - 'company_id': self.company.id, - 'address_home_id': self.addresses[0].id, - }, - { - 'name': 'Employee 2', - 'company_id': self.company.id, - 'address_home_id': self.addresses[1].id, - }, - { - 'name': 'Employee 3', - 'company_id': self.company.id, - 'address_home_id': self.addresses[2].id, - }, - { - 'name': 'Employee 4', - 'company_id': self.company.id, - 'address_home_id': self.addresses[3].id, - }, - ]) - - self.brand = self.env['fleet.vehicle.model.brand'].create({ - 'name': 'Test Brand', - }) - self.model = self.env['fleet.vehicle.model'].create({ - 'name': 'Test Model', - 'brand_id': self.brand.id, - }) - - self.external_fleet = self.env['fleet.category'].create({ - 'name': 'External Fleet', - 'company_id': self.company.id, - 'internal': False, - }) - self.internal_fleet = self.env['fleet.category'].create({ - 'name': 'Internal Fleet', - 'company_id': self.company.id, - 'internal': True, - }) - - vehicle_create_vals = [] - for fleet in (self.external_fleet | self.internal_fleet): - for i in range(4): - vehicle_create_vals.append({ - 'name': 'Test Car ' + str(i) + ' ' + fleet.name, - 'fleet_id': fleet.id, - 'company_id': self.company.id, - 'model_id': self.model.id, - }) - self.env['fleet.vehicle'].create(vehicle_create_vals) - - def test_fleet_conversion(self): - #Assign employee addresses to the fleet vehicle - for i in range(4): - self.external_fleet.vehicle_ids[i].driver_id = self.employees[i].address_home_id - wizard = self.env['hr.fleet.convert.wizard'].with_context(active_id=self.external_fleet.id).new({}) - - #Wizard should have a line per vehicle in the fleet - self.assertEqual(len(self.external_fleet.vehicle_ids), len(wizard.line_ids)) - #All lines should be considered valid - self.assertFalse(any(wizard.line_ids.filtered('invalid_driver'))) - - wizard.action_validate() - - #Fleet should be internal now - self.assertTrue(self.external_fleet.internal) - #All vehicles should be linked to employees - self.assertFalse(self.external_fleet.vehicle_ids.filtered(lambda v: not v.driver_employee_id)) - - def test_individual_fleet_change(self): - vehicle_id = self.external_fleet.vehicle_ids[0] - vehicle_id.driver_id = self.addresses[0] - #Also test future_driver - vehicle_id.future_driver_id = self.addresses[1] - - #Manually change the fleet of the vehicle, it should compute the employee from the driver - vehicle_id.fleet_id = self.internal_fleet - self.assertEqual(vehicle_id.driver_employee_id, self.employees[0]) - self.assertEqual(vehicle_id.future_driver_employee_id, self.employees[1]) - - #Now change it back, driver should be kept but not the employee - vehicle_id.fleet_id = self.external_fleet - self.assertFalse(vehicle_id.driver_employee_id) - self.assertFalse(vehicle_id.future_driver_employee_id) - - def test_partial_conversion(self): - #Assign employee addresses to the fleet vehicle - for i in range(4): - self.external_fleet.vehicle_ids[i].driver_id = self.employees[i].address_home_id - #Remove address from employee, making the vehicle not be able to match the employee - self.employees[2].address_home_id = False - self.external_fleet.vehicle_ids[3].driver_id = False - - wizard = self.env['hr.fleet.convert.wizard'].with_context(active_id=self.external_fleet.id).new({}) - - #Wizard should have a line per vehicle in the fleet except those without drivers - self.assertEqual(len(self.external_fleet.vehicle_ids) - 1, len(wizard.line_ids)) - #There should be 2 valid and 1 invalid lines - self.assertEqual(1, len(wizard.line_ids.filtered('invalid_driver'))) - self.assertEqual(2, len(wizard.line_ids.filtered(lambda l: not l.invalid_driver))) - - wizard.action_validate() - #Fleet should be internal now - self.assertTrue(self.external_fleet.internal) - #There should be 2 vehicles with a driver and 2 without any - self.assertEqual(2, len(self.external_fleet.vehicle_ids.filtered('driver_id'))) - self.assertEqual(2, len(self.external_fleet.vehicle_ids.filtered(lambda l: not l.driver_id))) diff --git a/addons/hr_fleet/views/fleet_category_views.xml b/addons/hr_fleet/views/fleet_category_views.xml deleted file mode 100644 index 70268efd534..00000000000 --- a/addons/hr_fleet/views/fleet_category_views.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - fleet.category.view.form.inherit.hr.fleet - fleet.category - - - - - - - - - - fleet.category.view.search.inherit.hr.fleet - fleet.category - - - - - - - - diff --git a/addons/hr_fleet/views/fleet_vehicle_cost_views.xml b/addons/hr_fleet/views/fleet_vehicle_cost_views.xml index 7d3b76b98d6..537ae87a2f6 100644 --- a/addons/hr_fleet/views/fleet_vehicle_cost_views.xml +++ b/addons/hr_fleet/views/fleet_vehicle_cost_views.xml @@ -6,12 +6,7 @@ - - - - - {'invisible': [('fleet_is_internal', '=', True)]} +
@@ -22,9 +17,7 @@ - - + @@ -47,12 +40,7 @@ - - - - - {'invisible': [('fleet_is_internal', '=', True)]} + @@ -63,9 +51,7 @@ - - + @@ -75,15 +61,8 @@ fleet.vehicle.log.services - - - - - - - {'invisible': [('fleet_is_internal', '=', True)]} + diff --git a/addons/hr_fleet/views/fleet_vehicle_views.xml b/addons/hr_fleet/views/fleet_vehicle_views.xml index 67abba6bb32..fd2d36aaf9e 100644 --- a/addons/hr_fleet/views/fleet_vehicle_views.xml +++ b/addons/hr_fleet/views/fleet_vehicle_views.xml @@ -1,5 +1,16 @@ + + fleet.vehicle.odometer.view.tree.inherit.hr.fleet + fleet.vehicle.odometer + + + + + + + + fleet.vehicle.assignation.log.view.tree.inherit.hr.fleet fleet.vehicle.assignation.log @@ -10,9 +21,7 @@ + diff --git a/addons/hr_fleet/wizard/__init__.py b/addons/hr_fleet/wizard/__init__.py index f944e31bf62..ea671ff9df8 100644 --- a/addons/hr_fleet/wizard/__init__.py +++ b/addons/hr_fleet/wizard/__init__.py @@ -1,5 +1,4 @@ # -*- 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 diff --git a/addons/hr_fleet/wizard/fleet_convert_wizard.py b/addons/hr_fleet/wizard/fleet_convert_wizard.py deleted file mode 100644 index c776c6650e0..00000000000 --- a/addons/hr_fleet/wizard/fleet_convert_wizard.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- 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}) diff --git a/addons/hr_fleet/wizard/fleet_convert_wizard_views.xml b/addons/hr_fleet/wizard/fleet_convert_wizard_views.xml deleted file mode 100644 index 1467a202ab1..00000000000 --- a/addons/hr_fleet/wizard/fleet_convert_wizard_views.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - hr.fleet.convert.wizard.view.form - hr.fleet.convert.wizard - -
- - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - Convert Fleet - hr.fleet.convert.wizard - form - new - - form - - -