From 586ae4bcc4d14f670a6fad9d2f53ef0334833808 Mon Sep 17 00:00:00 2001 From: dht-odoo Date: Wed, 12 May 2021 05:09:50 +0000 Subject: [PATCH] [IMP] crm: improves description field type from text to html Replace text fields to html fields as we have our own 'OdooEditor'. Indeed, it gives more options to users in the way they format their content without weighting too much on the UI (tools appear on demand and not by default). Models -> Fields 1) crm.lead -> description 2) event.event -> note Task Id: 2499504 X-original-commit: 524e2f089a611d897b98d86001bda5d17263db66 --- addons/crm/models/crm_lead.py | 4 ++-- addons/crm/tests/common.py | 2 +- addons/crm/tests/test_crm_lead_merge.py | 2 +- addons/crm_livechat/models/mail_channel.py | 6 +++--- addons/event/models/event_event.py | 2 +- addons/event_crm/models/event_lead_rule.py | 2 +- addons/event_crm/models/event_registration.py | 15 +++++++-------- .../models/event_registration.py | 10 +++++----- 8 files changed, 21 insertions(+), 22 deletions(-) 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()