#import debugpy #debugpy.listen(("0.0.0.0", 5678)) #print("⏳ Warten auf Debugger-Anbindung (VS Code: Python: Remote Attach)...") #debugpy.wait_for_client() #print("✅ Debugger verbunden!") import datetime import logging import sys from pathlib import Path import click import yaml from click_loglevel import LogLevel from loguru import logger import odoo_openupgrade_wizard from odoo_openupgrade_wizard.cli.cli_copydb import copydb from odoo_openupgrade_wizard.cli.cli_docker_build import docker_build from odoo_openupgrade_wizard.cli.cli_dropdb import dropdb from odoo_openupgrade_wizard.cli.cli_dumpdb import dumpdb from odoo_openupgrade_wizard.cli.cli_estimate_workload import estimate_workload from odoo_openupgrade_wizard.cli.cli_execute_script_python import ( execute_script_python, ) from odoo_openupgrade_wizard.cli.cli_execute_script_sql import ( execute_script_sql, ) from odoo_openupgrade_wizard.cli.cli_generate_module_analysis import ( generate_module_analysis, ) from odoo_openupgrade_wizard.cli.cli_get_code import get_code from odoo_openupgrade_wizard.cli.cli_guess_requirement import guess_requirement from odoo_openupgrade_wizard.cli.cli_init import init from odoo_openupgrade_wizard.cli.cli_install_from_csv import install_from_csv from odoo_openupgrade_wizard.cli.cli_psql import psql from odoo_openupgrade_wizard.cli.cli_pull_submodule import pull_submodule from odoo_openupgrade_wizard.cli.cli_restoredb import restoredb from odoo_openupgrade_wizard.cli.cli_run import run from odoo_openupgrade_wizard.cli.cli_upgrade import upgrade from odoo_openupgrade_wizard.tools.tools_system import ensure_folder_exists DEFAULT_CONFIG_FILE = "config.yml" DEFAULT_MODULES_FILE = "modules.csv" @click.group() @click.version_option(version=odoo_openupgrade_wizard.__version__) @click.option( "--env-folder", default="./", type=click.Path( exists=True, file_okay=False, writable=True, resolve_path=True, ), help="Directory that will contain all the configuration of the wizard " "and all the Odoo code required to perform the migrations. Leave " "empty to use current directory (./).", ) @click.option( "-c", "--config-file", type=click.Path( exists=True, file_okay=True, ), help=( f"Configuration file to use. By default, a file named " f'"{DEFAULT_CONFIG_FILE}" in the environment directory will be used.' ), ) @click.option( "--modules-file", type=click.Path( exists=True, file_okay=True, ), help=( f"Modules file to use. By default, a file named " f'"{DEFAULT_MODULES_FILE}" in the environment directory will be used.' ), ) @click.option( "--filestore-folder", type=click.Path( exists=True, file_okay=False, writable=True, resolve_path=True ), help="Directory that contains the Odoo filestore of the database(s) to " "migrate. Leave empty to use the subdirectory 'filestore' of the " "environment directory.", ) @click.option("-l", "--log-level", type=LogLevel(), default=logging.INFO) @click.pass_context def main( ctx, env_folder, config_file, modules_file, filestore_folder, log_level ): """Provides a command set to perform Odoo Community Edition migrations. Instructions are provided in the README.md file, or see the help provided for each 'Command' listed below. For example, to learn more about the `init` command, run: `oow init --help` """ date_begin = datetime.datetime.now() logger.remove() logger.add(sys.stderr, level=log_level) logger.debug(f"Beginning script '{ctx.invoked_subcommand}'...") if not isinstance(ctx.obj, dict): ctx.obj = {} # Define all the folder required by the tools env_folder_path = Path(env_folder) src_folder_path = env_folder_path / Path("./src/") if filestore_folder: filestore_folder_path = filestore_folder else: filestore_folder_path = env_folder_path / "filestore" script_folder_path = env_folder_path / Path("./scripts/") log_folder_path = env_folder_path / Path("./log/") if config_file: config_file_path = Path(config_file) else: config_file_path = env_folder_path / Path(DEFAULT_CONFIG_FILE) if modules_file: module_file_path = Path(modules_file) else: module_file_path = env_folder_path / Path(DEFAULT_MODULES_FILE) if config_file_path.exists(): # Load the main configuration file with open(config_file_path) as file: config = yaml.safe_load(file) ctx.obj["config"] = config # ensure log folder exists ensure_folder_exists(log_folder_path, git_ignore_content=True) # Create log file log_prefix = "{}__{}".format( date_begin.strftime("%Y_%m_%d__%H_%M_%S"), ctx.invoked_subcommand ) log_file_path = log_folder_path / Path(log_prefix + ".log") logger.add(log_file_path) ctx.obj["log_prefix"] = log_prefix elif ctx.invoked_subcommand not in ("init", None): ctx.fail( f"Environment not initialized. " f"Expected config file at: {config_file_path}", ) # Add all global values in the context ctx.obj["env_folder_path"] = env_folder_path ctx.obj["src_folder_path"] = src_folder_path ctx.obj["filestore_folder_path"] = filestore_folder_path ctx.obj["script_folder_path"] = script_folder_path ctx.obj["log_folder_path"] = log_folder_path ctx.obj["config_file_path"] = config_file_path ctx.obj["module_file_path"] = module_file_path main.add_command(copydb) main.add_command(restoredb) main.add_command(docker_build) main.add_command(dropdb) main.add_command(dumpdb) main.add_command(estimate_workload) main.add_command(execute_script_python) main.add_command(execute_script_sql) main.add_command(generate_module_analysis) main.add_command(guess_requirement) main.add_command(get_code) main.add_command(init) main.add_command(install_from_csv) main.add_command(psql) main.add_command(pull_submodule) main.add_command(run) main.add_command(upgrade)