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')