2
0
account-financial-tools/account_asset_management/migrations/8.0.3/pre-migration.py

149 lines
5.2 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2009-2017 Noviat
# Copyright OpenUpgrade contributors (https://github.com/oca/openupgradelib)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
_logger = logging.getLogger(__name__)
_logger.setLevel(logging.DEBUG)
column_renames = {
'account_account': [
('asset_category_id', 'asset_profile_id', 'Asset Profile'),
],
'account_asset': [
('asset_value', 'depreciation_base', 'Depreciation Base'),
('category_id', 'profile_id', 'Asset Profile'),
],
'account_invoice_line': [
('asset_category_id', 'asset_profile_id', 'Asset Profile'),
],
'account_move_line': [
('asset_category_id', 'asset_profile_id', 'Asset Profile'),
],
}
table_renames = [
('account_asset_asset', 'account_asset'),
('account_asset_category', 'account_asset_profile'),
('account_asset_depreciation_line', 'account_asset_line')]
model_renames = [
('account.asset.asset', 'account.asset'),
('account.asset.category', 'account.asset.profile'),
('account.asset.depreciation.line', 'account.asset.line')]
view_refs = [
'account_asset_management.view_account_asset_form',
'account_asset_management.view_invoice_asset_category',
'account_asset_management.view_account_invoice_asset_form',
'account_asset_management.view_account_move_line_form_inherit',
'account_asset_management.view_account_move_asset_form'
]
def is_module_installed(cr, module):
""" Check if `module` is installed.
:return: True / False
"""
cr.execute(
"SELECT id FROM ir_module_module "
"WHERE name=%s and state IN ('installed', 'to upgrade')", (module,))
return bool(cr.fetchone())
def table_exists(cr, table):
""" Check whether a certain table or view exists """
cr.execute('SELECT 1 FROM pg_class WHERE relname = %s', (table,))
return cr.fetchone()
def rename_columns(cr, column_spec):
for table in column_spec.keys():
for (old, new, comment) in column_spec[table]:
cr.execute(
"SELECT column_name "
"FROM information_schema.columns "
"WHERE table_name=%s "
"AND column_name=%s",
(table, new))
res = cr.fetchone()
if not res:
_logger.info("table %s, column %s: renaming to %s",
table, old, new)
cr.execute(
'ALTER TABLE "%s" RENAME "%s" TO "%s"'
% (table, old, new,))
cr.execute('DROP INDEX IF EXISTS "%s_%s_index"' % (table, old))
if comment:
cr.execute(
"COMMENT ON COLUMN %s.%s IS '%s'"
% (table, new, comment))
def rename_tables(cr, table_spec):
to_rename = [x[0] for x in table_spec]
for old, new in list(table_spec):
if (table_exists(cr, old + '_id_seq') and
old + '_id_seq' not in to_rename):
table_spec.append((old + '_id_seq', new + '_id_seq'))
for (old, new) in table_spec:
_logger.info("table %s: renaming to %s",
old, new)
if table_exists(cr, old) and not table_exists(cr, new):
cr.execute('ALTER TABLE "%s" RENAME TO "%s"' % (old, new))
def rename_models(cr, model_spec):
for (old, new) in model_spec:
_logger.info("model %s: renaming to %s",
old, new)
cr.execute('UPDATE ir_model SET model = %s '
'WHERE model = %s', (new, old,))
cr.execute('UPDATE ir_model_fields SET relation = %s '
'WHERE relation = %s', (new, old,))
cr.execute('UPDATE ir_model_data SET model = %s '
'WHERE model = %s', (new, old,))
cr.execute('UPDATE ir_attachment SET res_model = %s '
'WHERE res_model = %s', (new, old,))
cr.execute('UPDATE ir_model_fields SET model = %s '
'WHERE model = %s', (new, old,))
cr.execute('UPDATE ir_translation set '
"name=%s || substr(name, strpos(name, ',')) "
'where name like %s',
(new, old + ',%'),)
if is_module_installed(cr, 'mail'):
# fortunately, the data model didn't change up to now
cr.execute(
'UPDATE mail_message SET model=%s where model=%s', (new, old),
)
if table_exists(cr, 'mail_followers'):
cr.execute(
'UPDATE mail_followers SET res_model=%s '
'WHERE res_model=%s',
(new, old),
)
def remove_views(cr, view_refs):
model = 'ir.ui.view'
for view_ref in view_refs:
module, name = view_ref.split('.')
cr.execute(
'SELECT res_id FROM ir_model_data '
'WHERE module = %s AND name = %s AND model = %s',
(module, name, model)
)
res = cr.fetchone()
if res:
cr.execute(
'DELETE FROM ir_ui_view WHERE id = %s', (res[0],))
def migrate(cr, version):
remove_views(cr, view_refs)
rename_tables(cr, table_renames)
rename_models(cr, model_renames)
rename_columns(cr, column_renames)