diff --git a/addons/mail/models/mail_alias.py b/addons/mail/models/mail_alias.py index b1f61503476..bebc4719357 100644 --- a/addons/mail/models/mail_alias.py +++ b/addons/mail/models/mail_alias.py @@ -156,21 +156,54 @@ class Alias(models.Model): """When an alias name appears to already be an email, we keep the local part only. A sanitizing / cleaning is also performed on the name. If name already exists an UserError is raised. """ - sanitized_names = [] - for name in names: + + def _sanitize_alias_name(name): + """ Cleans and sanitizes the alias name """ sanitized_name = remove_accents(name).lower().split('@')[0] sanitized_name = re.sub(r'[^\w+.]+', '-', sanitized_name) sanitized_name = sanitized_name.encode('ascii', errors='replace').decode() - sanitized_names.append(sanitized_name) + return sanitized_name + + sanitized_names = [_sanitize_alias_name(name) for name in names] 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") + + # matches catchall or bounce alias + for sanitized_name in sanitized_names: + if sanitized_name in [catchall_alias, bounce_alias]: + matching_alias_name = '%s@%s' % (sanitized_name, alias_domain) if alias_domain else sanitized_name + raise UserError( + _('The e-mail alias %(matching_alias_name)s is already used as %(alias_duplicate)s alias. Please choose another alias.', + matching_alias_name=matching_alias_name, + alias_duplicate=_('catchall') if sanitized_name == catchall_alias else _('bounce')) + ) + + # matches existing alias domain = [('alias_name', 'in', sanitized_names)] if self: domain += [('id', 'not in', self.ids)] - if any(sanitized_name in [catchall_alias, bounce_alias] for sanitized_name in sanitized_names) or self.search_count(domain): - raise UserError(_('The e-mail alias is already used. Please enter another one.')) - return sanitized_names + matching_alias = self.search(domain, limit=1) + if not matching_alias: + return sanitized_names + + sanitized_alias_name = _sanitize_alias_name(matching_alias.alias_name) + matching_alias_name = '%s@%s' % (sanitized_alias_name, alias_domain) if alias_domain else sanitized_alias_name + if matching_alias.alias_parent_model_id and matching_alias.alias_parent_thread_id: + # If parent model and parent thread ID both are set, display document name also in the warning + document_name = self.env[matching_alias.alias_parent_model_id.model].sudo().browse(matching_alias.alias_parent_thread_id).display_name + raise UserError( + _('The e-mail alias %(matching_alias_name)s is already used by the %(document_name)s %(model_name)s. Choose another alias or change it on the other document.', + matching_alias_name=matching_alias_name, + document_name=document_name, + model_name=matching_alias.alias_parent_model_id.name) + ) + raise UserError( + _('The e-mail alias %(matching_alias_name)s is already linked with %(alias_model_name)s. Choose another alias or change it on the linked model.', + matching_alias_name=matching_alias_name, + alias_model_name=matching_alias.alias_model_id.name) + ) def open_document(self): if not self.alias_model_id or not self.alias_force_thread_id: