diff --git a/server_environment/readme/CONFIGURE.rst b/server_environment/readme/CONFIGURE.rst index b3e8024c..546b1fa0 100644 --- a/server_environment/readme/CONFIGURE.rst +++ b/server_environment/readme/CONFIGURE.rst @@ -24,6 +24,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 8fc73568..a4e44e1b 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 ef89a79b..2b98c7a6 100644 --- a/server_environment/server_env.py +++ b/server_environment/server_env.py @@ -100,6 +100,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 type(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"]) @@ -112,6 +125,7 @@ def _load_config_from_server_env_files(config_p): config_p.read(conf_files) except Exception as e: raise Exception('Cannot read config files "{}": {}'.format(conf_files, e)) + _update_odoo_config_options(config_p) def _load_config_from_rcfile(config_p): diff --git a/server_environment/tests/test_server_environment.py b/server_environment/tests/test_server_environment.py index 0abc84ae..cfdb5030 100644 --- a/server_environment/tests/test_server_environment.py +++ b/server_environment/tests/test_server_environment.py @@ -1,6 +1,6 @@ # Copyright 2018 Camptocamp (https://www.camptocamp.com). # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) - +import os from unittest.mock import patch from odoo.tools.config import config as odoo_config @@ -45,3 +45,61 @@ def test_value_retrival(self): 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 544e95b2..46da7848 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