From 3531075abef6f0e597604f4eb41bdc897e2b22df Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Tue, 21 Jul 2026 09:24:57 +0200 Subject: [PATCH] [MIG] fleet --- docsource/modules180-190.rst | 2 +- .../scripts/fleet/19.0.0.1/end-migration.py | 37 +++++ .../scripts/fleet/19.0.0.1/post-migration.py | 21 +++ .../scripts/fleet/19.0.0.1/pre-migration.py | 134 ++++++++++++++++++ .../fleet/19.0.0.1/upgrade_analysis_work.txt | 74 ++++++++++ 5 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 openupgrade_scripts/scripts/fleet/19.0.0.1/end-migration.py create mode 100644 openupgrade_scripts/scripts/fleet/19.0.0.1/post-migration.py create mode 100644 openupgrade_scripts/scripts/fleet/19.0.0.1/pre-migration.py create mode 100644 openupgrade_scripts/scripts/fleet/19.0.0.1/upgrade_analysis_work.txt diff --git a/docsource/modules180-190.rst b/docsource/modules180-190.rst index 1630e9b5e529..8b33bf5c41ea 100644 --- a/docsource/modules180-190.rst +++ b/docsource/modules180-190.rst @@ -150,7 +150,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | event_sms | |No DB layout changes. | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| fleet | | | +| fleet |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ | gamification |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ diff --git a/openupgrade_scripts/scripts/fleet/19.0.0.1/end-migration.py b/openupgrade_scripts/scripts/fleet/19.0.0.1/end-migration.py new file mode 100644 index 000000000000..d44b06186925 --- /dev/null +++ b/openupgrade_scripts/scripts/fleet/19.0.0.1/end-migration.py @@ -0,0 +1,37 @@ +# Copyright 2026 Hunki Enterprises BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + + +def model_year(env): + """ + fleet.vehicle{,.model}#model_year has been changed to a selection field. + As the ORM chokes on values not in the selection, null those values, but + copy the original values first + """ + openupgrade.copy_columns( + env.cr, + { + "fleet_vehicle": [ + ("model_year", None, None), + ], + "fleet_vehicle_model": [ + ("model_year", None, None), + ], + }, + ) + selection_values = tuple( + value for value, _display in env["fleet.vehicle"]._get_year_selection() + ) + for table in ("fleet_vehicle", "fleet_vehicle_model"): + openupgrade.logged_query( + env.cr, + f"UPDATE {table} SET model_year=NULL WHERE model_year NOT IN %s", + (selection_values,), + ) + + +@openupgrade.migrate() +def migrate(env, version): + model_year(env) diff --git a/openupgrade_scripts/scripts/fleet/19.0.0.1/post-migration.py b/openupgrade_scripts/scripts/fleet/19.0.0.1/post-migration.py new file mode 100644 index 000000000000..30b1f698fd2a --- /dev/null +++ b/openupgrade_scripts/scripts/fleet/19.0.0.1/post-migration.py @@ -0,0 +1,21 @@ +# Copyright 2026 Hunki Enterprises BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + +deleted_xmlids = [ + "fleet.fleet_rule_contract_visibility_user", + "fleet.fleet_rule_odometer_visibility_user", + "fleet.fleet_rule_service_visibility_user", + "fleet.fleet_rule_vehicle_visibility_user", +] + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.load_data( + env, + "fleet", + "19.0.0.1/noupdate_changes.xml", + ) + openupgrade.delete_records_safely_by_xml_id(env, deleted_xmlids) diff --git a/openupgrade_scripts/scripts/fleet/19.0.0.1/pre-migration.py b/openupgrade_scripts/scripts/fleet/19.0.0.1/pre-migration.py new file mode 100644 index 000000000000..00e424ec58e3 --- /dev/null +++ b/openupgrade_scripts/scripts/fleet/19.0.0.1/pre-migration.py @@ -0,0 +1,134 @@ +# Copyright 2026 Hunki Enterprises BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + + +def fleet_vehicle(env): + """ + Handle new fields in fleet.vehicle: + - create range_unit with default km + - create co2_emission_unit and fill via SQL + - rename first_contract_date to contract_date_start + """ + openupgrade.add_columns( + env, + [ + ( + "fleet.vehicle", + "range_unit", + "selection", + "km", + "fleet_vehicle", + ), + ( + "fleet.vehicle", + "co2_emission_unit", + "selection", + "g/km", + "fleet_vehicle", + ), + ], + ) + openupgrade.rename_fields( + env, + [ + ( + "fleet.vehicle", + "fleet_vehicle", + "first_contract_date", + "contract_date_start", + ) + ], + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE fleet_vehicle + SET co2_emission_unit='g/mi' + WHERE + range_unit <> 'km' + AND co2_emission_unit IS NULL + """, + ) + + +def fleet_vehicle_log_services(env): + """ + Add new stored related columns and fill with SQL + """ + openupgrade.add_columns( + env, + [ + ( + "fleet.vehicle.log.services", + "brand_id", + "many2one", + None, + "fleet_vehicle_log_services", + ), + ( + "fleet.vehicle.log.services", + "model_id", + "many2one", + None, + "fleet_vehicle_log_services", + ), + ], + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE + fleet_vehicle_log_services + SET + model_id=fleet_vehicle.model_id, + brand_id=fleet_vehicle_model.brand_id + FROM + fleet_vehicle + LEFT JOIN + fleet_vehicle_model + ON fleet_vehicle.model_id=fleet_vehicle_model.id + WHERE + vehicle_id=fleet_vehicle.id + """, + ) + + +def fleet_vehicle_odometer(env): + """ + Add and fill fleet.vehicle.odometer#driver_id column + """ + openupgrade.add_columns( + env, + [ + ( + "fleet.vehicle.odometer", + "driver_id", + "many2one", + None, + "fleet_vehicle_odometer", + ), + ], + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE + fleet_vehicle_odometer + SET + driver_id=fleet_vehicle.driver_id + FROM + fleet_vehicle + WHERE + fleet_vehicle_odometer.vehicle_id=fleet_vehicle.id + AND fleet_vehicle_odometer.driver_id IS NULL + """, + ) + + +@openupgrade.migrate() +def migrate(env, version): + fleet_vehicle(env) + fleet_vehicle_log_services(env) + fleet_vehicle_odometer(env) diff --git a/openupgrade_scripts/scripts/fleet/19.0.0.1/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/fleet/19.0.0.1/upgrade_analysis_work.txt new file mode 100644 index 000000000000..e71083049699 --- /dev/null +++ b/openupgrade_scripts/scripts/fleet/19.0.0.1/upgrade_analysis_work.txt @@ -0,0 +1,74 @@ +---Models in module 'fleet'--- +new model fleet.vehicle.odometer.report [sql_view] +# NOTHING TO DO + +---Fields in module 'fleet'--- +fleet / fleet.vehicle / co2_emission_unit (selection) : NEW required, selection_keys: ['g/km', 'g/mi'], isfunction: function, stored +# DONE: added column and SQL computation in pre-migration + +fleet / fleet.vehicle / contract_date_start (date) : NEW hasdefault: default +fleet / fleet.vehicle / first_contract_date (date) : DEL +# DONE: renamed in pre-migration + +fleet / fleet.vehicle / horsepower (integer) : type is now 'float' ('integer') +# NOTHING TO DO + +fleet / fleet.vehicle / model_year (char) : selection_keys is now 'function' ('False') +fleet / fleet.vehicle / model_year (char) : type is now 'selection' ('char') +# DONE: normalized value in end-migration + +fleet / fleet.vehicle / plan_to_change_bike (boolean) : not related anymore +fleet / fleet.vehicle / plan_to_change_car (boolean) : not related anymore +# NOTHING TO DO: has been stored before + +fleet / fleet.vehicle / power (integer) : type is now 'float' ('integer') +# NOTHING TO DO + +fleet / fleet.vehicle / range_unit (selection) : NEW required, selection_keys: ['km', 'mi'], hasdefault: default +# DONE: added column with default km + +fleet / fleet.vehicle.log.services / brand_id (many2one) : NEW relation: fleet.vehicle.model.brand, isrelated: related, stored +fleet / fleet.vehicle.log.services / model_id (many2one) : NEW relation: fleet.vehicle.model, isrelated: related, stored +# DONE: added in pre-migration and filled with SQL + +fleet / fleet.vehicle.model / drive_type (selection) : NEW selection_keys: ['4wd', 'awd', 'fwd', 'rwd'] +fleet / fleet.vehicle.model / horsepower (integer) : type is now 'float' ('integer') +# NOTHING TO DO + +fleet / fleet.vehicle.model / model_year (integer) : selection_keys is now 'function' ('False') +fleet / fleet.vehicle.model / model_year (integer) : type is now 'selection' ('integer') +# DONE: normalized value in end-migration + +fleet / fleet.vehicle.model / power (integer) : type is now 'float' ('integer') +fleet / fleet.vehicle.model / range_unit (selection) : NEW required, selection_keys: ['km', 'mi'], hasdefault: default +# NOTHING TO DO + +fleet / fleet.vehicle.odometer / driver_id (many2one) : is now stored +fleet / fleet.vehicle.odometer / driver_id (many2one) : not related anymore +# DONE: added column and filled with SQL in pre-migration + +fleet / fleet.vehicle.state / fold (boolean) : NEW +fleet / res.partner / plan_to_change_bike (boolean) : DEL +fleet / res.partner / plan_to_change_car (boolean) : DEL +# NOTHING TO DO + +---XML records in module 'fleet'--- +NEW fleet.vehicle.model.brand: fleet.brand_gmc +NEW ir.actions.act_window: fleet.fleet_vehicle_odometer_reporting_action +NEW ir.model.access: fleet.access_fleet_vehicle_odometer_report_manager +DEL ir.module.category: fleet.module_fleet_category +# NOTHING TO DO + +DEL ir.rule: fleet.fleet_rule_contract_visibility_user (noupdate) +DEL ir.rule: fleet.fleet_rule_odometer_visibility_user (noupdate) +DEL ir.rule: fleet.fleet_rule_service_visibility_user (noupdate) +DEL ir.rule: fleet.fleet_rule_vehicle_visibility_user (noupdate) +# DONE: deleted in post-migration + +NEW ir.ui.menu: fleet.menu_fleet_odometer_reporting_odometer +NEW ir.ui.view: fleet.fleet_vehicle_odometer_report_view_graph +NEW ir.ui.view: fleet.fleet_vehicle_odometer_report_view_search +NEW ir.ui.view: fleet.fleet_vehicle_view_form_quick_create +DEL ir.ui.view: fleet.fleet_vehicle_odometer_view_kanban +NEW res.groups.privilege: fleet.res_groups_privilege_fleet +# NOTHING TO DO