From 0aa62d46d8dd6021369e1c23be59acea5255f712 Mon Sep 17 00:00:00 2001 From: Henrik Norlin Date: Fri, 16 Aug 2019 19:23:13 +0200 Subject: [PATCH 1/3] [MIG] 11.0 account_asset to 12.0 account_asset_management --- .../12.0.1.0.0/openupgrade_analysis.txt | 156 ++++++++++++++ .../12.0.1.0.0/openupgrade_analysis_work.txt | 199 ++++++++++++++++++ .../migrations/12.0.1.0.0/post-migration.py | 103 +++++++++ .../migrations/12.0.1.0.0/pre-migration.py | 57 +++++ 4 files changed, 515 insertions(+) create mode 100644 account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt create mode 100644 account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt create mode 100644 account_asset_management/migrations/12.0.1.0.0/post-migration.py create mode 100644 account_asset_management/migrations/12.0.1.0.0/pre-migration.py diff --git a/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt new file mode 100644 index 000000000..0c4262c7a --- /dev/null +++ b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt @@ -0,0 +1,156 @@ +---Fields in module 'account_asset_management'--- +account_asset / account.asset.asset / category_id (many2one) : DEL relation: account.asset.category, required +account_asset / account.asset.asset / currency_id (many2one) : DEL relation: res.currency, required, req_default: function +account_asset / account.asset.asset / date (date) : DEL required, req_default: function +account_asset / account.asset.asset / depreciation_line_ids (one2many): relation is now 'account.asset.line' ('account.asset.depreciation.line') [nothing to do] +account_asset / account.asset.asset / invoice_id (many2one) : DEL relation: account.invoice +account_asset / account.asset.asset / message_follower_ids (one2many): DEL relation: mail.followers +account_asset / account.asset.asset / message_ids (one2many) : DEL relation: mail.message +account_asset / account.asset.asset / message_last_post (datetime) : DEL +account_asset / account.asset.asset / method (selection) : selection_keys is now 'function' ('['degressive', 'linear']') +account_asset / account.asset.asset / method_period (integer) : selection_keys is now 'function' ('False') +account_asset / account.asset.asset / method_period (integer) : type is now 'selection' ('integer') +account_asset / account.asset.asset / method_time (selection) : selection_keys is now 'function' ('['end', 'number']') +account_asset / account.asset.asset / state (selection) : selection_keys is now '['close', 'draft', 'open', 'removed']' ('['close', 'draft', 'open']') +account_asset / account.asset.asset / type (selection) : is now stored +account_asset / account.asset.asset / type (selection) : not related anymore +account_asset / account.asset.asset / type (selection) : selection_keys is now '['normal', 'view']' ('function') +account_asset / account.asset.asset / value (float) : DEL required +account_asset / account.asset.asset / value_residual (float) : is now stored +account_asset / account.asset.asset / website_message_ids (one2many): DEL relation: mail.message +account_asset / account.asset.category / account_depreciation_expense_id (many2one): DEL relation: account.account, required +account_asset / account.asset.category / group_entries (boolean) : DEL +account_asset / account.asset.category / method (selection) : selection_keys is now 'function' ('['degressive', 'linear']') +account_asset / account.asset.category / method_end (date) : DEL +account_asset / account.asset.category / method_period (integer) : selection_keys is now 'function' ('False') +account_asset / account.asset.category / method_period (integer) : type is now 'selection' ('integer') +account_asset / account.asset.category / method_time (selection) : selection_keys is now 'function' ('['end', 'number']') +account_asset / account.asset.category / type (selection) : DEL required, selection_keys: ['purchase', 'sale'], req_default: function +account_asset / account.asset.depreciation.line / asset_id (many2one) : relation is now 'account.asset' ('account.asset.asset') [nothing to do] +account_asset / account.asset.depreciation.line / depreciated_value (float) : now a function +account_asset / account.asset.depreciation.line / depreciation_date (date) : DEL +account_asset / account.asset.depreciation.line / move_posted_check (boolean) : DEL +account_asset / account.asset.depreciation.line / remaining_value (float) : now a function +account_asset / account.asset.depreciation.line / sequence (integer) : DEL required +account_asset / account.invoice.line / asset_category_id (many2one) : DEL relation: account.asset.category +account_asset / account.invoice.line / asset_end_date (date) : DEL +account_asset / account.invoice.line / asset_mrr (float) : DEL +account_asset / account.invoice.line / asset_start_date (date) : DEL +account_asset / account.move / asset_depreciation_ids (one2many): DEL relation: account.asset.depreciation.line +account_asset / product.template / asset_category_id (many2one) : DEL relation: account.asset.category +account_asset / product.template / deferred_revenue_category_id (many2one): DEL relation: account.asset.category +account_asset_management / account.account / asset_profile_id (many2one) : NEW relation: account.asset.profile +account_asset_management / account.asset / account_analytic_id (many2one): NEW relation: account.analytic.account +account_asset_management / account.asset / account_move_line_ids (one2many): NEW relation: account.move.line +account_asset_management / account.asset / child_ids (one2many) : NEW relation: account.asset +account_asset_management / account.asset / company_currency_id (many2one): NEW relation: res.currency, isrelated: related, stored +account_asset_management / account.asset / date_remove (date) : NEW +account_asset_management / account.asset / date_start (date) : NEW +account_asset_management / account.asset / depreciation_base (float) : NEW isfunction: function, stored +account_asset_management / account.asset / parent_id (many2one) : NEW relation: account.asset +account_asset_management / account.asset / parent_path (char) : NEW +account_asset_management / account.asset / profile_id (many2one) : NEW relation: account.asset.profile +account_asset_management / account.asset / purchase_value (float) : NEW required +account_asset_management / account.asset / value_depreciated (float) : NEW isfunction: function, stored +account_asset_management / account.asset.line / init_entry (boolean) : NEW +account_asset_management / account.asset.line / line_date (date) : NEW required +account_asset_management / account.asset.line / previous_id (many2one) : NEW relation: account.asset.line +account_asset_management / account.asset.line / type (selection) : NEW selection_keys: ['create', 'depreciate', 'remove'], hasdefault +account_asset_management / account.asset.profile / account_expense_depreciation_id (many2one): NEW relation: account.account, required +account_asset_management / account.asset.profile / account_min_value_id (many2one): NEW relation: account.account +account_asset_management / account.asset.profile / account_plus_value_id (many2one): NEW relation: account.account +account_asset_management / account.asset.profile / account_residual_value_id (many2one): NEW relation: account.account +account_asset_management / account.asset.profile / asset_product_item (boolean) : NEW +account_asset_management / account.asset.profile / note (text) : NEW +account_asset_management / account.asset.profile / parent_id (many2one) : NEW relation: account.asset +account_asset_management / account.asset.recompute.trigger / company_id (many2one) : NEW relation: res.company, required +account_asset_management / account.asset.recompute.trigger / date_completed (datetime) : NEW +account_asset_management / account.asset.recompute.trigger / date_trigger (datetime) : NEW +account_asset_management / account.asset.recompute.trigger / reason (char) : NEW required +account_asset_management / account.asset.recompute.trigger / state (selection) : NEW selection_keys: ['done', 'open'], hasdefault +account_asset_management / account.invoice.line / asset_id (many2one) : NEW relation: account.asset +account_asset_management / account.invoice.line / asset_profile_id (many2one) : NEW relation: account.asset.profile +account_asset_management / account.move.line / asset_id (many2one) : NEW relation: account.asset +account_asset_management / account.move.line / asset_profile_id (many2one) : NEW relation: account.asset.profile +---XML records in module 'account_asset_management'--- +NEW ir.actions.act_window: account_asset_management.account_asset_action +NEW ir.actions.act_window: account_asset_management.account_asset_compute_action +NEW ir.actions.act_window: account_asset_management.account_asset_profile_action +NEW ir.actions.act_window: account_asset_management.act_entries_open +DEL ir.actions.act_window: account_asset.action_account_asset_asset_form +DEL ir.actions.act_window: account_asset.action_account_asset_asset_list_normal_purchase +DEL ir.actions.act_window: account_asset.action_asset_asset_report +DEL ir.actions.act_window: account_asset.action_asset_depreciation_confirmation_wizard +DEL ir.actions.act_window: account_asset.action_asset_modify +DEL ir.cron: account_asset.account_asset_cron +NEW ir.model.access: account_asset_management.access_account_asset_invoice +NEW ir.model.access: account_asset_management.access_account_asset_line_invoice +NEW ir.model.access: account_asset_management.access_account_asset_line_manager +NEW ir.model.access: account_asset_management.access_account_asset_line_user +NEW ir.model.access: account_asset_management.access_account_asset_manager +NEW ir.model.access: account_asset_management.access_account_asset_profile_invoice +NEW ir.model.access: account_asset_management.access_account_asset_profile_manager +NEW ir.model.access: account_asset_management.access_account_asset_profile_user +NEW ir.model.access: account_asset_management.access_account_asset_recompute_trigger_manager +NEW ir.model.access: account_asset_management.access_account_asset_recompute_trigger_user +NEW ir.model.access: account_asset_management.access_account_asset_user +DEL ir.model.access: account_asset.access_account_asset_asset +DEL ir.model.access: account_asset.access_account_asset_asset_invoicing_payment +DEL ir.model.access: account_asset.access_account_asset_asset_manager +DEL ir.model.access: account_asset.access_account_asset_category +DEL ir.model.access: account_asset.access_account_asset_category_invoicing_payment +DEL ir.model.access: account_asset.access_account_asset_category_manager +DEL ir.model.access: account_asset.access_account_asset_depreciation_line +DEL ir.model.access: account_asset.access_account_asset_depreciation_line_invoicing_payment +DEL ir.model.access: account_asset.access_account_asset_depreciation_line_manager +DEL ir.model.access: account_asset.access_asset_asset_report +DEL ir.model.access: account_asset.access_asset_asset_report_manager +NEW ir.rule: account_asset_management.account_asset_multi_company_rule (noupdate) +NEW ir.rule: account_asset_management.account_asset_profile_multi_company_rule (noupdate) +DEL ir.rule: account_asset.account_asset_asset_multi_company_rule (noupdate) +DEL ir.rule: account_asset.account_asset_category_multi_company_rule (noupdate) +NEW ir.ui.menu: account_asset_management.account_asset_compute_menu +NEW ir.ui.menu: account_asset_management.account_asset_menu +NEW ir.ui.menu: account_asset_management.account_asset_profile_menu +NEW ir.ui.menu: account_asset_management.menu_finance_assets +NEW ir.ui.menu: account_asset_management.menu_finance_config_assets +DEL ir.ui.menu: account_asset.menu_action_account_asset_asset_form +DEL ir.ui.menu: account_asset.menu_action_account_asset_asset_list_normal_purchase +DEL ir.ui.menu: account_asset.menu_action_asset_asset_report +DEL ir.ui.menu: account_asset.menu_asset_depreciation_confirmation_wizard +DEL ir.ui.menu: account_asset.menu_finance_config_assets +NEW ir.ui.view: account_asset_management.account_asset_compute_view_form +NEW ir.ui.view: account_asset_management.account_asset_compute_view_form_result +NEW ir.ui.view: account_asset_management.account_asset_profile_view_form +NEW ir.ui.view: account_asset_management.account_asset_profile_view_search +NEW ir.ui.view: account_asset_management.account_asset_profile_view_tree +NEW ir.ui.view: account_asset_management.account_asset_remove_view_form +NEW ir.ui.view: account_asset_management.account_asset_view_form +NEW ir.ui.view: account_asset_management.account_asset_view_search +NEW ir.ui.view: account_asset_management.account_asset_view_tree +NEW ir.ui.view: account_asset_management.invoice_form +NEW ir.ui.view: account_asset_management.invoice_supplier_form +NEW ir.ui.view: account_asset_management.res_config_settings_view_form +NEW ir.ui.view: account_asset_management.view_account_form +NEW ir.ui.view: account_asset_management.view_account_move_line_filter +NEW ir.ui.view: account_asset_management.view_invoice_line_form +NEW ir.ui.view: account_asset_management.view_move_form +NEW ir.ui.view: account_asset_management.view_move_line_form +DEL ir.ui.view: account_asset.action_account_asset_report_graph +DEL ir.ui.view: account_asset.action_account_asset_report_pivot +DEL ir.ui.view: account_asset.asset_modify_form +DEL ir.ui.view: account_asset.assets_backend +DEL ir.ui.view: account_asset.qunit_suite +DEL ir.ui.view: account_asset.res_config_settings_view_form +DEL ir.ui.view: account_asset.view_account_asset_asset_category_kanban +DEL ir.ui.view: account_asset.view_account_asset_asset_form +DEL ir.ui.view: account_asset.view_account_asset_asset_kanban +DEL ir.ui.view: account_asset.view_account_asset_asset_purchase_tree +DEL ir.ui.view: account_asset.view_account_asset_category_form +DEL ir.ui.view: account_asset.view_account_asset_category_search +DEL ir.ui.view: account_asset.view_account_asset_category_tree +DEL ir.ui.view: account_asset.view_account_asset_search +DEL ir.ui.view: account_asset.view_asset_asset_report_search +DEL ir.ui.view: account_asset.view_asset_depreciation_confirmation_wizard +DEL ir.ui.view: account_asset.view_invoice_asset_category +DEL ir.ui.view: account_asset.view_product_template_form_inherit \ No newline at end of file diff --git a/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt new file mode 100644 index 000000000..ae5976746 --- /dev/null +++ b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt @@ -0,0 +1,199 @@ +---Fields in module 'account_asset_management'--- +account_asset / account.asset.asset / category_id (many2one) : DEL relation: account.asset.category, required +# renamed to profile_id +account_asset / account.asset.asset / currency_id (many2one) : DEL relation: res.currency, required, req_default: function +# renamed to company_currency_id +account_asset / account.asset.asset / date (date) : DEL required, req_default: function +# renamed to date_start +account_asset / account.asset.asset / depreciation_line_ids (one2many): relation is now 'account.asset.line' ('account.asset.depreciation.line') [nothing to do] +account_asset / account.asset.asset / invoice_id (many2one) : DEL relation: account.invoice +# DEL +account_asset / account.asset.asset / message_follower_ids (one2many): DEL relation: mail.followers +# DEL +account_asset / account.asset.asset / message_ids (one2many) : DEL relation: mail.message +# DEL +account_asset / account.asset.asset / message_last_post (datetime) : DEL +# DEL +account_asset / account.asset.asset / method (selection) : selection_keys is now 'function' ('['degressive', 'linear']') +# TODO: LOG WARNING IF METHOD IS NOT linear OR degressive +account_asset / account.asset.asset / method_period (integer) : selection_keys is now 'function' ('False') +account_asset / account.asset.asset / method_period (integer) : type is now 'selection' ('integer') +# renamed method_number to method_number_11 (11.0: Number of depreciations, 12.0: Number of years) +# renamed method_period to method_period_11 (11.0: Number of months in a period, 12.0: Period Length: year/quarter/month) +# TODO: LOG WARNING IF method_period_11 is other than (1, 3, 12) +account_asset / account.asset.asset / method_time (selection) : selection_keys is now 'function' ('['end', 'number']') +account_asset / account.asset.asset / state (selection) : selection_keys is now '['close', 'draft', 'open', 'removed']' ('['close', 'draft', 'open']') +account_asset / account.asset.asset / type (selection) : is now stored +account_asset / account.asset.asset / type (selection) : not related anymore +account_asset / account.asset.asset / type (selection) : selection_keys is now '['normal', 'view']' ('function') +account_asset / account.asset.asset / value (float) : DEL required +# renamed to purchase_value +account_asset / account.asset.asset / value_residual (float) : is now stored +account_asset / account.asset.asset / website_message_ids (one2many): DEL relation: mail.message +# DEL +account_asset / account.asset.category / account_depreciation_expense_id (many2one): DEL relation: account.account, required +# renamed to account_expense_depreciation_id +account_asset / account.asset.category / group_entries (boolean) : DEL +# DEL +account_asset / account.asset.category / method (selection) : selection_keys is now 'function' ('['degressive', 'linear']') +# TODO: LOG WARNING IF METHOD IS NOT linear OR degressive +account_asset / account.asset.category / method_end (date) : DEL +# DEL +account_asset / account.asset.category / method_period (integer) : selection_keys is now 'function' ('False') +account_asset / account.asset.category / method_period (integer) : type is now 'selection' ('integer') +# renamed method_number to method_number_11 (11.0: Number of depreciations, 12.0: Number of years) +# renamed method_period to method_period_11 (11.0: Number of months in a period, 12.0: Period Length: year/quarter/month) +# TODO: LOG WARNING IF method_period_11 is other than (1, 3, 12) +account_asset / account.asset.category / method_time (selection) : selection_keys is now 'function' ('['end', 'number']') +account_asset / account.asset.category / type (selection) : DEL required, selection_keys: ['purchase', 'sale'], req_default: function +# DEL +account_asset / account.asset.depreciation.line / asset_id (many2one) : relation is now 'account.asset' ('account.asset.asset') [nothing to do] +account_asset / account.asset.depreciation.line / depreciated_value (float) : now a function +account_asset / account.asset.depreciation.line / depreciation_date (date) : DEL +# renamed to line_date +account_asset / account.asset.depreciation.line / move_posted_check (boolean) : DEL +# DEL +account_asset / account.asset.depreciation.line / remaining_value (float) : now a function +account_asset / account.asset.depreciation.line / sequence (integer) : DEL required +# DEL +account_asset / account.invoice.line / asset_category_id (many2one) : DEL relation: account.asset.category +# renamed to asset_profile_id +account_asset / account.invoice.line / asset_end_date (date) : DEL +# DEL +account_asset / account.invoice.line / asset_mrr (float) : DEL +# DEL +account_asset / account.invoice.line / asset_start_date (date) : DEL +# DEL +account_asset / account.move / asset_depreciation_ids (one2many): DEL relation: account.asset.depreciation.line +# DEL +account_asset / product.template / asset_category_id (many2one) : DEL relation: account.asset.category +# DEL +account_asset / product.template / deferred_revenue_category_id (many2one): DEL relation: account.asset.category +# DEL +account_asset_management / account.account / asset_profile_id (many2one) : NEW relation: account.asset.profile +account_asset_management / account.asset / account_analytic_id (many2one): NEW relation: account.analytic.account +# get from profile_id.account_analytic_id +account_asset_management / account.asset / account_move_line_ids (one2many): NEW relation: account.move.line +account_asset_management / account.asset / child_ids (one2many) : NEW relation: account.asset +account_asset_management / account.asset / company_currency_id (many2one): NEW relation: res.currency, isrelated: related, stored +# renamed from currency_id +account_asset_management / account.asset / date_remove (date) : NEW +account_asset_management / account.asset / date_start (date) : NEW +# renamed from date +account_asset_management / account.asset / depreciation_base (float) : NEW isfunction: function, stored +account_asset_management / account.asset / parent_id (many2one) : NEW relation: account.asset +# get new view asset +account_asset_management / account.asset / parent_path (char) : NEW +account_asset_management / account.asset / profile_id (many2one) : NEW relation: account.asset.profile +# renamed from category_id +account_asset_management / account.asset / purchase_value (float) : NEW required +# renamed from value +account_asset_management / account.asset / value_depreciated (float) : NEW isfunction: function, stored +account_asset_management / account.asset.line / init_entry (boolean) : NEW +account_asset_management / account.asset.line / line_date (date) : NEW required +# renamed from depreciation_date +account_asset_management / account.asset.line / previous_id (many2one) : NEW relation: account.asset.line +account_asset_management / account.asset.line / type (selection) : NEW selection_keys: ['create', 'depreciate', 'remove'], hasdefault +account_asset_management / account.asset.profile / account_expense_depreciation_id (many2one): NEW relation: account.account, required +# renamed from account_depreciation_expense_id +account_asset_management / account.asset.profile / account_min_value_id (many2one): NEW relation: account.account +account_asset_management / account.asset.profile / account_plus_value_id (many2one): NEW relation: account.account +account_asset_management / account.asset.profile / account_residual_value_id (many2one): NEW relation: account.account +account_asset_management / account.asset.profile / asset_product_item (boolean) : NEW +account_asset_management / account.asset.profile / note (text) : NEW +account_asset_management / account.asset.profile / parent_id (many2one) : NEW relation: account.asset +# get new view asset +account_asset_management / account.asset.recompute.trigger / company_id (many2one) : NEW relation: res.company, required +account_asset_management / account.asset.recompute.trigger / date_completed (datetime) : NEW +account_asset_management / account.asset.recompute.trigger / date_trigger (datetime) : NEW +account_asset_management / account.asset.recompute.trigger / reason (char) : NEW required +account_asset_management / account.asset.recompute.trigger / state (selection) : NEW selection_keys: ['done', 'open'], hasdefault +account_asset_management / account.invoice.line / asset_id (many2one) : NEW relation: account.asset +account_asset_management / account.invoice.line / asset_profile_id (many2one) : NEW relation: account.asset.profile +# renamed from asset_category_id +account_asset_management / account.move.line / asset_id (many2one) : NEW relation: account.asset +# get from account.asset.line (asset_id, move_id) +account_asset_management / account.move.line / asset_profile_id (many2one) : NEW relation: account.asset.profile +# get from account.asset.line (asset_id, move_id, profile_id) +---XML records in module 'account_asset_management'--- +NEW ir.actions.act_window: account_asset_management.account_asset_action +NEW ir.actions.act_window: account_asset_management.account_asset_compute_action +NEW ir.actions.act_window: account_asset_management.account_asset_profile_action +NEW ir.actions.act_window: account_asset_management.act_entries_open +DEL ir.actions.act_window: account_asset.action_account_asset_asset_form +DEL ir.actions.act_window: account_asset.action_account_asset_asset_list_normal_purchase +DEL ir.actions.act_window: account_asset.action_asset_asset_report +DEL ir.actions.act_window: account_asset.action_asset_depreciation_confirmation_wizard +DEL ir.actions.act_window: account_asset.action_asset_modify +DEL ir.cron: account_asset.account_asset_cron +NEW ir.model.access: account_asset_management.access_account_asset_invoice +NEW ir.model.access: account_asset_management.access_account_asset_line_invoice +NEW ir.model.access: account_asset_management.access_account_asset_line_manager +NEW ir.model.access: account_asset_management.access_account_asset_line_user +NEW ir.model.access: account_asset_management.access_account_asset_manager +NEW ir.model.access: account_asset_management.access_account_asset_profile_invoice +NEW ir.model.access: account_asset_management.access_account_asset_profile_manager +NEW ir.model.access: account_asset_management.access_account_asset_profile_user +NEW ir.model.access: account_asset_management.access_account_asset_recompute_trigger_manager +NEW ir.model.access: account_asset_management.access_account_asset_recompute_trigger_user +NEW ir.model.access: account_asset_management.access_account_asset_user +DEL ir.model.access: account_asset.access_account_asset_asset +DEL ir.model.access: account_asset.access_account_asset_asset_invoicing_payment +DEL ir.model.access: account_asset.access_account_asset_asset_manager +DEL ir.model.access: account_asset.access_account_asset_category +DEL ir.model.access: account_asset.access_account_asset_category_invoicing_payment +DEL ir.model.access: account_asset.access_account_asset_category_manager +DEL ir.model.access: account_asset.access_account_asset_depreciation_line +DEL ir.model.access: account_asset.access_account_asset_depreciation_line_invoicing_payment +DEL ir.model.access: account_asset.access_account_asset_depreciation_line_manager +DEL ir.model.access: account_asset.access_asset_asset_report +DEL ir.model.access: account_asset.access_asset_asset_report_manager +NEW ir.rule: account_asset_management.account_asset_multi_company_rule (noupdate) +NEW ir.rule: account_asset_management.account_asset_profile_multi_company_rule (noupdate) +DEL ir.rule: account_asset.account_asset_asset_multi_company_rule (noupdate) +DEL ir.rule: account_asset.account_asset_category_multi_company_rule (noupdate) +NEW ir.ui.menu: account_asset_management.account_asset_compute_menu +NEW ir.ui.menu: account_asset_management.account_asset_menu +NEW ir.ui.menu: account_asset_management.account_asset_profile_menu +NEW ir.ui.menu: account_asset_management.menu_finance_assets +NEW ir.ui.menu: account_asset_management.menu_finance_config_assets +DEL ir.ui.menu: account_asset.menu_action_account_asset_asset_form +DEL ir.ui.menu: account_asset.menu_action_account_asset_asset_list_normal_purchase +DEL ir.ui.menu: account_asset.menu_action_asset_asset_report +DEL ir.ui.menu: account_asset.menu_asset_depreciation_confirmation_wizard +DEL ir.ui.menu: account_asset.menu_finance_config_assets +NEW ir.ui.view: account_asset_management.account_asset_compute_view_form +NEW ir.ui.view: account_asset_management.account_asset_compute_view_form_result +NEW ir.ui.view: account_asset_management.account_asset_profile_view_form +NEW ir.ui.view: account_asset_management.account_asset_profile_view_search +NEW ir.ui.view: account_asset_management.account_asset_profile_view_tree +NEW ir.ui.view: account_asset_management.account_asset_remove_view_form +NEW ir.ui.view: account_asset_management.account_asset_view_form +NEW ir.ui.view: account_asset_management.account_asset_view_search +NEW ir.ui.view: account_asset_management.account_asset_view_tree +NEW ir.ui.view: account_asset_management.invoice_form +NEW ir.ui.view: account_asset_management.invoice_supplier_form +NEW ir.ui.view: account_asset_management.res_config_settings_view_form +NEW ir.ui.view: account_asset_management.view_account_form +NEW ir.ui.view: account_asset_management.view_account_move_line_filter +NEW ir.ui.view: account_asset_management.view_invoice_line_form +NEW ir.ui.view: account_asset_management.view_move_form +NEW ir.ui.view: account_asset_management.view_move_line_form +DEL ir.ui.view: account_asset.action_account_asset_report_graph +DEL ir.ui.view: account_asset.action_account_asset_report_pivot +DEL ir.ui.view: account_asset.asset_modify_form +DEL ir.ui.view: account_asset.assets_backend +DEL ir.ui.view: account_asset.qunit_suite +DEL ir.ui.view: account_asset.res_config_settings_view_form +DEL ir.ui.view: account_asset.view_account_asset_asset_category_kanban +DEL ir.ui.view: account_asset.view_account_asset_asset_form +DEL ir.ui.view: account_asset.view_account_asset_asset_kanban +DEL ir.ui.view: account_asset.view_account_asset_asset_purchase_tree +DEL ir.ui.view: account_asset.view_account_asset_category_form +DEL ir.ui.view: account_asset.view_account_asset_category_search +DEL ir.ui.view: account_asset.view_account_asset_category_tree +DEL ir.ui.view: account_asset.view_account_asset_search +DEL ir.ui.view: account_asset.view_asset_asset_report_search +DEL ir.ui.view: account_asset.view_asset_depreciation_confirmation_wizard +DEL ir.ui.view: account_asset.view_invoice_asset_category +DEL ir.ui.view: account_asset.view_product_template_form_inherit \ No newline at end of file diff --git a/account_asset_management/migrations/12.0.1.0.0/post-migration.py b/account_asset_management/migrations/12.0.1.0.0/post-migration.py new file mode 100644 index 000000000..5a4756ec1 --- /dev/null +++ b/account_asset_management/migrations/12.0.1.0.0/post-migration.py @@ -0,0 +1,103 @@ +# Copyright 2019 Apps2GROW - Henrik Norlin +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade +import logging +logger = logging.getLogger('OpenUpgrade') + + +def create_view_asset(env): + for company in env['res.company'].search([]): + values = { + 'company_id': company.id, + 'name': 'ASSET VIEW', + 'type': 'view', + } + env['account.asset'].create(values) + + +def update_asset(cr): + cr.execute('''SELECT a.id, + a.openupgrade_legacy_12_0_method_number, + a.openupgrade_legacy_12_0_method_period, + p.account_analytic_id, + a.company_id + FROM account_asset a + LEFT JOIN account_asset_profile p ON a.profile_id = p.id + WHERE a.type = 'normal';''') + for asset in cr.fetchall(): + no_of_entries = asset[1] + months_between_entries = asset[2] + + values = {} + # Analytic account + values['account_analytic_id'] = asset[3] or 'NULL' + # Number of years + values['method_number'] = \ + int(no_of_entries * months_between_entries / 12) + # Period: month / quarter / year (default: year) + if months_between_entries == 3: + values['method_period'] = "'quarter'" + elif months_between_entries == 1: + values['method_period'] = "'month'" + cr.execute("""SELECT id FROM account_asset + WHERE type = 'view' and company_id = %s limit 1;""" % asset[4]) + values['parent_id'] = cr.fetchall()[0][0] + + vals = ['%s = %s' % (key, value) for key, value in values.items()] + sql = "UPDATE account_asset SET %s WHERE id = %s" % \ + (', '.join(vals), asset[0]) + logger.debug('update_asset: %s' % sql) + cr.execute(sql) + + +def update_asset_profile(cr): + cr.execute('''SELECT id, + openupgrade_legacy_12_0_method_number, + openupgrade_legacy_12_0_method_period, + company_id FROM account_asset_profile;''') + for profile in cr.fetchall(): + + no_of_entries = profile[1] + months_between_entries = profile[2] + + values = {} + # Number of years + values['method_number'] = \ + int(no_of_entries * months_between_entries / 12) + # Period: month / quarter / year (default: year) + if months_between_entries == 3: + values['method_period'] = "'quarter'" + elif months_between_entries == 1: + values['method_period'] = "'month'" + cr.execute("""SELECT id FROM account_asset + WHERE type = 'view' and company_id = %s + LIMIT 1;""" % profile[3]) + values['parent_id'] = cr.fetchall()[0][0] + + vals = ['{} = {}'.format(key, value) for key, value in values.items()] + sql = """UPDATE account_asset_profile + SET %s WHERE id = %s""" % (', '.join(vals), profile[0]) + logger.debug('update_asset_profile: %s' % sql) + cr.execute(sql) + + +def update_move_line(cr): + cr.execute("""SELECT l.move_id, l.asset_id, a.profile_id + FROM account_asset_line l + LEFT JOIN account_asset a ON l.asset_id = a.id + WHERE l.move_id IS NOT NULL;""") + for line in cr.fetchall(): + sql = """UPDATE account_move_line + SET asset_id = %s, asset_profile_id = %s + WHERE move_id = %s""" % (line[1], line[2], line[0]) + logger.debug('update_move_line: %s' % sql) + cr.execute(sql) + + +@openupgrade.migrate() +def migrate(env, version): + cr = env.cr + create_view_asset(env) + update_asset(cr) + update_asset_profile(cr) + update_move_line(cr) diff --git a/account_asset_management/migrations/12.0.1.0.0/pre-migration.py b/account_asset_management/migrations/12.0.1.0.0/pre-migration.py new file mode 100644 index 000000000..5e465b836 --- /dev/null +++ b/account_asset_management/migrations/12.0.1.0.0/pre-migration.py @@ -0,0 +1,57 @@ +# Copyright 2019 Apps2GROW - Henrik Norlin +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade + +_model_renames1 = [ + ('account.asset.category', 'account.asset.profile'), + ('account.asset.depreciation.line', 'account.asset.line'), +] + +_table_renames1 = [ + (old.replace('.', '_'), new.replace('.', '_')) + for (old, new) in _model_renames1 +] + +_model_renames2 = [ + ('account.asset.asset', 'account.asset'), +] + +_table_renames2 = [ + (old.replace('.', '_'), new.replace('.', '_')) + for (old, new) in _model_renames2 +] + +_column_copies = { + 'account_asset': [ + ('method_number', None, None), + ('method_period', None, None), + ], + 'account_asset_profile': [ + ('method_number', None, None), + ('method_period', None, None), + ], +} + +_field_renames = [ + ('account.asset', 'account_asset', 'category_id', 'profile_id'), + ('account.asset', 'account_asset', 'currency_id', 'company_currency_id'), + ('account.asset', 'account_asset', 'date', 'date_start'), + ('account.asset', 'account_asset', 'value', 'purchase_value'), + ('account.asset.line', 'account_asset_line', + 'depreciation_date', 'line_date'), + ('account.asset.profile', 'account_asset_profile', + 'account_depreciation_expense_id', 'account_expense_depreciation_id'), + ('account.invoice.line', 'account_invoice_line', + 'asset_category_id', 'asset_profile_id'), +] + + +@openupgrade.migrate() +def migrate(env, version): + cr = env.cr + openupgrade.rename_models(cr, _model_renames1) + openupgrade.rename_tables(cr, _table_renames1) + openupgrade.rename_models(cr, _model_renames2) + openupgrade.rename_tables(cr, _table_renames2) + openupgrade.copy_columns(cr, _column_copies) + openupgrade.rename_fields(env, _field_renames) From 8486c9c0ce6beb8fa26c33790bf962a9866a5d6e Mon Sep 17 00:00:00 2001 From: Henrik Norlin Date: Mon, 26 Aug 2019 21:28:27 +0200 Subject: [PATCH 2/3] [IMP] removed type, parent_id, parent_path, child_ids from account.asset & account.asset.profile --- account_asset_management/__manifest__.py | 3 +- .../openupgrade_analysis.txt | 15 +-- .../openupgrade_analysis_work.txt | 18 ++-- .../post-migration.py | 64 ++++++++----- .../pre-migration.py | 21 +++-- account_asset_management/models/__init__.py | 1 + .../models/account_asset.py | 91 +++++-------------- .../models/account_asset_group.py | 24 +++++ .../models/account_asset_profile.py | 7 +- .../models/account_invoice.py | 3 +- .../security/account_asset_security.xml | 7 ++ .../security/ir.model.access.csv | 4 +- .../tests/account_asset_test_data.xml | 29 ------ .../views/account_asset.xml | 40 +++----- .../views/account_asset_group.xml | 52 +++++++++++ .../views/account_asset_profile.xml | 2 +- account_asset_management/views/menuitem.xml | 3 + .../wizard/account_asset_compute.py | 2 +- 18 files changed, 211 insertions(+), 175 deletions(-) rename account_asset_management/migrations/{12.0.1.0.0 => 12.0.1.2.0}/openupgrade_analysis.txt (95%) rename account_asset_management/migrations/{12.0.1.0.0 => 12.0.1.2.0}/openupgrade_analysis_work.txt (96%) rename account_asset_management/migrations/{12.0.1.0.0 => 12.0.1.2.0}/post-migration.py (65%) rename account_asset_management/migrations/{12.0.1.0.0 => 12.0.1.2.0}/pre-migration.py (70%) create mode 100644 account_asset_management/models/account_asset_group.py create mode 100644 account_asset_management/views/account_asset_group.xml diff --git a/account_asset_management/__manifest__.py b/account_asset_management/__manifest__.py index 81942d81f..aec81acc3 100644 --- a/account_asset_management/__manifest__.py +++ b/account_asset_management/__manifest__.py @@ -4,7 +4,7 @@ { 'name': 'Assets Management', - 'version': '12.0.1.1.2', + 'version': '12.0.1.2.0', 'license': 'AGPL-3', 'depends': [ 'account', @@ -20,6 +20,7 @@ 'wizard/account_asset_remove.xml', 'views/account_account.xml', 'views/account_asset.xml', + 'views/account_asset_group.xml', 'views/account_asset_profile.xml', 'views/res_config_settings.xml', 'views/account_invoice.xml', diff --git a/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt b/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis.txt similarity index 95% rename from account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt rename to account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis.txt index 0c4262c7a..eb8fb2cef 100644 --- a/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt +++ b/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis.txt @@ -1,3 +1,10 @@ +Done after the analysis: +NEW model account.asset.group +NEW field account.asset group_id +NEW field account.asset.profile group_id +account.asset date_start required +account.asset profile_id required + ---Fields in module 'account_asset_management'--- account_asset / account.asset.asset / category_id (many2one) : DEL relation: account.asset.category, required account_asset / account.asset.asset / currency_id (many2one) : DEL relation: res.currency, required, req_default: function @@ -12,9 +19,7 @@ account_asset / account.asset.asset / method_period (integer) : selec account_asset / account.asset.asset / method_period (integer) : type is now 'selection' ('integer') account_asset / account.asset.asset / method_time (selection) : selection_keys is now 'function' ('['end', 'number']') account_asset / account.asset.asset / state (selection) : selection_keys is now '['close', 'draft', 'open', 'removed']' ('['close', 'draft', 'open']') -account_asset / account.asset.asset / type (selection) : is now stored -account_asset / account.asset.asset / type (selection) : not related anymore -account_asset / account.asset.asset / type (selection) : selection_keys is now '['normal', 'view']' ('function') +account_asset / account.asset.asset / type (selection) : DEL required account_asset / account.asset.asset / value (float) : DEL required account_asset / account.asset.asset / value_residual (float) : is now stored account_asset / account.asset.asset / website_message_ids (one2many): DEL relation: mail.message @@ -42,13 +47,10 @@ account_asset / product.template / deferred_revenue_category_id (many2on account_asset_management / account.account / asset_profile_id (many2one) : NEW relation: account.asset.profile account_asset_management / account.asset / account_analytic_id (many2one): NEW relation: account.analytic.account account_asset_management / account.asset / account_move_line_ids (one2many): NEW relation: account.move.line -account_asset_management / account.asset / child_ids (one2many) : NEW relation: account.asset account_asset_management / account.asset / company_currency_id (many2one): NEW relation: res.currency, isrelated: related, stored account_asset_management / account.asset / date_remove (date) : NEW account_asset_management / account.asset / date_start (date) : NEW account_asset_management / account.asset / depreciation_base (float) : NEW isfunction: function, stored -account_asset_management / account.asset / parent_id (many2one) : NEW relation: account.asset -account_asset_management / account.asset / parent_path (char) : NEW account_asset_management / account.asset / profile_id (many2one) : NEW relation: account.asset.profile account_asset_management / account.asset / purchase_value (float) : NEW required account_asset_management / account.asset / value_depreciated (float) : NEW isfunction: function, stored @@ -62,7 +64,6 @@ account_asset_management / account.asset.profile / account_plus_value_id (man account_asset_management / account.asset.profile / account_residual_value_id (many2one): NEW relation: account.account account_asset_management / account.asset.profile / asset_product_item (boolean) : NEW account_asset_management / account.asset.profile / note (text) : NEW -account_asset_management / account.asset.profile / parent_id (many2one) : NEW relation: account.asset account_asset_management / account.asset.recompute.trigger / company_id (many2one) : NEW relation: res.company, required account_asset_management / account.asset.recompute.trigger / date_completed (datetime) : NEW account_asset_management / account.asset.recompute.trigger / date_trigger (datetime) : NEW diff --git a/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt b/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis_work.txt similarity index 96% rename from account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt rename to account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis_work.txt index ae5976746..a633337c9 100644 --- a/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt +++ b/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis_work.txt @@ -1,3 +1,11 @@ +Done after the analysis: +NEW model account.asset.group +NEW field account.asset group_id +NEW field account.asset.profile group_id +account.asset date_start required +account.asset profile_id required +# TODO: account.asset of type 'view' (archived): set date_start & profile_id + ---Fields in module 'account_asset_management'--- account_asset / account.asset.asset / category_id (many2one) : DEL relation: account.asset.category, required # renamed to profile_id @@ -23,9 +31,8 @@ account_asset / account.asset.asset / method_period (integer) : type # TODO: LOG WARNING IF method_period_11 is other than (1, 3, 12) account_asset / account.asset.asset / method_time (selection) : selection_keys is now 'function' ('['end', 'number']') account_asset / account.asset.asset / state (selection) : selection_keys is now '['close', 'draft', 'open', 'removed']' ('['close', 'draft', 'open']') -account_asset / account.asset.asset / type (selection) : is now stored -account_asset / account.asset.asset / type (selection) : not related anymore -account_asset / account.asset.asset / type (selection) : selection_keys is now '['normal', 'view']' ('function') +account_asset / account.asset.asset / type (selection) : DEL required +# DEL account_asset / account.asset.asset / value (float) : DEL required # renamed to purchase_value account_asset / account.asset.asset / value_residual (float) : is now stored @@ -81,9 +88,6 @@ account_asset_management / account.asset / date_remove (date) account_asset_management / account.asset / date_start (date) : NEW # renamed from date account_asset_management / account.asset / depreciation_base (float) : NEW isfunction: function, stored -account_asset_management / account.asset / parent_id (many2one) : NEW relation: account.asset -# get new view asset -account_asset_management / account.asset / parent_path (char) : NEW account_asset_management / account.asset / profile_id (many2one) : NEW relation: account.asset.profile # renamed from category_id account_asset_management / account.asset / purchase_value (float) : NEW required @@ -101,8 +105,6 @@ account_asset_management / account.asset.profile / account_plus_value_id (man account_asset_management / account.asset.profile / account_residual_value_id (many2one): NEW relation: account.account account_asset_management / account.asset.profile / asset_product_item (boolean) : NEW account_asset_management / account.asset.profile / note (text) : NEW -account_asset_management / account.asset.profile / parent_id (many2one) : NEW relation: account.asset -# get new view asset account_asset_management / account.asset.recompute.trigger / company_id (many2one) : NEW relation: res.company, required account_asset_management / account.asset.recompute.trigger / date_completed (datetime) : NEW account_asset_management / account.asset.recompute.trigger / date_trigger (datetime) : NEW diff --git a/account_asset_management/migrations/12.0.1.0.0/post-migration.py b/account_asset_management/migrations/12.0.1.2.0/post-migration.py similarity index 65% rename from account_asset_management/migrations/12.0.1.0.0/post-migration.py rename to account_asset_management/migrations/12.0.1.2.0/post-migration.py index 5a4756ec1..6f11df513 100644 --- a/account_asset_management/migrations/12.0.1.0.0/post-migration.py +++ b/account_asset_management/migrations/12.0.1.2.0/post-migration.py @@ -5,14 +5,34 @@ import logging logger = logging.getLogger('OpenUpgrade') -def create_view_asset(env): - for company in env['res.company'].search([]): - values = { - 'company_id': company.id, - 'name': 'ASSET VIEW', - 'type': 'view', - } - env['account.asset'].create(values) +def create_asset_group(cr): + view_to_group = {} + cr.execute('''SELECT id, name, parent_id, company_id + FROM account_asset WHERE type = 'view';''') + for view in cr.fetchall(): + sql = '''INSERT INTO account_asset_group (name, parent_id, company_id) + VALUES ('%s', %s, %s) returning id;''' % \ + (view[1], view[2] or 'NULL', view[3]) + cr.execute(sql) + view_id = view[0] + group_id = cr.fetchone()[0] + view_to_group[view_id] = group_id + return view_to_group + + +def update_asset_and_asset_profile(cr, view_to_group): + cr.execute('''UPDATE account_asset + SET active = false + WHERE type = 'view';''') + + for view_id, group_id in view_to_group.items(): + cr.execute('''UPDATE account_asset + SET group_id = %s + WHERE parent_id = %s;''' % (group_id, view_id)) + + cr.execute('''UPDATE account_asset_profile + SET group_id = %s + WHERE parent_id = %s;''' % (group_id, view_id)) def update_asset(cr): @@ -22,8 +42,8 @@ def update_asset(cr): p.account_analytic_id, a.company_id FROM account_asset a - LEFT JOIN account_asset_profile p ON a.profile_id = p.id - WHERE a.type = 'normal';''') + LEFT JOIN account_asset_profile p ON a.profile_id = p.id; + ''') for asset in cr.fetchall(): no_of_entries = asset[1] months_between_entries = asset[2] @@ -39,9 +59,6 @@ def update_asset(cr): values['method_period'] = "'quarter'" elif months_between_entries == 1: values['method_period'] = "'month'" - cr.execute("""SELECT id FROM account_asset - WHERE type = 'view' and company_id = %s limit 1;""" % asset[4]) - values['parent_id'] = cr.fetchall()[0][0] vals = ['%s = %s' % (key, value) for key, value in values.items()] sql = "UPDATE account_asset SET %s WHERE id = %s" % \ @@ -69,10 +86,6 @@ def update_asset_profile(cr): values['method_period'] = "'quarter'" elif months_between_entries == 1: values['method_period'] = "'month'" - cr.execute("""SELECT id FROM account_asset - WHERE type = 'view' and company_id = %s - LIMIT 1;""" % profile[3]) - values['parent_id'] = cr.fetchall()[0][0] vals = ['{} = {}'.format(key, value) for key, value in values.items()] sql = """UPDATE account_asset_profile @@ -97,7 +110,16 @@ def update_move_line(cr): @openupgrade.migrate() def migrate(env, version): cr = env.cr - create_view_asset(env) - update_asset(cr) - update_asset_profile(cr) - update_move_line(cr) + cr.execute('''SELECT column_name + FROM information_schema.columns + WHERE table_name = 'account_asset' + AND column_name = 'type';''') + if cr.fetchone(): + # migrate from account_asset_management + view_to_group = create_asset_group(cr) + update_asset_and_asset_profile(cr, view_to_group) + else: + # migrate from account_asset + update_asset(cr) + update_asset_profile(cr) + update_move_line(cr) diff --git a/account_asset_management/migrations/12.0.1.0.0/pre-migration.py b/account_asset_management/migrations/12.0.1.2.0/pre-migration.py similarity index 70% rename from account_asset_management/migrations/12.0.1.0.0/pre-migration.py rename to account_asset_management/migrations/12.0.1.2.0/pre-migration.py index 5e465b836..56cf936b5 100644 --- a/account_asset_management/migrations/12.0.1.0.0/pre-migration.py +++ b/account_asset_management/migrations/12.0.1.2.0/pre-migration.py @@ -49,9 +49,18 @@ _field_renames = [ @openupgrade.migrate() def migrate(env, version): cr = env.cr - openupgrade.rename_models(cr, _model_renames1) - openupgrade.rename_tables(cr, _table_renames1) - openupgrade.rename_models(cr, _model_renames2) - openupgrade.rename_tables(cr, _table_renames2) - openupgrade.copy_columns(cr, _column_copies) - openupgrade.rename_fields(env, _field_renames) + cr.execute('''SELECT column_name + FROM information_schema.columns + WHERE table_name = 'account_asset' + AND column_name = 'type';''') + if cr.fetchone(): + # migrate from account_asset_management + pass + else: + # migrate from account_asset + openupgrade.rename_models(cr, _model_renames1) + openupgrade.rename_tables(cr, _table_renames1) + openupgrade.rename_models(cr, _model_renames2) + openupgrade.rename_tables(cr, _table_renames2) + openupgrade.copy_columns(cr, _column_copies) + openupgrade.rename_fields(env, _field_renames) diff --git a/account_asset_management/models/__init__.py b/account_asset_management/models/__init__.py index 1c6674458..d7cde7086 100644 --- a/account_asset_management/models/__init__.py +++ b/account_asset_management/models/__init__.py @@ -1,5 +1,6 @@ from . import account_account from . import account_asset +from . import account_asset_group from . import account_asset_profile from . import account_asset_line from . import account_asset_recompute_trigger diff --git a/account_asset_management/models/account_asset.py b/account_asset_management/models/account_asset.py index 9903a391f..3e15c7c8d 100644 --- a/account_asset_management/models/account_asset.py +++ b/account_asset_management/models/account_asset.py @@ -28,7 +28,6 @@ class AccountAsset(models.Model): _name = 'account.asset' _description = 'Asset' _order = 'date_start desc, code, name' - _parent_store = True account_move_line_ids = fields.One2many( comodel_name='account.move.line', @@ -77,23 +76,17 @@ class AccountAsset(models.Model): profile_id = fields.Many2one( comodel_name='account.asset.profile', string='Asset Profile', - change_default=True, readonly=True, + change_default=True, + readonly=True, + required=True, states={'draft': [('readonly', False)]}) - parent_id = fields.Many2one( - comodel_name='account.asset', - string='Parent Asset', readonly=True, - states={'draft': [('readonly', False)]}, - domain=[('type', '=', 'view')], - ondelete='restrict', - index=True, - ) - parent_path = fields.Char(index=True) - child_ids = fields.One2many( - comodel_name='account.asset', - inverse_name='parent_id', - string='Child Assets') + group_id = fields.Many2one( + comodel_name='account.asset.group', + string='Asset Group') date_start = fields.Date( - string='Asset Start Date', readonly=True, + string='Asset Start Date', + readonly=True, + required=True, states={'draft': [('readonly', False)]}, help="You should manually add depreciation lines " "with the depreciations of previous fiscal years " @@ -177,12 +170,6 @@ class AccountAsset(models.Model): inverse_name='asset_id', string='Depreciation Lines', copy=False, readonly=True, states={'draft': [('readonly', False)]}) - type = fields.Selection( - selection=[('view', 'View'), - ('normal', 'Normal')], - string='Type', - required=True, readonly=True, default='normal', - states={'draft': [('readonly', False)]}) company_id = fields.Many2one( comodel_name='res.company', string='Company', required=True, readonly=True, @@ -208,20 +195,18 @@ class AccountAsset(models.Model): asset.move_line_check = True break - @api.depends('purchase_value', 'salvage_value', 'type', 'method') + @api.depends('purchase_value', 'salvage_value', 'method') @api.multi def _compute_depreciation_base(self): for asset in self: - if asset.type == 'view': - asset.depreciation_base = 0.0 - elif asset.method in ['linear-limit', 'degr-limit']: + if asset.method in ['linear-limit', 'degr-limit']: asset.depreciation_base = asset.purchase_value else: asset.depreciation_base = \ asset.purchase_value - asset.salvage_value @api.multi - @api.depends('type', 'depreciation_base', + @api.depends('depreciation_base', 'depreciation_line_ids.type', 'depreciation_line_ids.amount', 'depreciation_line_ids.previous_id', @@ -229,30 +214,17 @@ class AccountAsset(models.Model): 'depreciation_line_ids.move_check',) def _compute_depreciation(self): for asset in self: - if asset.type == 'normal': - lines = asset.depreciation_line_ids.filtered( - lambda l: l.type in ('depreciate', 'remove') and - (l.init_entry or l.move_check)) - value_depreciated = sum([l.amount for l in lines]) - residual = asset.depreciation_base - value_depreciated - depreciated = value_depreciated - else: - residual = 0.0 - depreciated = 0.0 + lines = asset.depreciation_line_ids.filtered( + lambda l: l.type in ('depreciate', 'remove') and + (l.init_entry or l.move_check)) + value_depreciated = sum([l.amount for l in lines]) + residual = asset.depreciation_base - value_depreciated + depreciated = value_depreciated asset.update({ 'value_residual': residual, 'value_depreciated': depreciated }) - @api.multi - @api.constrains('parent_id') - def _check_recursion(self, parent=None): - res = super()._check_recursion(parent=parent) - if not res: - raise UserError( - _("Error ! You can not create recursive assets.")) - return res - @api.multi @api.constrains('method', 'method_time') def _check_method(self): @@ -297,7 +269,6 @@ class AccountAsset(models.Model): profile = self.profile_id if profile: self.update({ - 'parent_id': profile.parent_id, 'method': profile.method, 'method_number': profile.method_number, 'method_time': profile.method_time, @@ -312,30 +283,15 @@ class AccountAsset(models.Model): if self.method_time != 'year': self.prorata = True - @api.onchange('type') - def _onchange_type(self): - if self.type == 'view': - self.update({ - 'date_start': False, - 'profile_id': False, - 'purchase_value': False, - 'salvage_value': False, - }) - if self.depreciation_line_ids: - self.depreciation_line_ids.unlink() - @api.model def create(self, vals): if vals.get('method_time') != 'year' and not vals.get('prorata'): vals['prorata'] = True - if vals.get('type') == 'view': - vals['date_start'] = False asset = super().create(vals) if self.env.context.get('create_asset_from_move_line'): # Trigger compute of depreciation_base asset.salvage_value = 0.0 - if asset.type == 'normal': - asset._create_first_asset_line() + asset._create_first_asset_line() return asset @api.multi @@ -345,9 +301,7 @@ class AccountAsset(models.Model): vals['prorata'] = True res = super().write(vals) for asset in self: - asset_type = vals.get('type') or asset.type - if asset_type == 'view' or \ - self.env.context.get('asset_validate_from_write'): + if self.env.context.get('asset_validate_from_write'): continue asset._create_first_asset_line() if asset.profile_id.open_asset and \ @@ -387,7 +341,7 @@ class AccountAsset(models.Model): "posted depreciation lines.")) # update accounting entries linked to lines of type 'create' amls = self.with_context( - allow_asset_removal=True, from_parent_object=True + allow_asset_removal=True ).mapped('account_move_line_ids') amls.write({'asset_id': False}) return super().unlink() @@ -419,8 +373,7 @@ class AccountAsset(models.Model): @api.multi def validate(self): for asset in self: - if asset.type == 'normal' and asset.company_currency_id.is_zero( - asset.value_residual): + if asset.company_currency_id.is_zero(asset.value_residual): asset.state = 'close' else: asset.state = 'open' diff --git a/account_asset_management/models/account_asset_group.py b/account_asset_management/models/account_asset_group.py new file mode 100644 index 000000000..c331ed919 --- /dev/null +++ b/account_asset_management/models/account_asset_group.py @@ -0,0 +1,24 @@ +# Copyright 2009-2018 Noviat +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountAssetGroup(models.Model): + _name = 'account.asset.group' + _description = 'Asset Group' + _order = 'name' + + name = fields.Char(string='Name', size=64, required=True, index=True) + company_id = fields.Many2one( + comodel_name='res.company', + string='Company', required=True, + default=lambda self: self._default_company_id()) + parent_id = fields.Many2one( + comodel_name='account.asset.group', + string='Parent Asset Group', + ondelete='restrict') + + @api.model + def _default_company_id(self): + return self.env['res.company']._company_default_get('account.asset') diff --git a/account_asset_management/models/account_asset_profile.py b/account_asset_management/models/account_asset_profile.py index 7b377a72c..78ad71353 100644 --- a/account_asset_management/models/account_asset_profile.py +++ b/account_asset_management/models/account_asset_profile.py @@ -47,10 +47,9 @@ class AccountAssetProfile(models.Model): comodel_name='res.company', string='Company', required=True, default=lambda self: self._default_company_id()) - parent_id = fields.Many2one( - comodel_name='account.asset', - string='Parent Asset', - domain=[('type', '=', 'view')]) + group_id = fields.Many2one( + comodel_name='account.asset.group', + string='Asset Group') method = fields.Selection( selection=lambda self: self._selection_method(), string='Computation Method', diff --git a/account_asset_management/models/account_invoice.py b/account_asset_management/models/account_invoice.py index 188bbe1fb..f5229f1be 100644 --- a/account_asset_management/models/account_invoice.py +++ b/account_asset_management/models/account_invoice.py @@ -131,8 +131,7 @@ class AccountInvoiceLine(models.Model): asset_id = fields.Many2one( comodel_name='account.asset', string='Asset', - domain=[('type', '=', 'normal'), - ('state', 'in', ['open', 'close'])], + domain=[('state', 'in', ['open', 'close'])], help="Complete this field when selling an asset " "in order to facilitate the creation of the " "asset removal accounting entries via the " diff --git a/account_asset_management/security/account_asset_security.xml b/account_asset_management/security/account_asset_security.xml index 637848751..7b1587643 100644 --- a/account_asset_management/security/account_asset_security.xml +++ b/account_asset_management/security/account_asset_security.xml @@ -16,5 +16,12 @@ ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] + + Account Asset Group multi-company + + + ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] + + diff --git a/account_asset_management/security/ir.model.access.csv b/account_asset_management/security/ir.model.access.csv index 4cee0e2e0..9ea3d8171 100644 --- a/account_asset_management/security/ir.model.access.csv +++ b/account_asset_management/security/ir.model.access.csv @@ -10,4 +10,6 @@ access_account_asset_line_user,account.asset.line,model_account_asset_line,accou access_account_asset_line_manager,account.asset.line,model_account_asset_line,account.group_account_manager,1,1,1,1 access_account_asset_recompute_trigger_user,account.asset.recompute.trigger,model_account_asset_recompute_trigger,account.group_account_user,1,1,1,1 access_account_asset_recompute_trigger_manager,account.asset.recompute.trigger,model_account_asset_recompute_trigger,account.group_account_manager,1,1,1,1 - +access_account_asset_group_invoice,account.asset.group,model_account_asset_group,account.group_account_invoice,1,0,0,0 +access_account_asset_group_user,account.asset.group,model_account_asset_group,account.group_account_user,1,0,0,0 +access_account_asset_group_manager,account.asset.group,model_account_asset_group,account.group_account_manager,1,1,1,1 diff --git a/account_asset_management/tests/account_asset_test_data.xml b/account_asset_management/tests/account_asset_test_data.xml index e65a276da..c6883f166 100644 --- a/account_asset_management/tests/account_asset_test_data.xml +++ b/account_asset_management/tests/account_asset_test_data.xml @@ -16,35 +16,9 @@ - - - - view - open - Financial Assets - - - - - view - open - ICT - - - - - - view - open - Vehicles - - - - - @@ -56,7 +30,6 @@ - @@ -70,7 +43,6 @@ - draft year @@ -83,7 +55,6 @@ - draft year diff --git a/account_asset_management/views/account_asset.xml b/account_asset_management/views/account_asset.xml index 6840a97bb..d2566e87e 100644 --- a/account_asset_management/views/account_asset.xml +++ b/account_asset_management/views/account_asset.xml @@ -8,19 +8,17 @@
-
- - - - - + + + - + - + - + + @@ -173,17 +165,16 @@ account.asset.tree account.asset - + - - - - + + + - + @@ -205,7 +196,6 @@ - diff --git a/account_asset_management/views/account_asset_group.xml b/account_asset_management/views/account_asset_group.xml new file mode 100644 index 000000000..8515fab14 --- /dev/null +++ b/account_asset_management/views/account_asset_group.xml @@ -0,0 +1,52 @@ + + + + + + account.asset.group.form + account.asset.group + + + + + + + + + + + + + + + account.asset.group.tree + account.asset.group + + + + + + + + + + + account.asset.group.search + account.asset.group + + + + + + + + + + Asset Groups + account.asset.group + form + tree,form + + + + diff --git a/account_asset_management/views/account_asset_profile.xml b/account_asset_management/views/account_asset_profile.xml index faf673692..18acff623 100644 --- a/account_asset_management/views/account_asset_profile.xml +++ b/account_asset_management/views/account_asset_profile.xml @@ -10,7 +10,7 @@ - + diff --git a/account_asset_management/views/menuitem.xml b/account_asset_management/views/menuitem.xml index 6de76d0f1..0bd10fb3f 100644 --- a/account_asset_management/views/menuitem.xml +++ b/account_asset_management/views/menuitem.xml @@ -24,4 +24,7 @@ action="account_asset_profile_action" parent="menu_finance_config_assets"/> + diff --git a/account_asset_management/wizard/account_asset_compute.py b/account_asset_management/wizard/account_asset_compute.py index 2d9b090ef..ee0f69ce5 100644 --- a/account_asset_management/wizard/account_asset_compute.py +++ b/account_asset_management/wizard/account_asset_compute.py @@ -18,7 +18,7 @@ class AccountAssetCompute(models.TransientModel): @api.multi def asset_compute(self): assets = self.env['account.asset'].search( - [('state', '=', 'open'), ('type', '=', 'normal')]) + [('state', '=', 'open')]) created_move_ids, error_log = assets._compute_entries( self.date_end, check_triggers=True) From 738a4d1fcd7574d98cbfd9cf7751288f853f4eb3 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Sat, 31 Aug 2019 12:14:51 +0200 Subject: [PATCH 3/3] [MIG+FIX+IMP] account_asset_management: Rework migration scripts + make asset group m2m --- account_asset_management/__manifest__.py | 2 +- .../openupgrade_analysis.txt | 0 .../openupgrade_analysis_work.txt | 2 +- .../migrations/12.0.1.0.0/post-migration.py | 73 ++++++++++ .../migrations/12.0.1.0.0/pre-migration.py | 65 +++++++++ .../migrations/12.0.1.2.0/post-migration.py | 125 ------------------ .../migrations/12.0.1.2.0/pre-migration.py | 66 --------- .../migrations/12.0.2.0.0/post-migration.py | 85 ++++++++++++ .../migrations/12.0.2.0.0/pre-migration.py | 49 +++++++ .../models/account_asset.py | 8 +- .../models/account_asset_group.py | 7 +- .../models/account_asset_profile.py | 7 +- .../views/account_asset.xml | 2 +- .../views/account_asset_group.xml | 5 +- .../views/account_asset_profile.xml | 2 +- 15 files changed, 297 insertions(+), 201 deletions(-) rename account_asset_management/migrations/{12.0.1.2.0 => 12.0.1.0.0}/openupgrade_analysis.txt (100%) rename account_asset_management/migrations/{12.0.1.2.0 => 12.0.1.0.0}/openupgrade_analysis_work.txt (99%) create mode 100644 account_asset_management/migrations/12.0.1.0.0/post-migration.py create mode 100644 account_asset_management/migrations/12.0.1.0.0/pre-migration.py delete mode 100644 account_asset_management/migrations/12.0.1.2.0/post-migration.py delete mode 100644 account_asset_management/migrations/12.0.1.2.0/pre-migration.py create mode 100644 account_asset_management/migrations/12.0.2.0.0/post-migration.py create mode 100644 account_asset_management/migrations/12.0.2.0.0/pre-migration.py diff --git a/account_asset_management/__manifest__.py b/account_asset_management/__manifest__.py index aec81acc3..32d504301 100644 --- a/account_asset_management/__manifest__.py +++ b/account_asset_management/__manifest__.py @@ -4,7 +4,7 @@ { 'name': 'Assets Management', - 'version': '12.0.1.2.0', + 'version': '12.0.2.0.0', 'license': 'AGPL-3', 'depends': [ 'account', diff --git a/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis.txt b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt similarity index 100% rename from account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis.txt rename to account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt diff --git a/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis_work.txt b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt similarity index 99% rename from account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis_work.txt rename to account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt index a633337c9..1f6b39c46 100644 --- a/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis_work.txt +++ b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt @@ -198,4 +198,4 @@ DEL ir.ui.view: account_asset.view_account_asset_search DEL ir.ui.view: account_asset.view_asset_asset_report_search DEL ir.ui.view: account_asset.view_asset_depreciation_confirmation_wizard DEL ir.ui.view: account_asset.view_invoice_asset_category -DEL ir.ui.view: account_asset.view_product_template_form_inherit \ No newline at end of file +DEL ir.ui.view: account_asset.view_product_template_form_inherit diff --git a/account_asset_management/migrations/12.0.1.0.0/post-migration.py b/account_asset_management/migrations/12.0.1.0.0/post-migration.py new file mode 100644 index 000000000..a3facbad1 --- /dev/null +++ b/account_asset_management/migrations/12.0.1.0.0/post-migration.py @@ -0,0 +1,73 @@ +# Copyright 2019 Apps2GROW - Henrik Norlin +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade +from psycopg2 import sql + + +def adjust_asset_values(env): + """Avoid method_time != 'year' when possible + adjust other values + in assets and asset profiles. + """ + # Copy analytic account value + openupgrade.logged_query( + env.cr, """ + UPDATE account_asset aa + SET account_analytic_id = aap.account_analytic_id + FROm account_asset_profile aap + WHERE aa.profile_id = aap.id""", + ) + # Adjust method_time, method_number and method_period + number = sql.Identifier(openupgrade.get_legacy_name('method_number')) + period = sql.Identifier(openupgrade.get_legacy_name('method_period')) + for table in ['account_asset_profile', 'account_asset']: + table = sql.Identifier(table) + openupgrade.logged_query( + env.cr, sql.SQL(""" + UPDATE {table} + SET method_time = 'year', + method_number = ({number} * {period}) / 12 + WHERE MOD({number} * {period}, 12) = 0 + """).format( + number=number, + period=period, + table=table, + ), + ) + openupgrade.logged_query( + env.cr, sql.SQL(""" + UPDATE {table} + SET method_period = (CASE + WHEN {period} = 1 THEN 'month' + WHEN {period} = 3 THEN 'quarter' + WHEN {period} = 12 THEN 'year' + END) + WHERE {period} IN (1, 3, 12) + """).format( + period=period, + table=table, + ), + ) + + +def adjust_aml_values(env): + openupgrade.logged_query( + env.cr, """ + UPDATE account_move_line aml + SET asset_id = aa.id, + asset_profile_id = aa.profile_id + FROM account_asset aa, + account_asset_line aal + WHERE aal.move_id = aml.move_id + AND aa.id = aal.asset_id""", + ) + + +@openupgrade.migrate() +def migrate(env, version): + copied_column = openupgrade.get_legacy_name('method_time') + if not openupgrade.column_exists(env.cr, 'account_asset', copied_column): + # We avoid this migration if `account_asset` was not installed in v11 + return + adjust_asset_values(env) + adjust_aml_values(env) diff --git a/account_asset_management/migrations/12.0.1.0.0/pre-migration.py b/account_asset_management/migrations/12.0.1.0.0/pre-migration.py new file mode 100644 index 000000000..61ef3ce31 --- /dev/null +++ b/account_asset_management/migrations/12.0.1.0.0/pre-migration.py @@ -0,0 +1,65 @@ +# Copyright 2019 Apps2GROW - Henrik Norlin +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade + +_model_renames = [ + ('account.asset.category', 'account.asset.profile'), + ('account.asset.depreciation.line', 'account.asset.line'), + ('account.asset.asset', 'account.asset'), +] + +_table_renames = [ + (old.replace('.', '_'), new.replace('.', '_')) + for (old, new) in _model_renames +] + +_column_copies = { + 'account_asset': [ + ('method_number', None, None), + ('method_time', None, None), + ], + 'account_asset_profile': [ + ('method_number', None, None), + ('method_time', None, None), + ], +} + +_column_renames = { + 'account_asset': [ + ('method_period', None), + ], + 'account_asset_profile': [ + ('method_period', None), + ], +} + +_field_renames = [ + ('account.asset', 'account_asset', 'category_id', 'profile_id'), + ('account.asset', 'account_asset', 'currency_id', 'company_currency_id'), + ('account.asset', 'account_asset', 'date', 'date_start'), + ('account.asset', 'account_asset', 'value', 'purchase_value'), + ('account.asset.line', 'account_asset_line', + 'depreciation_date', 'line_date'), + ('account.asset.profile', 'account_asset_profile', + 'account_depreciation_expense_id', 'account_expense_depreciation_id'), + ('account.invoice.line', 'account_invoice_line', + 'asset_category_id', 'asset_profile_id'), +] + + +@openupgrade.migrate() +def migrate(env, version): + cr = env.cr + if openupgrade.table_exists(cr, 'account_asset_asset'): + # `account_asset` module was installed in v11 + if openupgrade.table_exists(cr, 'account_asset'): + # `account_asset_management` module also installed in v11 + # TODO: Merge in existing tables assets if both module installed + pass + else: + openupgrade.rename_models(cr, _model_renames) + openupgrade.rename_tables(cr, _table_renames) + openupgrade.copy_columns(cr, _column_copies) + openupgrade.rename_columns(cr, _column_renames) + openupgrade.rename_fields(env, _field_renames) diff --git a/account_asset_management/migrations/12.0.1.2.0/post-migration.py b/account_asset_management/migrations/12.0.1.2.0/post-migration.py deleted file mode 100644 index 6f11df513..000000000 --- a/account_asset_management/migrations/12.0.1.2.0/post-migration.py +++ /dev/null @@ -1,125 +0,0 @@ -# Copyright 2019 Apps2GROW - Henrik Norlin -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openupgradelib import openupgrade -import logging -logger = logging.getLogger('OpenUpgrade') - - -def create_asset_group(cr): - view_to_group = {} - cr.execute('''SELECT id, name, parent_id, company_id - FROM account_asset WHERE type = 'view';''') - for view in cr.fetchall(): - sql = '''INSERT INTO account_asset_group (name, parent_id, company_id) - VALUES ('%s', %s, %s) returning id;''' % \ - (view[1], view[2] or 'NULL', view[3]) - cr.execute(sql) - view_id = view[0] - group_id = cr.fetchone()[0] - view_to_group[view_id] = group_id - return view_to_group - - -def update_asset_and_asset_profile(cr, view_to_group): - cr.execute('''UPDATE account_asset - SET active = false - WHERE type = 'view';''') - - for view_id, group_id in view_to_group.items(): - cr.execute('''UPDATE account_asset - SET group_id = %s - WHERE parent_id = %s;''' % (group_id, view_id)) - - cr.execute('''UPDATE account_asset_profile - SET group_id = %s - WHERE parent_id = %s;''' % (group_id, view_id)) - - -def update_asset(cr): - cr.execute('''SELECT a.id, - a.openupgrade_legacy_12_0_method_number, - a.openupgrade_legacy_12_0_method_period, - p.account_analytic_id, - a.company_id - FROM account_asset a - LEFT JOIN account_asset_profile p ON a.profile_id = p.id; - ''') - for asset in cr.fetchall(): - no_of_entries = asset[1] - months_between_entries = asset[2] - - values = {} - # Analytic account - values['account_analytic_id'] = asset[3] or 'NULL' - # Number of years - values['method_number'] = \ - int(no_of_entries * months_between_entries / 12) - # Period: month / quarter / year (default: year) - if months_between_entries == 3: - values['method_period'] = "'quarter'" - elif months_between_entries == 1: - values['method_period'] = "'month'" - - vals = ['%s = %s' % (key, value) for key, value in values.items()] - sql = "UPDATE account_asset SET %s WHERE id = %s" % \ - (', '.join(vals), asset[0]) - logger.debug('update_asset: %s' % sql) - cr.execute(sql) - - -def update_asset_profile(cr): - cr.execute('''SELECT id, - openupgrade_legacy_12_0_method_number, - openupgrade_legacy_12_0_method_period, - company_id FROM account_asset_profile;''') - for profile in cr.fetchall(): - - no_of_entries = profile[1] - months_between_entries = profile[2] - - values = {} - # Number of years - values['method_number'] = \ - int(no_of_entries * months_between_entries / 12) - # Period: month / quarter / year (default: year) - if months_between_entries == 3: - values['method_period'] = "'quarter'" - elif months_between_entries == 1: - values['method_period'] = "'month'" - - vals = ['{} = {}'.format(key, value) for key, value in values.items()] - sql = """UPDATE account_asset_profile - SET %s WHERE id = %s""" % (', '.join(vals), profile[0]) - logger.debug('update_asset_profile: %s' % sql) - cr.execute(sql) - - -def update_move_line(cr): - cr.execute("""SELECT l.move_id, l.asset_id, a.profile_id - FROM account_asset_line l - LEFT JOIN account_asset a ON l.asset_id = a.id - WHERE l.move_id IS NOT NULL;""") - for line in cr.fetchall(): - sql = """UPDATE account_move_line - SET asset_id = %s, asset_profile_id = %s - WHERE move_id = %s""" % (line[1], line[2], line[0]) - logger.debug('update_move_line: %s' % sql) - cr.execute(sql) - - -@openupgrade.migrate() -def migrate(env, version): - cr = env.cr - cr.execute('''SELECT column_name - FROM information_schema.columns - WHERE table_name = 'account_asset' - AND column_name = 'type';''') - if cr.fetchone(): - # migrate from account_asset_management - view_to_group = create_asset_group(cr) - update_asset_and_asset_profile(cr, view_to_group) - else: - # migrate from account_asset - update_asset(cr) - update_asset_profile(cr) - update_move_line(cr) diff --git a/account_asset_management/migrations/12.0.1.2.0/pre-migration.py b/account_asset_management/migrations/12.0.1.2.0/pre-migration.py deleted file mode 100644 index 56cf936b5..000000000 --- a/account_asset_management/migrations/12.0.1.2.0/pre-migration.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright 2019 Apps2GROW - Henrik Norlin -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openupgradelib import openupgrade - -_model_renames1 = [ - ('account.asset.category', 'account.asset.profile'), - ('account.asset.depreciation.line', 'account.asset.line'), -] - -_table_renames1 = [ - (old.replace('.', '_'), new.replace('.', '_')) - for (old, new) in _model_renames1 -] - -_model_renames2 = [ - ('account.asset.asset', 'account.asset'), -] - -_table_renames2 = [ - (old.replace('.', '_'), new.replace('.', '_')) - for (old, new) in _model_renames2 -] - -_column_copies = { - 'account_asset': [ - ('method_number', None, None), - ('method_period', None, None), - ], - 'account_asset_profile': [ - ('method_number', None, None), - ('method_period', None, None), - ], -} - -_field_renames = [ - ('account.asset', 'account_asset', 'category_id', 'profile_id'), - ('account.asset', 'account_asset', 'currency_id', 'company_currency_id'), - ('account.asset', 'account_asset', 'date', 'date_start'), - ('account.asset', 'account_asset', 'value', 'purchase_value'), - ('account.asset.line', 'account_asset_line', - 'depreciation_date', 'line_date'), - ('account.asset.profile', 'account_asset_profile', - 'account_depreciation_expense_id', 'account_expense_depreciation_id'), - ('account.invoice.line', 'account_invoice_line', - 'asset_category_id', 'asset_profile_id'), -] - - -@openupgrade.migrate() -def migrate(env, version): - cr = env.cr - cr.execute('''SELECT column_name - FROM information_schema.columns - WHERE table_name = 'account_asset' - AND column_name = 'type';''') - if cr.fetchone(): - # migrate from account_asset_management - pass - else: - # migrate from account_asset - openupgrade.rename_models(cr, _model_renames1) - openupgrade.rename_tables(cr, _table_renames1) - openupgrade.rename_models(cr, _model_renames2) - openupgrade.rename_tables(cr, _table_renames2) - openupgrade.copy_columns(cr, _column_copies) - openupgrade.rename_fields(env, _field_renames) diff --git a/account_asset_management/migrations/12.0.2.0.0/post-migration.py b/account_asset_management/migrations/12.0.2.0.0/post-migration.py new file mode 100644 index 000000000..be01f6e8b --- /dev/null +++ b/account_asset_management/migrations/12.0.2.0.0/post-migration.py @@ -0,0 +1,85 @@ +# Copyright 2019 Apps2GROW - Henrik Norlin +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade +from psycopg2 import sql + + +def create_asset_groups(cr): + # Add a supporting column for indicating the source asset view + origin_column = sql.Identifier( + openupgrade.get_legacy_name('view_asset_id')) + openupgrade.logged_query( + cr, sql.SQL("ALTER TABLE account_asset_group ADD {} int4").format( + origin_column, + ), + ) + # Now fill new table recursively attending parents + parent_column = sql.Identifier(openupgrade.get_legacy_name('parent_id')) + parent_group_ids = ('NULL', ) + query_sql = sql.SQL(""" + INSERT INTO account_asset_group ( + name, code, company_id, parent_id, create_uid, + create_date, write_date, write_uid, {origin_column} + ) + SELECT va.name, va.code, va.company_id, aag2.id, va.create_uid, + va.create_date, va.write_date, va.write_uid, va.id + FROM {table} va + LEFT JOIN account_asset_group aag2 + ON aag2.{origin_column} = va.{parent_column} + WHERE {parent_column} {rest_sql} + RETURNING id + """) + isnull = sql.SQL("IS NULL") + inids = sql.SQL("IN %(ids)s") + while parent_group_ids: + query = query_sql.format( + origin_column=origin_column, + table=sql.Identifier( + openupgrade.get_legacy_name('account_asset_view') + ), + parent_column=parent_column, + rest_sql=isnull if parent_group_ids == ('NULL', ) else inids + ) + openupgrade.logged_query(cr, query, {'ids': parent_group_ids}) + parent_group_ids = tuple(x[0] for x in cr.fetchall()) + + +def update_asset_group_links(cr): + parent_column = sql.Identifier(openupgrade.get_legacy_name('parent_id')) + origin_column = sql.Identifier( + openupgrade.get_legacy_name('view_asset_id')) + openupgrade.logged_query( + cr, sql.SQL(""" + INSERT INTO account_asset_profile_group_rel + (profile_id, group_id) + SELECT aap.id, aag.id + FROM account_asset_profile aap + JOIN account_asset_group aag + ON aag.{origin_column} = aap.{parent_column}""").format( + parent_column=parent_column, + origin_column=origin_column, + ), + ) + openupgrade.logged_query( + cr, sql.SQL(""" + INSERT INTO account_asset_group_rel + (asset_id, group_id) + SELECT aa.id, aag.id + FROM account_asset aa + JOIN account_asset_group aag + ON aag.{origin_column} = aa.{parent_column}""").format( + parent_column=parent_column, + origin_column=origin_column, + ), + ) + + +@openupgrade.migrate() +def migrate(env, version): + column = openupgrade.get_legacy_name('parent_id') + if openupgrade.column_exists(env.cr, 'account_asset', column): + # if migrating directly from v11 `account_asset` module, there are no + # view assets nor parents + create_asset_groups(env.cr) + update_asset_group_links(env.cr) diff --git a/account_asset_management/migrations/12.0.2.0.0/pre-migration.py b/account_asset_management/migrations/12.0.2.0.0/pre-migration.py new file mode 100644 index 000000000..91cbb1593 --- /dev/null +++ b/account_asset_management/migrations/12.0.2.0.0/pre-migration.py @@ -0,0 +1,49 @@ +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade +from psycopg2 import sql + + +_column_renames = { + 'account_asset_profile': [ + ('parent_id', None), + ], + 'account_asset': [ + ('parent_id', None), + ], +} + + +def move_view_assets(cr): + """Copy view assets to other table for preserving them, but outside of the + main table, so remove them from there. + """ + temp_table = sql.Identifier( + openupgrade.get_legacy_name('account_asset_view')) + openupgrade.logged_query( + cr, sql.SQL(""" + CREATE TABLE {} AS ( + SELECT * FROM account_asset + WHERE type='view' + )""").format(temp_table), + ) + openupgrade.logged_query(cr, "DELETE FROM account_asset WHERE type='view'") + + +@openupgrade.migrate() +def migrate(env, version): + if openupgrade.column_exists(env.cr, 'account_asset', 'parent_id'): + # if migrating directly from v11 `account_asset` module, there are no + # view assets nor parents + openupgrade.rename_columns(env.cr, _column_renames) + openupgrade.logged_query( + env.cr, """ + ALTER TABLE account_asset + DROP CONSTRAINT account_asset_parent_id_fkey""", + ) + openupgrade.logged_query( + env.cr, """ + ALTER TABLE account_asset_profile + DROP CONSTRAINT account_asset_profile_parent_id_fkey""", + ) + move_view_assets(env.cr) diff --git a/account_asset_management/models/account_asset.py b/account_asset_management/models/account_asset.py index 3e15c7c8d..c2ef18192 100644 --- a/account_asset_management/models/account_asset.py +++ b/account_asset_management/models/account_asset.py @@ -80,9 +80,12 @@ class AccountAsset(models.Model): readonly=True, required=True, states={'draft': [('readonly', False)]}) - group_id = fields.Many2one( + group_ids = fields.Many2many( comodel_name='account.asset.group', - string='Asset Group') + relation="account_asset_group_rel", + column1="asset_id", + column2="group_id", + string='Asset Groups') date_start = fields.Date( string='Asset Start Date', readonly=True, @@ -276,6 +279,7 @@ class AccountAsset(models.Model): 'method_progress_factor': profile.method_progress_factor, 'prorata': profile.prorata, 'account_analytic_id': profile.account_analytic_id, + 'group_ids': profile.group_ids, }) @api.onchange('method_time') diff --git a/account_asset_management/models/account_asset_group.py b/account_asset_management/models/account_asset_group.py index c331ed919..d05870ce1 100644 --- a/account_asset_management/models/account_asset_group.py +++ b/account_asset_management/models/account_asset_group.py @@ -1,4 +1,5 @@ # Copyright 2009-2018 Noviat +# Copyright 2019 Tecnativa - Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, fields, models @@ -8,11 +9,15 @@ class AccountAssetGroup(models.Model): _name = 'account.asset.group' _description = 'Asset Group' _order = 'name' + _parent_store = True name = fields.Char(string='Name', size=64, required=True, index=True) + code = fields.Char(index=True) + parent_path = fields.Char(index=True) company_id = fields.Many2one( comodel_name='res.company', - string='Company', required=True, + string='Company', + required=True, default=lambda self: self._default_company_id()) parent_id = fields.Many2one( comodel_name='account.asset.group', diff --git a/account_asset_management/models/account_asset_profile.py b/account_asset_management/models/account_asset_profile.py index 78ad71353..f2f03fa17 100644 --- a/account_asset_management/models/account_asset_profile.py +++ b/account_asset_management/models/account_asset_profile.py @@ -47,9 +47,12 @@ class AccountAssetProfile(models.Model): comodel_name='res.company', string='Company', required=True, default=lambda self: self._default_company_id()) - group_id = fields.Many2one( + group_ids = fields.Many2many( comodel_name='account.asset.group', - string='Asset Group') + relation="account_asset_profile_group_rel", + column1="profile_id", + column2="group_id", + string='Asset Groups') method = fields.Selection( selection=lambda self: self._selection_method(), string='Computation Method', diff --git a/account_asset_management/views/account_asset.xml b/account_asset_management/views/account_asset.xml index d2566e87e..8c28fe939 100644 --- a/account_asset_management/views/account_asset.xml +++ b/account_asset_management/views/account_asset.xml @@ -53,7 +53,7 @@ - + diff --git a/account_asset_management/views/account_asset_group.xml b/account_asset_management/views/account_asset_group.xml index 8515fab14..27cb1e29f 100644 --- a/account_asset_management/views/account_asset_group.xml +++ b/account_asset_management/views/account_asset_group.xml @@ -10,6 +10,7 @@ + @@ -22,8 +23,9 @@ account.asset.group.tree account.asset.group - + + @@ -36,6 +38,7 @@ + diff --git a/account_asset_management/views/account_asset_profile.xml b/account_asset_management/views/account_asset_profile.xml index 18acff623..b6053505b 100644 --- a/account_asset_management/views/account_asset_profile.xml +++ b/account_asset_management/views/account_asset_profile.xml @@ -10,7 +10,7 @@ - +