diff --git a/addons/mail/models/mail_alias.py b/addons/mail/models/mail_alias.py index af486717f00..4d6f38767d6 100644 --- a/addons/mail/models/mail_alias.py +++ b/addons/mail/models/mail_alias.py @@ -194,11 +194,21 @@ class Alias(models.Model): :param list sanitized_names: a list of names (considered as sanitized and ready to be sent to DB); """ + valid_names = list(filter(None, sanitized_names)) + + # list itself should be unique obviously + seen = set() + dupes = [name for name in valid_names if name in seen or seen.add(name)] + if dupes: + raise UserError( + _('Email aliases %(alias_name)s cannot be used on several records at the same time. Please update records one by one.', + alias_name=', '.join(dupes)) + ) + catchall_alias = self.env['ir.config_parameter'].sudo().get_param('mail.catchall.alias') bounce_alias = self.env['ir.config_parameter'].sudo().get_param('mail.bounce.alias') alias_domain = self.env["ir.config_parameter"].sudo().get_param("mail.catchall.domain") valid_domain_aliases = filter(None, (bounce_alias, catchall_alias)) - valid_names = list(filter(None, sanitized_names)) # matches catchall or bounce alias for sanitized_name in sanitized_names: diff --git a/addons/test_mail/tests/test_mail_alias.py b/addons/test_mail/tests/test_mail_alias.py index cad05318fe8..53d0ac80e79 100644 --- a/addons/test_mail/tests/test_mail_alias.py +++ b/addons/test_mail/tests/test_mail_alias.py @@ -117,6 +117,14 @@ class TestMailAlias(TestMailAliasCommon): 'alias_model_id': alias_model_id, 'alias_name': 'unused.test.alias', }) + with self.assertRaises(exceptions.UserError), self.cr.savepoint(): + self.env['mail.alias'].create([ + { + 'alias_model_id': alias_model_id, + 'alias_name': alias_name, + } + for alias_name in ('new.alias.1', 'new.alias.2', 'new.alias.1') + ]) with self.assertRaises(psycopg2.errors.UniqueViolation), self.cr.savepoint(), mute_logger('odoo.sql_db'): new_mail_alias.copy({'alias_name': 'unused.test.alias'}) with self.assertRaises(exceptions.UserError), self.cr.savepoint():