From a986974bde0a13c91be543f88645889aaf910f17 Mon Sep 17 00:00:00 2001 From: Tran Truong Son Date: Tue, 27 Jun 2023 15:19:36 +0700 Subject: [PATCH 1/2] [OU-ADD] project: migration 15.0 to 16.0 * Project - set last_update_status of project to the value `to_define` if it is empty * Task stage - all stages of a task of type is_closed will convert to fold * Task - create some one column of task & set value for it - ['ancestor_id', 'is_analytic_account_id_changed', 'is_closed', 'is_blocked'] --- docsource/modules150-160.rst | 2 +- .../scripts/project/16.0.1.2/pre-migration.py | 94 ++++++++++++++++ .../16.0.1.2/upgrade_analysis_work.txt | 106 ++++++++++++++++++ 3 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py create mode 100644 openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt diff --git a/docsource/modules150-160.rst b/docsource/modules150-160.rst index 20d035409bb0..2339042cd120 100644 --- a/docsource/modules150-160.rst +++ b/docsource/modules150-160.rst @@ -640,7 +640,7 @@ Module coverage 15.0 -> 16.0 +-------------------------------------------------+----------------------+-------------------------------------------------+ | product_matrix | | | +-------------------------------------------------+----------------------+-------------------------------------------------+ -| project | | | +| project |Done | | +-------------------------------------------------+----------------------+-------------------------------------------------+ | |del| project_account | | | +-------------------------------------------------+----------------------+-------------------------------------------------+ diff --git a/openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py b/openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py new file mode 100644 index 000000000000..092d73a1e39d --- /dev/null +++ b/openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py @@ -0,0 +1,94 @@ +from odoo.tools.sql import column_exists, create_column + + +def _move_task_stage_is_closed_to_fold(cr): + cr.execute( + """ + UPDATE project_task_type + SET fold = TRUE + WHERE is_closed = TRUE + """ + ) + + +def _update_project_last_update_status(cr): + cr.execute( + """ + UPDATE project_project project + SET last_update_status = 'to_define' + WHERE last_update_status IS NULL + """ + ) + + +def _set_task_is_analytic_account_id_changed_value(cr): + if not column_exists(cr, 'project_task', 'is_analytic_account_id_changed'): + create_column(cr, 'project_task', 'is_analytic_account_id_changed', 'boolean') + + cr.execute( + """ + UPDATE project_task task + SET is_analytic_account_id_changed = CASE + WHEN task.analytic_account_id = project.analytic_account_id THEN FALSE + ELSE TRUE + END + FROM project_project as project + WHERE task.project_id = project.id + """ + ) + + +def _set_task_is_closed_value(cr): + if not column_exists(cr, "project_task", "is_closed"): + create_column(cr, "project_task", "is_closed", "boolean") + + cr.execute( + """ + UPDATE project_task task + SET is_closed = CASE + WHEN stage.fold = TRUE THEN TRUE + ELSE FALSE + END + FROM project_task_type stage + WHERE task.stage_id = stage.id + """ + ) + + +def _set_task_is_blocked_value(cr): + if not column_exists(cr, "project_task", "is_blocked"): + create_column(cr, "project_task", "is_blocked", "boolean") + + cr.execute( + """ + WITH cte AS ( + SELECT + t.id, + CASE + WHEN COUNT(t.id) > 0 THEN TRUE + ELSE FALSE + END AS is_blocked + FROM + project_task t + LEFT JOIN + task_dependencies_rel d ON d.task_id = t.id + LEFT JOIN + project_task d_task ON d_task.id = d.depends_on_id + WHERE d_task.is_closed = FALSE + GROUP BY t.id + ) + + UPDATE project_task task + SET is_blocked = cte.is_blocked + FROM cte + WHERE task.id = cte.id + """ + ) + + +def migrate(cr, version): + _move_task_stage_is_closed_to_fold(cr) + _update_project_last_update_status(cr) + _set_task_is_analytic_account_id_changed_value(cr) + _set_task_is_closed_value(cr) + _set_task_is_blocked_value(cr) diff --git a/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt new file mode 100644 index 000000000000..0a554c8fe757 --- /dev/null +++ b/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt @@ -0,0 +1,106 @@ +---Models in module 'project'--- +obsolete model project.delete.wizard [transient] +---Fields in module 'project'--- +project / account.analytic.tag / task_ids (many2many) : DEL relation: project.task +project / project.milestone / task_ids (one2many) : NEW relation: project.task +project / project.project / allow_milestones (boolean) : NEW hasdefault: default +# NOTHING TO DO + +project / project.project / last_update_status (selection): not a function anymore +project / project.project / last_update_status (selection): now required +project / project.project / last_update_status (selection): selection_keys is now '['at_risk', 'off_track', 'on_hold', 'on_track', 'to_define']' ('['at_risk', 'off_track', 'on_hold', 'on_track']') +# DONE: pre-migration: set value to `to_define` if last_update_status IS NULL + +project / project.project / task_properties_definition (properties_definition): NEW +project / project.tags / project_ids (many2many) : NEW relation: project.project +project / project.tags / task_ids (many2many) : NEW relation: project.task +# NOTHING TO DO + +project / project.task / analytic_tag_ids (many2many) : DEL relation: account.analytic.tag +# NOTHING TO DO + +project / project.task / ancestor_id (many2one) : NEW relation: project.task, isfunction: function, stored +# TODO: pre-migration: Add new column & set value for it + +project / project.task / is_analytic_account_id_changed (boolean): NEW isfunction: function, stored +# DONE: pre-migration: Add new column & set value for it + +project / project.task / is_blocked (boolean) : NEW isfunction: function, stored +# DONE: pre-migration: Add new column & set value for it + +project / project.task / is_closed (boolean) : is now stored +# DONE: pre-migration: Add new column & set value for it + +project / project.task / milestone_id (many2one) : NEW relation: project.milestone, hasdefault: compute +# NOTHING TO DO + +project / project.task / task_properties (properties) : NEW hasdefault: compute +# NOTHING TO DO + +project / project.task.type / is_closed (boolean) : DEL +# DONE: pre-migration: Move value to fold stage + +project / res.company / analytic_plan_id (many2one) : NEW relation: account.analytic.plan, hasdefault: compute +# NOTHING TO DO + +---XML records in module 'project'--- +NEW digest.tip: project.digest_tip_project_1 +NEW ir.actions.act_window: project.action_send_mail_project_project +NEW ir.actions.act_window: project.action_send_mail_project_task +NEW ir.actions.act_window: project.action_view_task_from_milestone +NEW ir.actions.act_window: project.open_view_project_all_config_group_stage +NEW ir.actions.act_window: project.project_sharing_project_task_action_sub_task +NEW ir.actions.act_window: project.project_task_action_sub_task +# NOTHING TO DO + +DEL ir.actions.act_window: project.project_milestone_all +NEW ir.actions.act_window.view: project.open_view_all_task_list_calendar +NEW ir.actions.act_window.view: project.open_view_all_task_list_kanban +NEW ir.actions.act_window.view: project.open_view_all_task_list_tree +NEW ir.actions.act_window.view: project.open_view_project_all_config_group_stage_kanban_action_view +NEW ir.actions.act_window.view: project.open_view_project_all_config_group_stage_tree_action_view +NEW ir.actions.act_window.view: project.project_all_task_activity_action_view +NEW ir.actions.act_window.view: project.project_all_task_calendar_action_view +NEW ir.actions.act_window.view: project.project_all_task_graph_action_view +NEW ir.actions.act_window.view: project.project_all_task_pivot_action_view +NEW ir.actions.act_window.view: project.project_sharing_subtasks_form_action_view +NEW ir.actions.act_window.view: project.project_sharing_subtasks_kanban_action_view +NEW ir.actions.act_window.view: project.project_sharing_subtasks_tree_action_view +NEW ir.actions.act_window.view: project.project_task_form_action_view +NEW ir.actions.act_window.view: project.project_task_kanban_action_view +NEW ir.actions.act_window.view: project.project_task_tree_action_view +NEW ir.actions.act_window.view: project.rating_rating_action_task_kanban +NEW ir.actions.act_window.view: project.rating_rating_action_view_project_rating_kanban +# NOTHING TO DO + +DEL ir.actions.server: project.unlink_project_action +NEW ir.model.access: project.access_project_task_burndown_chart_report_user +NEW ir.model.access: project.access_report_project_task_user_project_user +DEL ir.model.access: project.access_project_delete_wizard +# NOTHING TO DO + +NEW ir.rule: project.burndown_chart_project_manager_rule (noupdate) +NEW ir.rule: project.burndown_chart_project_user_rule (noupdate) +NEW ir.rule: project.report_project_task_manager_rule (noupdate) +NEW ir.rule: project.report_project_task_user_rule (noupdate) +# NOTHING TO DO + +NEW ir.ui.menu: project.menu_projects_config_group_stage +NEW ir.ui.view: project.rating_rating_project_view_kanban +NEW ir.ui.view: project.task_type_tree_inherited +NEW ir.ui.view: project.view_project_calendar +NEW ir.ui.view: project.view_project_config_kanban +NEW ir.ui.view: project.view_project_task_pivot_inherit +NEW ir.ui.view: project.view_project_task_type_unarchive_wizard +NEW ir.ui.view: project.view_task_all_calendar +NEW ir.ui.view: project.view_task_kanban_inherit_my_task +DEL ir.ui.view: project.project_collaborator_view_form +DEL ir.ui.view: project.project_delete_wizard_form +DEL ir.ui.view: project.project_task_burndown_chart_report_view_pivot +# NOTHING TO DO + +NEW mail.message.subtype: project.mt_project_update_create (noupdate) +NEW mail.message.subtype: project.mt_task_progress (noupdate) +NEW mail.message.subtype: project.mt_update_create (noupdate) +NEW res.groups: project.group_project_milestone +# NOTHING TO DO From 0f583fc8b274060ba20e83897f1b5f014d2777a4 Mon Sep 17 00:00:00 2001 From: Tran Truong Son Date: Thu, 29 Jun 2023 14:40:15 +0700 Subject: [PATCH 2/2] [OU-ADD] project: migration from version 15 to version 16 --- .../project/16.0.1.2/post-migration.py | 6 + .../scripts/project/16.0.1.2/pre-migration.py | 157 ++++++++++++------ .../16.0.1.2/upgrade_analysis_work.txt | 2 +- 3 files changed, 110 insertions(+), 55 deletions(-) create mode 100644 openupgrade_scripts/scripts/project/16.0.1.2/post-migration.py diff --git a/openupgrade_scripts/scripts/project/16.0.1.2/post-migration.py b/openupgrade_scripts/scripts/project/16.0.1.2/post-migration.py new file mode 100644 index 000000000000..2ba15f4506f9 --- /dev/null +++ b/openupgrade_scripts/scripts/project/16.0.1.2/post-migration.py @@ -0,0 +1,6 @@ +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.load_data(env.cr, "project", "16.0.1.2/noupdate_changes.xml") diff --git a/openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py b/openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py index 092d73a1e39d..3c223b398766 100644 --- a/openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py +++ b/openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py @@ -1,31 +1,59 @@ -from odoo.tools.sql import column_exists, create_column +from openupgradelib import openupgrade -def _move_task_stage_is_closed_to_fold(cr): - cr.execute( +def _create_column_for_avoiding_automatic_computing(env): + openupgrade.logged_query( + env.cr, """ - UPDATE project_task_type - SET fold = TRUE - WHERE is_closed = TRUE - """ + ALTER TABLE project_task + ADD COLUMN IF NOT EXISTS is_analytic_account_id_changed boolean; + """, + ) + openupgrade.logged_query( + env.cr, + """ + ALTER TABLE project_task ADD COLUMN IF NOT EXISTS is_closed boolean; + """, + ) + openupgrade.logged_query( + env.cr, + """ + ALTER TABLE project_task ADD COLUMN IF NOT EXISTS is_blocked boolean; + """, + ) + openupgrade.logged_query( + env.cr, + """ + ALTER TABLE project_task ADD COLUMN IF NOT EXISTS ancestor_id integer; + """, ) -def _update_project_last_update_status(cr): - cr.execute( +def _fill_project_last_update_status_if_null(env): + openupgrade.logged_query( + env.cr, """ UPDATE project_project project SET last_update_status = 'to_define' - WHERE last_update_status IS NULL - """ + WHERE last_update_status IS NULL; + """, ) -def _set_task_is_analytic_account_id_changed_value(cr): - if not column_exists(cr, 'project_task', 'is_analytic_account_id_changed'): - create_column(cr, 'project_task', 'is_analytic_account_id_changed', 'boolean') +def _set_task_stage_type_to_fold_if_is_closed(env): + openupgrade.logged_query( + env.cr, + """ + UPDATE project_task_type + SET fold = TRUE + WHERE is_closed = TRUE; + """, + ) + - cr.execute( +def _fill_project_task_is_analytic_account_id_changed(env): + openupgrade.logged_query( + env.cr, """ UPDATE project_task task SET is_analytic_account_id_changed = CASE @@ -33,16 +61,14 @@ def _set_task_is_analytic_account_id_changed_value(cr): ELSE TRUE END FROM project_project as project - WHERE task.project_id = project.id - """ + WHERE task.project_id = project.id; + """, ) -def _set_task_is_closed_value(cr): - if not column_exists(cr, "project_task", "is_closed"): - create_column(cr, "project_task", "is_closed", "boolean") - - cr.execute( +def _fill_project_task_is_closed(env): + openupgrade.logged_query( + env.cr, """ UPDATE project_task task SET is_closed = CASE @@ -50,45 +76,68 @@ def _set_task_is_closed_value(cr): ELSE FALSE END FROM project_task_type stage - WHERE task.stage_id = stage.id - """ + WHERE task.stage_id = stage.id; + """, ) -def _set_task_is_blocked_value(cr): - if not column_exists(cr, "project_task", "is_blocked"): - create_column(cr, "project_task", "is_blocked", "boolean") +def _fill_project_task_is_blocked(env): + openupgrade.logged_query( + env.cr, + """ + UPDATE project_task + SET is_blocked = TRUE + WHERE id IN ( + SELECT task_id + FROM task_dependencies_rel + WHERE depends_on_id IN (SELECT id FROM project_task WHERE is_closed = FALSE) + ); + + UPDATE project_task + SET is_blocked = FALSE + WHERE id NOT IN ( + SELECT task_id + FROM task_dependencies_rel + WHERE depends_on_id IN (SELECT id FROM project_task WHERE is_closed = FALSE) + ); + """, + ) + - cr.execute( +def _fil_project_task_ancestor_id(env): + openupgrade.logged_query( + env.cr, """ - WITH cte AS ( - SELECT - t.id, - CASE - WHEN COUNT(t.id) > 0 THEN TRUE - ELSE FALSE - END AS is_blocked - FROM - project_task t - LEFT JOIN - task_dependencies_rel d ON d.task_id = t.id - LEFT JOIN - project_task d_task ON d_task.id = d.depends_on_id - WHERE d_task.is_closed = FALSE - GROUP BY t.id + WITH RECURSIVE task_ancestors AS ( + SELECT id, parent_id, id AS ancestor_id + FROM project_task + WHERE parent_id IS NULL + + UNION ALL + + SELECT pt.id, pt.parent_id, ta.ancestor_id + FROM project_task pt + INNER JOIN task_ancestors ta ON pt.parent_id = ta.id ) - UPDATE project_task task - SET is_blocked = cte.is_blocked - FROM cte - WHERE task.id = cte.id - """ + UPDATE project_task pt + SET ancestor_id = ta.ancestor_id + FROM task_ancestors ta + WHERE pt.id = ta.id; + + UPDATE project_task pt + SET ancestor_id = NULL + WHERE id = ancestor_id; + """, ) -def migrate(cr, version): - _move_task_stage_is_closed_to_fold(cr) - _update_project_last_update_status(cr) - _set_task_is_analytic_account_id_changed_value(cr) - _set_task_is_closed_value(cr) - _set_task_is_blocked_value(cr) +@openupgrade.migrate() +def migrate(env, version): + _create_column_for_avoiding_automatic_computing(env) + _fill_project_last_update_status_if_null(env) + _set_task_stage_type_to_fold_if_is_closed(env) + _fill_project_task_is_analytic_account_id_changed(env) + _fill_project_task_is_closed(env) + _fill_project_task_is_blocked(env) + _fil_project_task_ancestor_id(env) diff --git a/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt index 0a554c8fe757..81366251ecc5 100644 --- a/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt +++ b/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt @@ -20,7 +20,7 @@ project / project.task / analytic_tag_ids (many2many) : DEL re # NOTHING TO DO project / project.task / ancestor_id (many2one) : NEW relation: project.task, isfunction: function, stored -# TODO: pre-migration: Add new column & set value for it +# DONE: pre-migration: Add new column & set value for it project / project.task / is_analytic_account_id_changed (boolean): NEW isfunction: function, stored # DONE: pre-migration: Add new column & set value for it