From 50f5bc4a9b6578740a2cfbbfa7cd5abc3d13697d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 6 Mar 2024 09:37:13 +0100 Subject: [PATCH] [IMP] mail: migrate alias ICP at install if they exist When adding alias domain in v17 support of configuration parameter was dropped. We moved from singleton configuration to multi domains using real models. This means most of mail support lies in mail while part of it was in base beforehand. In some cases we want to let people do some basic configuration using base module then install mail which could migrate this ICP based configuration into new models. This is notably the case with odoo.sh where mail is not always automatically installed. Use case is: install base, do some configuration using ICP allowing notably to setup website / server domains, main mail configuration, ... then let people install modules on top of that configuration which generally installs mail. With this change existing ir.config_parameters matching pre v17 names are now used to bootstrap alias domain table at mail module initialization. Task-3789584 closes odoo/odoo#156654 Signed-off-by: Thibault Delavallee (tde) --- addons/mail/__init__.py | 3 +++ addons/mail/__manifest__.py | 1 + addons/mail/models/mail_alias_domain.py | 24 +++++++++++++++++++++++ addons/mail/tests/test_mail_tools.py | 26 +++++++++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/addons/mail/__init__.py b/addons/mail/__init__.py index f3658293059..2ee7f9bb161 100644 --- a/addons/mail/__init__.py +++ b/addons/mail/__init__.py @@ -6,3 +6,6 @@ from . import tools from . import wizard from . import controllers from . import populate + +def _mail_post_init(env): + env['mail.alias.domain']._migrate_icp_to_domain() diff --git a/addons/mail/__manifest__.py b/addons/mail/__manifest__.py index 65eb3fedc72..c1447c57e9f 100644 --- a/addons/mail/__manifest__.py +++ b/addons/mail/__manifest__.py @@ -123,6 +123,7 @@ For more specific needs, you may also assign custom-defined actions ], 'installable': True, 'application': True, + 'post_init_hook': '_mail_post_init', 'assets': { 'web._assets_primary_variables': [ 'mail/static/src/**/primary_variables.scss', diff --git a/addons/mail/models/mail_alias_domain.py b/addons/mail/models/mail_alias_domain.py index 81c17e9cbe3..6576318f4fa 100644 --- a/addons/mail/models/mail_alias_domain.py +++ b/addons/mail/models/mail_alias_domain.py @@ -4,6 +4,7 @@ from odoo import api, exceptions, fields, models, _ from odoo.addons.mail.models.mail_alias import dot_atom_text + class AliasDomain(models.Model): """ Model alias domains, now company-specific. Alias domains are email domains used to receive emails through catchall and bounce aliases, as @@ -174,3 +175,26 @@ class AliasDomain(models.Model): config_values['default_from'], is_email=True ) return config_values + + @api.model + def _migrate_icp_to_domain(self): + """ Compatibility layer helping going from pre-v17 ICP to alias + domains. Mainly used when base mail configuration is done with 'base' + module only and 'mail' is installed afterwards: configuration should + not be lost (odoo.sh use case). """ + Icp = self.env['ir.config_parameter'].sudo() + alias_domain = Icp.get_param('mail.catchall.domain') + if alias_domain: + existing = self.search([('name', '=', alias_domain)]) + if existing: + return existing + bounce_alias = Icp.get_param('mail.bounce.alias') + catchall_alias = Icp.get_param('mail.catchall.alias') + default_from = Icp.get_param('mail.default.from') + return self.create({ + 'bounce_alias': bounce_alias or 'bounce', + 'catchall_alias': catchall_alias or 'catchall', + 'default_from': default_from or 'notifications', + 'name': alias_domain, + }) + return self.browse() diff --git a/addons/mail/tests/test_mail_tools.py b/addons/mail/tests/test_mail_tools.py index 02ef6ad2e50..66d58a86f61 100644 --- a/addons/mail/tests/test_mail_tools.py +++ b/addons/mail/tests/test_mail_tools.py @@ -150,3 +150,29 @@ class TestMailTools(MailCommon): self.user_employee.sudo().write({'email': '"Alfred Astaire" <%s>' % self.env.user.partner_id.email_normalized}) found = self.env['res.partner']._mail_find_partner_from_emails([self.env.user.partner_id.email_formatted]) self.assertEqual(found, [self.env.user.partner_id]) + + +@tagged('mail_tools', 'mail_init') +class TestMailUtils(MailCommon): + + def test_migrate_icp_to_domain(self): + """ Test ICP to alias domain migration """ + self.env["ir.config_parameter"].set_param("mail.catchall.domain", "test.migration.com") + self.env["ir.config_parameter"].set_param("mail.bounce.alias", "migrate+bounce") + self.env["ir.config_parameter"].set_param("mail.catchall.alias", "migrate+catchall") + self.env["ir.config_parameter"].set_param("mail.default.from", "migrate+default_from") + + existing = self.env["mail.alias.domain"].search([('name', '=', 'test.migration.com')]) + self.assertFalse(existing) + + new = self.env["mail.alias.domain"]._migrate_icp_to_domain() + self.assertEqual(new.name, "test.migration.com") + self.assertEqual(new.bounce_alias, "migrate+bounce") + self.assertEqual(new.catchall_alias, "migrate+catchall") + self.assertEqual(new.default_from, "migrate+default_from") + + again = self.env["mail.alias.domain"]._migrate_icp_to_domain() + self.assertEqual(again.name, "test.migration.com") + + existing = self.env["mail.alias.domain"].search([('name', '=', 'test.migration.com')]) + self.assertEqual(len(existing), 1, 'Should not migrate twice')