From 9996a48cf7a82cbf6bcdc77adae100a3c83d8dcd Mon Sep 17 00:00:00 2001
From: Pierre Verkest
Date: Fri, 16 Jun 2023 14:43:55 +0200
Subject: [PATCH] [IMP] server_environmnet: allow to overwrite odoo config
options from server_environment_files
---
server_environment/README.rst | 9 ++-
server_environment/readme/CONFIGURE.rst | 6 ++
server_environment/readme/DESCRIPTION.rst | 3 +-
server_environment/server_env.py | 14 +++++
.../static/description/index.html | 10 +++-
.../tests/test_server_environment.py | 58 +++++++++++++++++++
.../tests/testfiles/testing/base.conf | 3 +
7 files changed, 99 insertions(+), 4 deletions(-)
diff --git a/server_environment/README.rst b/server_environment/README.rst
index bd8bcff..9edfba0 100644
--- a/server_environment/README.rst
+++ b/server_environment/README.rst
@@ -36,7 +36,8 @@ environments are stored in the ``server_environment_files`` companion
module.
The ``server_environment_files`` module is optional, the values can be set using
-an environment variable with a fallback on default values in the database.
+an environment variable with a fallback on default values in the database. you
+will be able to overwrite some odoo options.
The configuration read from the files are visible under the Configuration
menu. If you are not in the 'dev' environment you will not be able to
@@ -96,6 +97,12 @@ You can edit the settings you need in the ``server_environment_files`` addon. Th
and can override or extend default values;
* you can override or extend values in the main configuration
file of your instance;
+* In some platforms (like odoo.sh where production config file is copied to staging)
+ it can be usefull to overwrite options write in the `[options]` section. You must
+ allow the overwrite by adding `server_environment_allow_overwrite_options_section = True``
+ to the former `odoo.cfg` config file or through the environment variable:
+ `export SERVER_ENVIRONMENT_ALLOW_OVERWRITE_OPTIONS_SECTION=True` (if both are set
+ config file take precedent).
Environment variable
~~~~~~~~~~~~~~~~~~~~
diff --git a/server_environment/readme/CONFIGURE.rst b/server_environment/readme/CONFIGURE.rst
index 28b91f0..36cdcdf 100644
--- a/server_environment/readme/CONFIGURE.rst
+++ b/server_environment/readme/CONFIGURE.rst
@@ -30,6 +30,12 @@ You can edit the settings you need in the ``server_environment_files`` addon. Th
and can override or extend default values;
* you can override or extend values in the main configuration
file of your instance;
+* In some platforms (like odoo.sh where production config file is copied to staging)
+ it can be usefull to overwrite options write in the `[options]` section. You must
+ allow the overwrite by adding `server_environment_allow_overwrite_options_section = True``
+ to the former `odoo.cfg` config file or through the environment variable:
+ `export SERVER_ENVIRONMENT_ALLOW_OVERWRITE_OPTIONS_SECTION=True` (if both are set
+ config file take precedent).
Environment variable
~~~~~~~~~~~~~~~~~~~~
diff --git a/server_environment/readme/DESCRIPTION.rst b/server_environment/readme/DESCRIPTION.rst
index 8fc7356..a4e44e1 100644
--- a/server_environment/readme/DESCRIPTION.rst
+++ b/server_environment/readme/DESCRIPTION.rst
@@ -6,7 +6,8 @@ environments are stored in the ``server_environment_files`` companion
module.
The ``server_environment_files`` module is optional, the values can be set using
-an environment variable with a fallback on default values in the database.
+an environment variable with a fallback on default values in the database. you
+will be able to overwrite some odoo options.
The configuration read from the files are visible under the Configuration
menu. If you are not in the 'dev' environment you will not be able to
diff --git a/server_environment/server_env.py b/server_environment/server_env.py
index 3ea690e..f8e8d02 100644
--- a/server_environment/server_env.py
+++ b/server_environment/server_env.py
@@ -107,6 +107,19 @@ def _listconf(env_path):
return files
+def _update_odoo_config_options(config_p):
+ allow_overwrite = system_base_config.get(
+ "server_environment_allow_overwrite_options_section",
+ os.environ.get("SERVER_ENVIRONMENT_ALLOW_OVERWRITE_OPTIONS_SECTION"),
+ )
+ if isinstance(allow_overwrite, str) and allow_overwrite:
+ allow_overwrite = _boolean_states.get(allow_overwrite.lower(), False)
+ if allow_overwrite and config_p.has_section("options"):
+ system_base_config.options.update(
+ {k: v for k, v in config_p["options"].items()}
+ )
+
+
def _load_config_from_server_env_files(config_p):
default = os.path.join(_dir, "default")
running_env = os.path.join(_dir, system_base_config["running_env"])
@@ -121,6 +134,7 @@ def _load_config_from_server_env_files(config_p):
raise Exception(
'Cannot read config files "{}": {}'.format(conf_files, e)
) from e
+ _update_odoo_config_options(config_p)
def _load_config_from_rcfile(config_p):
diff --git a/server_environment/static/description/index.html b/server_environment/static/description/index.html
index 052178d..012164c 100644
--- a/server_environment/static/description/index.html
+++ b/server_environment/static/description/index.html
@@ -1,4 +1,3 @@
-
@@ -377,7 +376,8 @@ the main configuration file, and the values for the various possible
environments are stored in the server_environment_files companion
module.
The server_environment_files module is optional, the values can be set using
-an environment variable with a fallback on default values in the database.
+an environment variable with a fallback on default values in the database. you
+will be able to overwrite some odoo options.
The configuration read from the files are visible under the Configuration
menu. If you are not in the ‘dev’ environment you will not be able to
see the values contained in the defined secret keys
@@ -443,6 +443,12 @@ environment.
and can override or extend default values;
you can override or extend values in the main configuration
file of your instance;
+In some platforms (like odoo.sh where production config file is copied to staging)
+it can be usefull to overwrite options write in the [options] section. You must
+allow the overwrite by adding server_environment_allow_overwrite_options_section = True`
+to the former odoo.cfg config file or through the environment variable:
+export SERVER_ENVIRONMENT_ALLOW_OVERWRITE_OPTIONS_SECTION=True (if both are set
+config file take precedent).
diff --git a/server_environment/tests/test_server_environment.py b/server_environment/tests/test_server_environment.py
index 253d6c6..9ae8e52 100644
--- a/server_environment/tests/test_server_environment.py
+++ b/server_environment/tests/test_server_environment.py
@@ -58,3 +58,61 @@ class TestEnv(common.ServerEnvironmentCase):
self.assertEqual(val, "testing")
val = parser.get("external_service.ftp", "host")
self.assertEqual(val, "sftp.example.com")
+
+ @patch.dict(os.environ, {"SERVER_ENVIRONMENT_ALLOW_OVERWRITE_OPTIONS_SECTION": "0"})
+ @patch.dict(
+ odoo_config.options,
+ {
+ "running_env": "testing",
+ "server_environment_allow_overwrite_options_section": True,
+ "odoo_test_option": "fake odoo config",
+ },
+ )
+ def test_server_environment_allow_overwrite_options_section(self):
+ with self.set_config_dir("testfiles"):
+ server_env._load_config()
+ self.assertEqual(
+ odoo_config["odoo_test_option"], "Set in config file for testing env"
+ )
+
+ @patch.dict(os.environ, {"SERVER_ENVIRONMENT_ALLOW_OVERWRITE_OPTIONS_SECTION": "1"})
+ @patch.dict(
+ odoo_config.options,
+ {
+ "running_env": "testing",
+ "server_environment_allow_overwrite_options_section": False,
+ "odoo_test_option": "fake odoo config",
+ },
+ )
+ def test_server_environment_disabled_overwrite_options_section(self):
+ with self.set_config_dir("testfiles"):
+ server_env._load_config()
+ self.assertEqual(odoo_config["odoo_test_option"], "fake odoo config")
+
+ @patch.dict(os.environ, {"SERVER_ENVIRONMENT_ALLOW_OVERWRITE_OPTIONS_SECTION": "1"})
+ @patch.dict(
+ odoo_config.options,
+ {
+ "running_env": "testing",
+ "odoo_test_option": "fake odoo config",
+ },
+ )
+ def test_server_environment_allow_overwrite_options_section_by_env(self):
+ with self.set_config_dir("testfiles"):
+ server_env._load_config()
+ self.assertEqual(
+ odoo_config["odoo_test_option"], "Set in config file for testing env"
+ )
+
+ @patch.dict(os.environ, {"SERVER_ENVIRONMENT_ALLOW_OVERWRITE_OPTIONS_SECTION": "0"})
+ @patch.dict(
+ odoo_config.options,
+ {
+ "running_env": "testing",
+ "odoo_test_option": "fake odoo config",
+ },
+ )
+ def test_server_environment_disabled_overwrite_options_section_by_env(self):
+ with self.set_config_dir("testfiles"):
+ server_env._load_config()
+ self.assertEqual(odoo_config["odoo_test_option"], "fake odoo config")
diff --git a/server_environment/tests/testfiles/testing/base.conf b/server_environment/tests/testfiles/testing/base.conf
index 544e95b..46da784 100644
--- a/server_environment/tests/testfiles/testing/base.conf
+++ b/server_environment/tests/testfiles/testing/base.conf
@@ -1,2 +1,5 @@
+[options]
+odoo_test_option = Set in config file for testing env
+
[external_service.ftp]
user = testing