From 2f86ab09d726d6f0f380306361618a9311f865bd Mon Sep 17 00:00:00 2001 From: Don Kendall Date: Wed, 3 Jun 2026 07:46:45 -0400 Subject: [PATCH 1/2] [OU-ADD] fleet/gamification/maintenance/survey: migration + annotations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fleet: rename hr.vehicle first_contract_date->contract_date_start (preserve data; analyzer reports it as DEL+NEW), load noupdate mail.activity.type. - gamification/maintenance/survey: load changed noupdate data. (account_edi_ubl_cii, contacts, base, uom, hr_expense dropped — now migrated upstream by OCA/OpenUpgrade #5685/#5681/#5682/#5675.) --- docsource/modules180-190.rst | 6 +- .../scripts/fleet/19.0.0.1/post-migration.py | 6 ++ .../scripts/fleet/19.0.0.1/pre-migration.py | 10 ++++ .../fleet/19.0.0.1/upgrade_analysis_work.txt | 55 +++++++++++++++++++ .../maintenance/19.0.1.0/post-migration.py | 6 ++ .../19.0.1.0/upgrade_analysis_work.txt | 23 ++++++++ .../scripts/survey/19.0.3.7/post-migration.py | 6 ++ .../survey/19.0.3.7/upgrade_analysis_work.txt | 15 +++++ 8 files changed, 124 insertions(+), 3 deletions(-) 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 create mode 100644 openupgrade_scripts/scripts/maintenance/19.0.1.0/post-migration.py create mode 100644 openupgrade_scripts/scripts/maintenance/19.0.1.0/upgrade_analysis_work.txt create mode 100644 openupgrade_scripts/scripts/survey/19.0.3.7/post-migration.py create mode 100644 openupgrade_scripts/scripts/survey/19.0.3.7/upgrade_analysis_work.txt diff --git a/docsource/modules180-190.rst b/docsource/modules180-190.rst index fd4b86e2175e..aec9550a332c 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 | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -712,7 +712,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | mail_plugin | |No DB layout changes. | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| maintenance | | | +| maintenance |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ | marketing_card | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -1104,7 +1104,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | stock_sms | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| survey | | | +| survey |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ | |new| survey_crm | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ 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..ce5f6fe8e993 --- /dev/null +++ b/openupgrade_scripts/scripts/fleet/19.0.0.1/post-migration.py @@ -0,0 +1,6 @@ +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.load_data(env, "fleet", "19.0.0.1/noupdate_changes.xml") 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..c2d2af109791 --- /dev/null +++ b/openupgrade_scripts/scripts/fleet/19.0.0.1/pre-migration.py @@ -0,0 +1,10 @@ +from openupgradelib import openupgrade + +_renamed_fields = [ + ("fleet.vehicle", "fleet_vehicle", "first_contract_date", "contract_date_start"), +] + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.rename_fields(env, _renamed_fields) 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..7b8a140ba04a --- /dev/null +++ b/openupgrade_scripts/scripts/fleet/19.0.0.1/upgrade_analysis_work.txt @@ -0,0 +1,55 @@ +---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 + +# NOTHING TO DO: computed/stored, recomputed by the ORM + +fleet / fleet.vehicle / contract_date_start (date) : NEW hasdefault: default +fleet / fleet.vehicle / first_contract_date (date) : DEL + +# DONE: rename first_contract_date->contract_date_start in pre-migration + +fleet / fleet.vehicle / horsepower (integer) : type is now 'float' ('integer') +fleet / fleet.vehicle / model_year (char) : selection_keys is now 'function' ('False') +fleet / fleet.vehicle / model_year (char) : type is now 'selection' ('char') +fleet / fleet.vehicle / plan_to_change_bike (boolean) : not related anymore +fleet / fleet.vehicle / plan_to_change_car (boolean) : not related anymore +fleet / fleet.vehicle / power (integer) : type is now 'float' ('integer') +fleet / fleet.vehicle / range_unit (selection) : NEW required, selection_keys: ['km', 'mi'], hasdefault: default +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 +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') +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') +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 +fleet / fleet.vehicle.odometer / driver_id (many2one) : is now stored +fleet / fleet.vehicle.odometer / driver_id (many2one) : not related anymore +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 +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) +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 diff --git a/openupgrade_scripts/scripts/maintenance/19.0.1.0/post-migration.py b/openupgrade_scripts/scripts/maintenance/19.0.1.0/post-migration.py new file mode 100644 index 000000000000..14cf23ce9982 --- /dev/null +++ b/openupgrade_scripts/scripts/maintenance/19.0.1.0/post-migration.py @@ -0,0 +1,6 @@ +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.load_data(env, "maintenance", "19.0.1.0/noupdate_changes.xml") diff --git a/openupgrade_scripts/scripts/maintenance/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/maintenance/19.0.1.0/upgrade_analysis_work.txt new file mode 100644 index 000000000000..753b3cb8f15f --- /dev/null +++ b/openupgrade_scripts/scripts/maintenance/19.0.1.0/upgrade_analysis_work.txt @@ -0,0 +1,23 @@ +---Models in module 'maintenance'--- + + +---Fields in module 'maintenance'--- +maintenance / maintenance.equipment / location (char) : DEL +maintenance / maintenance.equipment / match_serial (boolean) : module is now 'stock_maintenance' ('maintenance') +maintenance / maintenance.equipment.category / _inherits : DEL _inherits: {'mail.alias': 'alias_id'}, stored: False +maintenance / maintenance.equipment.category / alias_id (many2one) : DEL relation: mail.alias, required +maintenance / maintenance.equipment.category / message_follower_ids (one2many): DEL relation: mail.followers +maintenance / maintenance.equipment.category / message_ids (one2many) : DEL relation: mail.message +maintenance / maintenance.request / duration (float) : now a function +maintenance / maintenance.request / schedule_end (datetime) : NEW hasdefault: compute +maintenance / maintenance.team / _inherits : NEW _inherits: {'mail.alias': 'alias_id'}, stored: False +maintenance / maintenance.team / alias_id (many2one) : NEW relation: mail.alias, required +maintenance / maintenance.team / message_follower_ids (one2many): NEW relation: mail.followers +maintenance / maintenance.team / message_ids (one2many) : NEW relation: mail.message + +# NOTHING TO DO + +---XML records in module 'maintenance'--- +NEW res.groups.privilege: maintenance.res_groups_privilege_maintenance + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/survey/19.0.3.7/post-migration.py b/openupgrade_scripts/scripts/survey/19.0.3.7/post-migration.py new file mode 100644 index 000000000000..b7f3713bc9a3 --- /dev/null +++ b/openupgrade_scripts/scripts/survey/19.0.3.7/post-migration.py @@ -0,0 +1,6 @@ +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.load_data(env, "survey", "19.0.3.7/noupdate_changes.xml") diff --git a/openupgrade_scripts/scripts/survey/19.0.3.7/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/survey/19.0.3.7/upgrade_analysis_work.txt new file mode 100644 index 000000000000..b6d3fd775893 --- /dev/null +++ b/openupgrade_scripts/scripts/survey/19.0.3.7/upgrade_analysis_work.txt @@ -0,0 +1,15 @@ +---Models in module 'survey'--- + + +---Fields in module 'survey'--- +survey / survey.survey / lang_ids (many2many) : NEW relation: res.lang, hasdefault: default +survey / survey.user_input / lang_id (many2one) : NEW relation: res.lang +survey / survey.user_input.line / answer_is_correct (boolean) : now a function +survey / survey.user_input.line / answer_score (float) : now a function + +# NOTHING TO DO + +---XML records in module 'survey'--- +NEW res.groups.privilege: survey.res_groups_privilege_surveys (noupdate) + +# NOTHING TO DO From 79086a3bc1e056e31744c0585522f3c83084227d Mon Sep 17 00:00:00 2001 From: Don Kendall Date: Thu, 11 Jun 2026 07:48:08 -0400 Subject: [PATCH 2/2] [FIX] maintenance: preserve historical durations across the compute swap 19.0 makes duration a stored compute of (schedule_end - schedule_date) and adds stored-computed schedule_end = schedule_date + 1h; letting the ORM create the column flattens every historical duration to 1.0 via the cascade recompute. Pre-create schedule_end from the real 18.0 duration. --- .../maintenance/19.0.1.0/pre-migration.py | 24 +++++++++++++++++++ .../19.0.1.0/upgrade_analysis_work.txt | 3 +++ 2 files changed, 27 insertions(+) create mode 100644 openupgrade_scripts/scripts/maintenance/19.0.1.0/pre-migration.py diff --git a/openupgrade_scripts/scripts/maintenance/19.0.1.0/pre-migration.py b/openupgrade_scripts/scripts/maintenance/19.0.1.0/pre-migration.py new file mode 100644 index 000000000000..d8131b7bc94a --- /dev/null +++ b/openupgrade_scripts/scripts/maintenance/19.0.1.0/pre-migration.py @@ -0,0 +1,24 @@ +from openupgradelib import openupgrade + +# 19.0 turns duration into a stored compute of (schedule_end - schedule_date) +# and adds stored-computed schedule_end = schedule_date + 1h. If the ORM +# creates schedule_end, the cascade recompute flattens every historical +# duration to 1.0 (or 0). Pre-create the column and derive it from the real +# 18.0 duration so both fields stay consistent and history is preserved. + + +@openupgrade.migrate() +def migrate(env, version): + if openupgrade.column_exists(env.cr, "maintenance_request", "schedule_end"): + return + openupgrade.logged_query( + env.cr, "ALTER TABLE maintenance_request ADD COLUMN schedule_end timestamp" + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE maintenance_request + SET schedule_end = schedule_date + duration * interval '1 hour' + WHERE schedule_date IS NOT NULL AND duration > 0 + """, + ) diff --git a/openupgrade_scripts/scripts/maintenance/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/maintenance/19.0.1.0/upgrade_analysis_work.txt index 753b3cb8f15f..d2059ca4d03b 100644 --- a/openupgrade_scripts/scripts/maintenance/19.0.1.0/upgrade_analysis_work.txt +++ b/openupgrade_scripts/scripts/maintenance/19.0.1.0/upgrade_analysis_work.txt @@ -10,6 +10,9 @@ maintenance / maintenance.equipment.category / message_follower_ids (one2many): maintenance / maintenance.equipment.category / message_ids (one2many) : DEL relation: mail.message maintenance / maintenance.request / duration (float) : now a function maintenance / maintenance.request / schedule_end (datetime) : NEW hasdefault: compute + +# DONE: pre-migration pre-creates schedule_end = schedule_date + duration (the ORM-computed +# column would default every row to +1h and cascade-overwrite historical durations) maintenance / maintenance.team / _inherits : NEW _inherits: {'mail.alias': 'alias_id'}, stored: False maintenance / maintenance.team / alias_id (many2one) : NEW relation: mail.alias, required maintenance / maintenance.team / message_follower_ids (one2many): NEW relation: mail.followers