Migrating from odoo.conf

Use this guide when you already run Odoo with a normal odoo.conf file and want to switch to oduit’s sectioned TOML config without rewriting everything by hand.

One-command import

cd /path/to/odoo-project

uvx oduit init dev \
  --from-conf ./odoo.conf \
  --python-bin ./.venv/bin/python \
  --odoo-bin ./odoo-bin

This writes ~/.config/oduit/dev.toml by default. If you want a project-local config instead, use:

oduit init dev --from-conf ./odoo.conf --local

Preview without writing a file:

oduit init dev --from-conf ./odoo.conf --dry-run

The generated file uses the sectioned TOML format:

[binaries]
python_bin = "./.venv/bin/python"
odoo_bin = "./odoo-bin"

[odoo_params]
db_name = "mydb"
addons_path = ["./odoo/addons", "./custom/addons"]
config_file = "./odoo.conf"

Inspect the generated config

oduit --env dev print-config

Check at least:

  • python_bin

  • odoo_bin

  • db_name

  • addons_path

  • config_file

Validate the environment

oduit --env dev doctor
oduit --env dev list-addons
oduit --env dev list-duplicates
oduit --env dev version

Use the migrated config

oduit --env dev run
oduit --env dev shell
oduit --env dev update my_module
oduit --env dev test --test-tags /my_module

Do not commit secrets

The generated TOML may contain secrets imported from odoo.conf, including database, admin, and SMTP passwords. Do not commit it unless that is intended for your project. Keep .oduit.toml or environment-specific TOML files out of version control when needed.

Suggested no-pytest validation commands

Run these from the repository root when you want a quick smoke path without running pytest.

Static syntax check

python -m py_compile \
  oduit/config_loader.py \
  oduit/config_provider.py \
  oduit/builders.py \
  oduit/cli/init_env.py \
  oduit/cli/register_app_commands.py \
  tests/test_cli_app.py \
  tests/test_config_provider.py \
  tests/test_builders.py \
  tests/test_docs_surface.py

Manual conversion smoke test

tmpdir="$(mktemp -d)"
home="$tmpdir/home"
mkdir -p "$home"

cat > "$tmpdir/odoo.conf" <<'EOF'
[options]
db_name = migrated_db
db_user = odoo
db_password = secret
db_host = localhost
db_port = 5432
addons_path = /opt/odoo/addons,/opt/custom/addons
http_port = 8069
workers = 2
proxy_mode = True
log_level = info
EOF

HOME="$home" python -m oduit.cli.app init dev \
  --from-conf "$tmpdir/odoo.conf" \
  --python-bin /usr/bin/python3 \
  --odoo-bin /opt/odoo/odoo-bin \
  --coverage-bin /usr/bin/coverage

cat "$home/.config/oduit/dev.toml"
grep -q '^\[binaries\]' "$home/.config/oduit/dev.toml"
grep -q '^\[odoo_params\]' "$home/.config/oduit/dev.toml"
grep -q 'db_name = "migrated_db"' "$home/.config/oduit/dev.toml"
grep -q 'config_file = ' "$home/.config/oduit/dev.toml"
grep -q 'addons_path = \[' "$home/.config/oduit/dev.toml"

Builder smoke check after config_file fix

python - <<'PY'
from oduit.config_provider import ConfigProvider
from oduit.builders import RunCommandBuilder

config = ConfigProvider(
    {
        "python_bin": "python3",
        "odoo_bin": "odoo-bin",
        "config_file": "/etc/odoo/odoo.conf",
        "db_name": "migrated_db",
    }
)

cmd = RunCommandBuilder(config).build_operation().command
print(cmd)

assert "--config=/etc/odoo/odoo.conf" in cmd
assert "--database=migrated_db" in cmd
PY