fix(fusion_helpdesk_central): chatter notice no longer collapsed; adds summary
Previous engagement notice used <blockquote> to style the findings quote. Odoo's mail.thread renderer auto-tags every <blockquote> with data-o-mail-quote-node="1" and the chatter UI then HIDES the content behind a "..." widget — exactly the wrong UX since the findings are the load-bearing content, not throwaway quoted text. Swapped both quote blocks for styled <div>s with the same visual treatment (left border, light background, padding) so they render fully inline with no toggle. Also expanded the notice to mirror more of what the owner sees in the engagement email: now includes BOTH "Our reply" (the findings) and "Summary sent to the owner" (the AI summary). The employee can see the full context being used for the decision, not just the engineer's reply. Skipped the Original Request section because the employee wrote it themselves — would just clutter the thread. white-space:pre-wrap preserves multi-line findings/summaries that the engineer typed with line breaks. The two sections are visually distinct: findings in light blue (matching the email's "Our Reply" treatment), summary in light grey (matching "Summary for the Decision" in the email). Verified live on ticket #54: new message body has no <blockquote>, no data-o-mail-quote attribute, and contains both section headers with their content rendered inline. Bumps fusion_helpdesk_central to 19.0.2.4.2.
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
# License OPL-1
|
# License OPL-1
|
||||||
{
|
{
|
||||||
'name': 'Fusion Helpdesk Central — Client API Keys',
|
'name': 'Fusion Helpdesk Central — Client API Keys',
|
||||||
'version': '19.0.2.4.1',
|
'version': '19.0.2.4.2',
|
||||||
'category': 'Productivity',
|
'category': 'Productivity',
|
||||||
'summary': 'Admin UI on the central Odoo for issuing per-client API '
|
'summary': 'Admin UI on the central Odoo for issuing per-client API '
|
||||||
'keys used by fusion_helpdesk client deployments.',
|
'keys used by fusion_helpdesk client deployments.',
|
||||||
|
|||||||
@@ -289,18 +289,23 @@ class HelpdeskTicket(models.Model):
|
|||||||
def _fc_post_engagement_notice(self, owner_name, findings):
|
def _fc_post_engagement_notice(self, owner_name, findings):
|
||||||
"""Public chatter message posted when an engagement is sent.
|
"""Public chatter message posted when an engagement is sent.
|
||||||
|
|
||||||
Two purposes:
|
Mirrors the engagement email body so the chatter shows the same
|
||||||
- Tells the employee (via the entech My Tickets inbox, which only
|
context the owner is reading: the engineer's reply (findings)
|
||||||
reads public comments) that their request has been escalated
|
and the summary that's being used for the decision. We skip the
|
||||||
for approval and who's deciding.
|
Original Request section that's in the email — the employee
|
||||||
- Captures our reply (findings) on the public thread so the
|
filed the ticket, they already know what they asked for.
|
||||||
employee can see what support said — same content the owner
|
|
||||||
receives in the engagement email, just without the AI summary
|
|
||||||
(which is a decision-aid for the owner, not the employee).
|
|
||||||
|
|
||||||
Posted via message_post with subtype_xmlid='mail.mt_comment' so
|
Critically: uses styled <div>s instead of <blockquote>. Odoo
|
||||||
it survives the entech-side _public_messages filter
|
auto-flags <blockquote> content as "quoted" (data-o-mail-quote-
|
||||||
(message_type='comment' + non-internal subtype).
|
node="1") and the chatter UI then collapses it behind a "..."
|
||||||
|
widget — exactly the wrong UX here, since the findings + summary
|
||||||
|
are the load-bearing content, not throwaway quotation. Plain
|
||||||
|
divs with the same visual treatment render fully inline.
|
||||||
|
|
||||||
|
Posted with subtype_xmlid='mail.mt_comment' so it passes the
|
||||||
|
entech-side _public_messages filter (message_type='comment' +
|
||||||
|
non-internal subtype) and reaches the employee's My Tickets
|
||||||
|
inbox.
|
||||||
"""
|
"""
|
||||||
from markupsafe import Markup, escape
|
from markupsafe import Markup, escape
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
@@ -309,14 +314,27 @@ class HelpdeskTicket(models.Model):
|
|||||||
'<p>⏳ <b>Awaiting owner approval from %s.</b> '
|
'<p>⏳ <b>Awaiting owner approval from %s.</b> '
|
||||||
'Their decision will appear here when they reply.</p>'
|
'Their decision will appear here when they reply.</p>'
|
||||||
) % name_html
|
) % name_html
|
||||||
|
# Section 1: our reply (the wizard's findings)
|
||||||
text = (findings or '').strip()
|
text = (findings or '').strip()
|
||||||
if text:
|
if text:
|
||||||
body += (
|
body += (
|
||||||
'<p><b>Our reply:</b></p>'
|
'<p style="margin:12px 0 4px 0;"><b>Our reply:</b></p>'
|
||||||
'<blockquote style="margin:6px 0 0 0; padding:6px 12px; '
|
'<div style="margin:0; padding:10px 14px; '
|
||||||
'border-left:3px solid #c7dcfa; color:#1e3a5f; '
|
'border-left:3px solid #c7dcfa; color:#1e3a5f; '
|
||||||
'background:#f4f8ff;">%s</blockquote>'
|
'background:#f4f8ff; border-radius:4px; '
|
||||||
) % escape(text).replace('\n', '<br/>')
|
'white-space:pre-wrap;">%s</div>'
|
||||||
|
) % escape(text)
|
||||||
|
# Section 2: the AI summary the owner is seeing for the decision
|
||||||
|
summary = (self.x_fc_ai_summary or '').strip()
|
||||||
|
if summary:
|
||||||
|
body += (
|
||||||
|
'<p style="margin:14px 0 4px 0;">'
|
||||||
|
'<b>Summary sent to the owner:</b></p>'
|
||||||
|
'<div style="margin:0; padding:10px 14px; '
|
||||||
|
'border-left:3px solid #e5e7eb; color:#444; '
|
||||||
|
'background:#f9fafb; border-radius:4px; '
|
||||||
|
'white-space:pre-wrap;">%s</div>'
|
||||||
|
) % escape(summary)
|
||||||
self.message_post(
|
self.message_post(
|
||||||
body=Markup(body),
|
body=Markup(body),
|
||||||
message_type='comment',
|
message_type='comment',
|
||||||
|
|||||||
Reference in New Issue
Block a user