diff --git a/server_environment_ir_config_parameter/models/ir_config_parameter.py b/server_environment_ir_config_parameter/models/ir_config_parameter.py index 506a0ed..21bf67f 100644 --- a/server_environment_ir_config_parameter/models/ir_config_parameter.py +++ b/server_environment_ir_config_parameter/models/ir_config_parameter.py @@ -39,8 +39,18 @@ class IrConfigParameter(models.Model): # should we have preloaded values in database at, # server startup, modules loading their parameters # from data files would break on unique key error. - self.sudo().set_param(key, cvalue) - value = cvalue + if not self.env.context.get("_from_get_param", 0): + # the check is to avoid recursion, for instance the mail + # addon has an override in ir.config_parameter::write which + # calls get_param if we are setting mail.catchall.alias and + # this will cause an infinite recursion. We cut that + # recursion by using the context check. + # + # The mail addon call to get_param expects to get the value + # *before* the change, so we have to return the database + # value in that case + self.sudo().with_context(_from_get_param=1).set_param(key, cvalue) + value = cvalue if value is None: return default return value diff --git a/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py b/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py index ba5bb1b..b8e9485 100644 --- a/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py +++ b/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py @@ -14,9 +14,10 @@ class TestEnv(ServerEnvironmentCase): def setUp(self): super().setUp() self.ICP = self.env["ir.config_parameter"] - self.env_config = ( - "[ir.config_parameter]\n" "ircp_from_config=config_value\n" "ircp_empty=\n" - ) + self.env_config = """[ir.config_parameter] +ircp_from_config=config_value +ircp_empty= +mail.catchall.alias=my_alias""" def _load_xml(self, module, filepath): convert_file( @@ -102,3 +103,16 @@ class TestEnv(ServerEnvironmentCase): ) value = self.ICP.get_param("ircp_from_config") self.assertEqual(value, "config_value") + + def test_read_mail_catchall_alias(self): + """read mail.catchall.alias from server env: + + this must not break the mail addon's overload""" + with self.load_config( + public=self.env_config, serv_config_class=ir_config_parameter + ): + value = self.ICP.get_param("mail.catchall.alias") + self.assertEqual(value, "my_alias") + res = self.ICP.search([("key", "=", "mail.catchall.alias")]) + self.assertEqual(len(res), 1) + self.assertEqual(res.value, "my_alias")