163 lines
5.1 KiB
Python
163 lines
5.1 KiB
Python
from pathlib import Path
|
|
|
|
import click
|
|
from jinja2 import Template
|
|
from loguru import logger
|
|
from odoo_openupgrade_wizard.tools_system import ensure_folder_exists
|
|
|
|
from odoo_openupgrade_wizard.configuration_version_dependant import (
|
|
_get_odoo_version_str_list,
|
|
_get_odoo_versions,
|
|
)
|
|
from odoo_openupgrade_wizard.templates import (
|
|
_CONFIG_YML_TEMPLATE,
|
|
_POST_MIGRATION_PY_TEMPLATE,
|
|
_PRE_MIGRATION_SQL_TEMPLATE,
|
|
_REPO_YML_TEMPLATE,
|
|
_REQUIREMENTS_TXT_TEMPLATE,
|
|
)
|
|
|
|
|
|
@click.command()
|
|
@click.option(
|
|
"-iv",
|
|
"--initial-version",
|
|
required=True,
|
|
prompt=True,
|
|
type=click.Choice(_get_odoo_version_str_list("initial")),
|
|
)
|
|
@click.option(
|
|
"-fv",
|
|
"--final-version",
|
|
required=True,
|
|
prompt=True,
|
|
type=click.Choice(_get_odoo_version_str_list("final")),
|
|
)
|
|
@click.option(
|
|
"-er",
|
|
"--extra-repository",
|
|
"extra_repository_list",
|
|
# TODO, add a callback to check the quality of the argument
|
|
help="Coma separated extra repositories to use in the odoo environment."
|
|
"Ex: 'OCA/web,OCA/server-tools,GRAP/grap-odoo-incubator'",
|
|
)
|
|
@click.pass_context
|
|
def init(ctx, initial_version, final_version, extra_repository_list):
|
|
"""
|
|
Initialize OpenUpgrade Wizard Environment based on the initial and
|
|
the final version of Odoo you want to migrate.
|
|
"""
|
|
# 1. ensure src folder exists
|
|
ensure_folder_exists(ctx.obj["src_folder_path"], mode="777")
|
|
|
|
# 2. ensure filestore folder exists
|
|
ensure_folder_exists(ctx.obj["filestore_folder_path"], mode="777")
|
|
|
|
# 3. Create main config file
|
|
series = _get_odoo_versions(float(initial_version), float(final_version))
|
|
|
|
# Create initial first step
|
|
steps = [series[0].copy()]
|
|
steps[0].update(
|
|
{
|
|
"name": "step_1",
|
|
"action": "update",
|
|
"complete_name": "step_1__update__%s" % (steps[0]["version"]),
|
|
}
|
|
)
|
|
|
|
# Add all upgrade steps
|
|
count = 1
|
|
for serie in series[1:]:
|
|
steps.append(serie.copy())
|
|
steps[count].update(
|
|
{
|
|
"name": "step_%d" % (count + 1),
|
|
"action": "upgrade",
|
|
"complete_name": "step_%d__upgrade__%s"
|
|
% (count + 1, serie["version"]),
|
|
}
|
|
)
|
|
count += 1
|
|
|
|
# add final update step
|
|
steps.append(series[-1].copy())
|
|
steps[-1].update(
|
|
{
|
|
"name": "step_%d" % (count + 1),
|
|
"action": "update",
|
|
"complete_name": "step_%d__update__%s"
|
|
% (count + 1, steps[-1]["version"]),
|
|
}
|
|
)
|
|
|
|
template = Template(_CONFIG_YML_TEMPLATE)
|
|
output = template.render(steps=steps)
|
|
with open(ctx.obj["config_file_path"], "w") as f:
|
|
logger.info(
|
|
"Creating configuration file '%s' ..."
|
|
% (ctx.obj["config_file_path"])
|
|
)
|
|
f.write(output)
|
|
f.close()
|
|
|
|
distinct_versions = list(set(x["version"] for x in series))
|
|
|
|
# 4. Create Repo folder and files
|
|
ensure_folder_exists(ctx.obj["repo_folder_path"])
|
|
|
|
extra_repositories = extra_repository_list.split(",")
|
|
|
|
orgs = {x: [] for x in set([x.split("/")[0] for x in extra_repositories])}
|
|
for extra_repository in extra_repositories:
|
|
org, repo = extra_repository.split("/")
|
|
orgs[org].append(repo)
|
|
|
|
for version in distinct_versions:
|
|
template = Template(_REPO_YML_TEMPLATE)
|
|
output = template.render(version=version, orgs=orgs)
|
|
file_name = ctx.obj["repo_folder_path"] / Path("%s.yml" % (version))
|
|
with open(file_name, "w") as f:
|
|
logger.info("Creating Repo file '%s' ..." % (file_name))
|
|
f.write(output)
|
|
f.close()
|
|
|
|
# 5. Create Requirements folder and files
|
|
ensure_folder_exists(ctx.obj["requirement_folder_path"])
|
|
|
|
for serie in series:
|
|
template = Template(_REQUIREMENTS_TXT_TEMPLATE)
|
|
output = template.render(python_libraries=serie["python_libraries"])
|
|
file_name = ctx.obj["requirement_folder_path"] / Path(
|
|
"%s_requirements.txt" % (serie["version"])
|
|
)
|
|
with open(file_name, "w") as f:
|
|
logger.info("Creating Requirements file '%s' ..." % (file_name))
|
|
f.write(output)
|
|
f.close()
|
|
|
|
# 6. Create Scripts folder and files
|
|
ensure_folder_exists(ctx.obj["script_folder_path"])
|
|
|
|
for step in steps:
|
|
step_path = ctx.obj["script_folder_path"] / step["complete_name"]
|
|
ensure_folder_exists(step_path)
|
|
template = Template(_PRE_MIGRATION_SQL_TEMPLATE)
|
|
output = template.render()
|
|
file_name = step_path / Path("pre-migration.sql")
|
|
with open(file_name, "w") as f:
|
|
logger.info(
|
|
"Creating pre-migration.sql file '%s' ..." % (file_name)
|
|
)
|
|
f.write(output)
|
|
f.close()
|
|
template = Template(_POST_MIGRATION_PY_TEMPLATE)
|
|
output = template.render()
|
|
file_name = step_path / Path("post-migration.py")
|
|
with open(file_name, "w") as f:
|
|
logger.info(
|
|
"Creating post-migration.py file '%s' ..." % (file_name)
|
|
)
|
|
f.write(output)
|
|
f.close()
|