[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) <tde@openerp.com>
This commit is contained in:
Thibault Delavallée
2024-03-07 11:40:23 +00:00
parent b98fbe32a7
commit 50f5bc4a9b
4 changed files with 54 additions and 0 deletions
+3
View File
@@ -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()
+1
View File
@@ -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',
+24
View File
@@ -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()
+26
View File
@@ -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')