diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index fb44fc24f85..1bea5e37ae0 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -121,7 +121,7 @@ class Lead(models.Model): 'res.company', string='Company', index=True, compute='_compute_company_id', readonly=False, store=True) referred = fields.Char('Referred By') - description = fields.Text('Notes') + description = fields.Html('Notes') active = fields.Boolean('Active', default=True, tracking=True) type = fields.Selection([ ('lead', 'Lead'), ('opportunity', 'Opportunity')], @@ -1376,7 +1376,7 @@ class Lead(models.Model): def _merge_get_fields_specific(self): return { - 'description': lambda fname, leads: '\n\n'.join(desc for desc in leads.mapped('description') if desc), + 'description': lambda fname, leads: '

'.join(desc for desc in leads.mapped('description') if not is_html_empty(desc)), 'type': lambda fname, leads: 'opportunity' if any(lead.type == 'opportunity' for lead in leads) else 'lead', 'priority': lambda fname, leads: max(leads.mapped('priority')) if leads else False, } diff --git a/addons/crm/tests/common.py b/addons/crm/tests/common.py index f863b577c94..daa7baa5fc3 100644 --- a/addons/crm/tests/common.py +++ b/addons/crm/tests/common.py @@ -399,7 +399,7 @@ class TestCrmCommon(TestSalesCommon, MailCase): def _get_description(): values = [_find_value(lead, 'description') for lead in leads] - return '\n\n'.join(value for value in values if value) + return '

'.join(value for value in values if value) def _get_priority(): values = [_find_value(lead, 'priority') for lead in leads] diff --git a/addons/crm/tests/test_crm_lead_merge.py b/addons/crm/tests/test_crm_lead_merge.py index 97206dfec73..8d313dc47fa 100644 --- a/addons/crm/tests/test_crm_lead_merge.py +++ b/addons/crm/tests/test_crm_lead_merge.py @@ -88,7 +88,7 @@ class TestLeadMerge(TestLeadMergeCommon): # and exclude inactive leads, but that's not written anywhere ... intended ?? self.assertEqual(merge.opportunity_ids, self.leads - self.lead_w_partner_company - self.lead_w_email_lost) ordered_merge = self.lead_w_contact + self.lead_w_email + self.lead_1 + self.lead_w_partner - ordered_merge_description = '\n\n'.join(l.description for l in ordered_merge) + ordered_merge_description = '

'.join(l.description for l in ordered_merge) # merged opportunity: in this test, all input are leads. Confidence is based on stage # sequence -> lead_w_contact has a stage sequence of 30 diff --git a/addons/crm_livechat/models/mail_channel.py b/addons/crm_livechat/models/mail_channel.py index c051309c813..64313998493 100644 --- a/addons/crm_livechat/models/mail_channel.py +++ b/addons/crm_livechat/models/mail_channel.py @@ -28,9 +28,9 @@ class MailChannel(models.Model): :param key: operator input in chat ('/lead Lead about Product') """ description = ''.join( - '%s: %s\n' % (message.author_id.name or self.anonymous_name, message.body) + '%s: %s
' % (message.author_id.name or self.anonymous_name, html2plaintext(message.body)) for message in self.message_ids.sorted('id') - ) + ) # converting message body back to plaintext for correct data formating in description # if public user is part of the chat: consider lead to be linked to an # anonymous user whatever the participants. Otherwise keep only share # partners (no user or portal user) to link to the lead. @@ -48,7 +48,7 @@ class MailChannel(models.Model): 'partner_id': customers[0].id if customers else False, 'user_id': False, 'team_id': False, - 'description': html2plaintext(description), + 'description': description, 'referred': partner.name, 'source_id': utm_source and utm_source.id, }) diff --git a/addons/event/models/event_event.py b/addons/event/models/event_event.py index 0b1d957f7ec..e14899d4dab 100644 --- a/addons/event/models/event_event.py +++ b/addons/event/models/event_event.py @@ -106,7 +106,7 @@ class EventEvent(models.Model): return self.env['ir.ui.view']._render_template('event.event_default_descripton') name = fields.Char(string='Event', translate=True, required=True) - note = fields.Text(string='Note') + note = fields.Html(string='Note') description = fields.Html(string='Description', translate=html_translate, sanitize_attributes=False, sanitize_form=False, default=_default_description) active = fields.Boolean(default=True) user_id = fields.Many2one( diff --git a/addons/event_crm/models/event_lead_rule.py b/addons/event_crm/models/event_lead_rule.py index 08c5c114cb0..f5c9ec1c7e5 100644 --- a/addons/event_crm/models/event_lead_rule.py +++ b/addons/event_crm/models/event_lead_rule.py @@ -177,7 +177,7 @@ class EventLeadRule(models.Model): additionnal_description = group_registrations._get_lead_description(_("New registrations"), line_counter=True) for lead in toupdate_leads: lead.write({ - 'description': "%s\n%s" % (lead.description, additionnal_description), + 'description': "%s
%s" % (lead.description, additionnal_description), 'registration_ids': [(4, reg.id) for reg in group_registrations], }) elif group_registrations: diff --git a/addons/event_crm/models/event_registration.py b/addons/event_crm/models/event_registration.py index 033bb0d3aec..111cef325b8 100644 --- a/addons/event_crm/models/event_registration.py +++ b/addons/event_crm/models/event_registration.py @@ -132,7 +132,7 @@ class EventRegistration(models.Model): upd_description_fields = [field for field in self._get_lead_description_fields() if field in new_vals.keys()] if any(new_vals[field] != old_vals[field] for field in upd_description_fields): for lead in leads_attendee: - lead_values['description'] = "%s\n%s" % ( + lead_values['description'] = "%s
%s" % ( lead.description, registration._get_lead_description(_("Updated registrations"), line_counter=True) ) @@ -148,7 +148,7 @@ class EventRegistration(models.Model): if not lead.partner_id: lead_values['description'] = lead.registration_ids._get_lead_description(_("Participants"), line_counter=True) elif new_vals['partner_id'] != lead.partner_id.id: - lead_values['description'] = lead.description + "\n" + lead.registration_ids._get_lead_description(_("Updated registrations"), line_counter=True, line_suffix=_("(updated)")) + lead_values['description'] = lead.description + "
" + lead.registration_ids._get_lead_description(_("Updated registrations"), line_counter=True, line_suffix=_("(updated)")) if lead_values: lead.write(lead_values) @@ -232,17 +232,16 @@ class EventRegistration(models.Model): """ reg_lines = [ registration._get_lead_description_registration( - prefix="%s. " % (index + 1) if line_counter else "", line_suffix=line_suffix - ) for index, registration in enumerate(self) + ) for registration in self ] - return ("%s\n" % prefix if prefix else "") + ("\n".join(reg_lines)) + return ("%s
" % prefix if prefix else "") + ( + "
    " if line_counter else "
" if line_counter else "") - def _get_lead_description_registration(self, prefix='', line_suffix=''): + def _get_lead_description_registration(self, line_suffix=''): """ Build the description line specific to a given registration. """ self.ensure_one() - return "%s%s (%s)%s" % ( - prefix or "", + return "
  • %s (%s)%s
  • " % ( self.name or self.partner_id.name or self.email, " - ".join(self[field] for field in ('email', 'phone') if self[field]), " %s" % line_suffix if line_suffix else "", diff --git a/addons/website_event_crm_questions/models/event_registration.py b/addons/website_event_crm_questions/models/event_registration.py index 724ced14a31..14d3140e254 100644 --- a/addons/website_event_crm_questions/models/event_registration.py +++ b/addons/website_event_crm_questions/models/event_registration.py @@ -7,18 +7,18 @@ from odoo import models, _ class EventRegistration(models.Model): _inherit = 'event.registration' - def _get_lead_description_registration(self, prefix='', line_suffix=''): + def _get_lead_description_registration(self, line_suffix=''): """Add the questions and answers linked to the registrations into the description of the lead.""" - reg_description = super(EventRegistration, self)._get_lead_description_registration(prefix=prefix, line_suffix=line_suffix) + reg_description = super(EventRegistration, self)._get_lead_description_registration(line_suffix=line_suffix) if not self.registration_answer_ids: return reg_description answer_descriptions = [] for answer in self.registration_answer_ids: answer_value = answer.value_answer_id.name if answer.question_type == "simple_choice" else answer.value_text_box - answer_value = "\n".join([" %s" % line for line in answer_value.split('\n')]) - answer_descriptions.append(" - %s\n%s" % (answer.question_id.title, answer_value)) - return "%s\n%s\n%s" % (reg_description, _("Questions"), '\n'.join(answer_descriptions)) + answer_value = "
    ".join([" %s" % line for line in answer_value.split('\n')]) + answer_descriptions.append(" - %s
    %s" % (answer.question_id.title, answer_value)) + return "%s%s
    %s" % (reg_description, _("Questions"), '
    '.join(answer_descriptions)) def _get_lead_description_fields(self): res = super(EventRegistration, self)._get_lead_description_fields()