From e145f737f59d3065652207739f18bed9979909e8 Mon Sep 17 00:00:00 2001 From: Lavish Chhatwani Date: Thu, 17 Dec 2020 09:30:36 +0000 Subject: [PATCH] [IMP] mail: display proper warning message if alias already exists Currently, when new alias with an already used prefix is created, it shows the warning stating "The e-mail alias is already used. Please enter another one." It does not help much because the user do not know where the alias is used. This commit improves the warning message by including the document name and parent model name (if available) if the alias is linked to any model, or it shows if alias is already used for handling bounce/catchall if that is the case. Task Id-2375552 closes odoo/odoo#62367 Signed-off-by: Thibault Delavallee (tde) --- addons/mail/models/mail_alias.py | 45 +++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 6 deletions(-) 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: