From 8977c4f5c22fda31a9a874ae566ee42495a92ba6 Mon Sep 17 00:00:00 2001 From: duongtq Date: Fri, 5 Jul 2024 10:26:32 +0700 Subject: [PATCH 1/2] [IMP] edi_storage_oca: Add script to migrate to v16 --- .../migrations/16.0.1.0.0/pre-migrate.py | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 edi_storage_oca/migrations/16.0.1.0.0/pre-migrate.py diff --git a/edi_storage_oca/migrations/16.0.1.0.0/pre-migrate.py b/edi_storage_oca/migrations/16.0.1.0.0/pre-migrate.py new file mode 100644 index 000000000..13a23baed --- /dev/null +++ b/edi_storage_oca/migrations/16.0.1.0.0/pre-migrate.py @@ -0,0 +1,79 @@ +# Copyright 2024 Camptocamp +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + +from odoo.tools.sql import create_column + +from odoo.addons.http_routing.models.ir_http import slugify + + +@openupgrade.migrate() +def migrate(env, version): + if not version: + return + + required_modules = ("storage_backend", "edi_storage_oca") + if not env["ir.module.module"].search( + [("name", "in", required_modules), ("state", "=", "installed")] + ): + return + if not openupgrade.column_exists(env.cr, "edi_backend", "new_storage_id"): + create_column(env.cr, "edi_backend", "new_storage_id", "int4") + + _create_fs_storage_records(env) + + if openupgrade.column_exists(env.cr, "edi_backend", "new_storage_id"): + _column_renames = { + "edi_backend": [ + ("storage_id", "old_storage_id"), + ("new_storage_id", "storage_id"), + ], + } + openupgrade.rename_columns(env.cr, _column_renames) + + +def _create_fs_storage_records(env): + # Create a fs.storage record for each backend.storage + storage_backend_records = env["storage.backend"].search([]) + if not storage_backend_records: + return + + # make sure all backend_type can be mapped even if corresponding modules + # have not been migrated (on purpose because we should switch to fs_storage) + selection = [ + ("filesystem", "Filesystem"), + ("ftp", "FTP"), + ("sftp", "SFTP"), + ("s3", "S3"), + ] + env["storage.backend"]._fields["backend_type"].selection = selection + env["storage.backend"]._fields["backend_type_env_default"].selection = selection + + fs_storage = env["fs.storage"] + for record in storage_backend_records: + protocol = "file" + if record.backend_type == "ftp": + protocol = "ftp" + elif record.backend_type == "sftp": + protocol = "sftp" + elif record.backend_type == "s3": + protocol = "s3" + + code = slugify(record.name).replace("-", "_") + if fs_storage.search([("code", "=", code)]): + code = "%s_%d" % (code, record.id) + + res_id = fs_storage.create( + { + "name": record.name, + "code": code, + "protocol": protocol, + "directory_path": record.directory_path, + } + ) + + env.cr.execute( + "UPDATE edi_backend SET new_storage_id = %s WHERE storage_id = %s", + (res_id.id, record.id), + ) From d75666d8ee7ae2b189b358a300da15dc36efbe3a Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Thu, 19 Dec 2024 21:14:16 +0100 Subject: [PATCH 2/2] [OU] edi_storage_oca: Finish migration scripts --- .../migrations/16.0.1.0.0/post-migrate.py | 97 +++++++++++++++++++ .../migrations/16.0.1.0.0/pre-migrate.py | 77 ++------------- 2 files changed, 103 insertions(+), 71 deletions(-) create mode 100644 edi_storage_oca/migrations/16.0.1.0.0/post-migrate.py diff --git a/edi_storage_oca/migrations/16.0.1.0.0/post-migrate.py b/edi_storage_oca/migrations/16.0.1.0.0/post-migrate.py new file mode 100644 index 000000000..67b3583be --- /dev/null +++ b/edi_storage_oca/migrations/16.0.1.0.0/post-migrate.py @@ -0,0 +1,97 @@ +# Copyright 2024 Camptocamp SA (http://www.camptocamp.com) +# Copyright 2024 Dixmit +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging + +from openupgradelib import openupgrade + +from odoo.addons.http_routing.models.ir_http import slugify + +_logger = logging.getLogger(__name__) + + +def _get_storage_vals(code, record): + protocol = "odoofs" + options = record + if record["backend_type"] == "filesystem": + protocol = "file" + options = {} + + if record["backend_type"] == "ftp": + protocol = "ftp" + options = { + "host": record["ftp_server"], + "port": record["ftp_server"], + "username": record["ftp_login"], + "password": record["ftp_password"], + } + if record["backend_type"] == "sftp": + protocol = "sftp" + options = { + "host": record["sftp_host"], + "ssh_kwargs": { + "port": record["sftp_port"], + }, + } + if record["sftp_auth_method"] == "pwd": + options["ssh_kwargs"].update( + { + "username": record["sftp_user"], + "password": record["sftp_password"], + } + ) + elif record["sftp_auth_method"] == "ssh_key": + _logger.warning( + "SSH Key requires a PrivateKey file, but we are " + "providing a string. Please check the migration." + ) + options["ssh_kwargs"].update( + { + "pkey": record["sftp_private_key"], + } + ) + if record["backend_type"] == "s3": + protocol = "s3" + options = { + "endpoint_url": record["aws_host"], + "key": record["aws_access_key_id"], + "secret": record["aws_secret_access_key"], + } + return { + "name": record["name"], + "code": code, + "protocol": protocol, + "options": options, + "directory_path": record["directory_path"], + } + + +@openupgrade.migrate() +def migrate(env, version): + # make sure all backend_type can be mapped even if corresponding modules + # have not been migrated (on purpose because we should switch to fs_storage) + env.cr.execute( + """ + SELECT * FROM storage_backend + WHERE id in (SELECT storage_id FROM edi_backend WHERE storage_id IS NOT NULL) + """ + ) + storage_field = openupgrade.get_legacy_name("storage_id") + column_names = [desc[0] for desc in env.cr.description] + storage_backend_records = [] + for row in env.cr.fetchall(): + storage_backend_records.append(dict(zip(column_names, row))) + fs_storage = env["fs.storage"] + + for record in storage_backend_records: + code = slugify(record.get("name")).replace("-", "_") + if fs_storage.search([("code", "=", code)]): + code = "%s_%d" % (code, record.id) + + res_id = fs_storage.create(_get_storage_vals(code, record)) + + env.cr.execute( + f"UPDATE edi_backend SET {storage_field} = %s WHERE storage_id = %s", + (res_id.id, record["id"]), + ) diff --git a/edi_storage_oca/migrations/16.0.1.0.0/pre-migrate.py b/edi_storage_oca/migrations/16.0.1.0.0/pre-migrate.py index 13a23baed..4b0a2ea5e 100644 --- a/edi_storage_oca/migrations/16.0.1.0.0/pre-migrate.py +++ b/edi_storage_oca/migrations/16.0.1.0.0/pre-migrate.py @@ -1,79 +1,14 @@ # Copyright 2024 Camptocamp +# Copyright 2024 Dixmit # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from openupgradelib import openupgrade -from odoo.tools.sql import create_column - -from odoo.addons.http_routing.models.ir_http import slugify - @openupgrade.migrate() def migrate(env, version): - if not version: - return - - required_modules = ("storage_backend", "edi_storage_oca") - if not env["ir.module.module"].search( - [("name", "in", required_modules), ("state", "=", "installed")] - ): - return - if not openupgrade.column_exists(env.cr, "edi_backend", "new_storage_id"): - create_column(env.cr, "edi_backend", "new_storage_id", "int4") - - _create_fs_storage_records(env) - - if openupgrade.column_exists(env.cr, "edi_backend", "new_storage_id"): - _column_renames = { - "edi_backend": [ - ("storage_id", "old_storage_id"), - ("new_storage_id", "storage_id"), - ], - } - openupgrade.rename_columns(env.cr, _column_renames) - - -def _create_fs_storage_records(env): - # Create a fs.storage record for each backend.storage - storage_backend_records = env["storage.backend"].search([]) - if not storage_backend_records: - return - - # make sure all backend_type can be mapped even if corresponding modules - # have not been migrated (on purpose because we should switch to fs_storage) - selection = [ - ("filesystem", "Filesystem"), - ("ftp", "FTP"), - ("sftp", "SFTP"), - ("s3", "S3"), - ] - env["storage.backend"]._fields["backend_type"].selection = selection - env["storage.backend"]._fields["backend_type_env_default"].selection = selection - - fs_storage = env["fs.storage"] - for record in storage_backend_records: - protocol = "file" - if record.backend_type == "ftp": - protocol = "ftp" - elif record.backend_type == "sftp": - protocol = "sftp" - elif record.backend_type == "s3": - protocol = "s3" - - code = slugify(record.name).replace("-", "_") - if fs_storage.search([("code", "=", code)]): - code = "%s_%d" % (code, record.id) - - res_id = fs_storage.create( - { - "name": record.name, - "code": code, - "protocol": protocol, - "directory_path": record.directory_path, - } - ) - - env.cr.execute( - "UPDATE edi_backend SET new_storage_id = %s WHERE storage_id = %s", - (res_id.id, record.id), - ) + """ + We just move the data to a new column. + Data will be moved on post-migration + """ + openupgrade.rename_columns(env.cr, {"edi_backend": [("storage_id", None)]})