Files
Odoo-Modules/fusion_plating/fusion_plating_notifications/hooks.py
gsinghpal 2334c0a1fe fix(notifications): Send dialog cancel no longer pre-sends + no duplicate PDF
Two user-reported bugs on S00056 (and visible on any SO/invoice):

Bug 1: Cancelling the Send dialog still sends the email.
  action_quotation_send is a button handler that returns a
  compose-dialog action synchronously. Our override was calling
  _dispatch('quote_sent', ...) AFTER super(), which immediately
  sends the email via template.send_mail() before the user ever
  sees the dialog. Clicking Cancel at that point only dismisses
  the already-sent email's compose window.

  Fix: removed the _dispatch call entirely from action_quotation_send.
  The Send button IS the manual-send path; Odoo's compose dialog
  (pre-populated with our FP: Quotation Sent template thanks to
  _find_mail_template) handles the send-or-cancel choice correctly.

  If an auto-quote-sent notification is ever wanted, it should be
  wired from a cron that scans SOs that just transitioned
  draft -> sent, not from the button handler. Noted in a code
  comment.

Bug 2: Two copies of the same PDF attached to every email.
  The mail.template records now carry report_template_ids (set by
  the post_init hook from the previous refactor) which Odoo uses to
  auto-attach PDFs on send_mail(). But the fp.notification.template
  records ALSO had attach_quotation / attach_sale_order / attach_invoice
  flags set, which cause _collect_attachments() to render the same
  PDF a second time and pass it in email_values.

  Fix: turned those three flags off in the XML data file. Other
  flags (attach_coc, attach_bol, attach_receipt, attach_thickness_report,
  attach_packing_list, attach_pod) stay on — those are genuinely
  different documents, not dupes.

  Because the records are noupdate="1", updated the post_init_hook
  to also backfill the flag changes onto existing DB rows so
  production instances get cleaned up on -u, not just fresh installs.

Smoke:
  attach_quotation=False attach_sale_order=False attach_invoice=False on all three records
  1 report per template (no dupes)
  action_quotation_send no longer contains _dispatch("quote_sent", ...)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 01:45:32 -04:00

89 lines
3.4 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
import logging
_logger = logging.getLogger(__name__)
def post_init_hook(env):
"""Wire reports onto mail templates + clean up double-attach flags.
Both the mail-template and fp.notification.template XML records
are tagged noupdate="1" so user customizations aren't overwritten
on module update. This hook runs once to:
1. Point report_template_ids at the current branded reports.
2. Turn off attach_quotation / attach_sale_order / attach_invoice
flags on fp.notification.template — those would duplicate the
PDF that's now auto-attached via the mail template's
report_template_ids.
"""
# 1. Attach correct reports to mail templates
_apply_report_template(
env,
'fusion_plating_notifications.fp_mail_template_quote_sent',
'fusion_plating_reports.action_report_fp_sale_portrait',
)
_apply_report_template(
env,
'fusion_plating_notifications.fp_mail_template_so_confirmed',
'fusion_plating_reports.action_report_fp_sale_portrait',
)
_apply_report_template(
env,
'fusion_plating_notifications.fp_mail_template_invoice_posted',
'fusion_plating_reports.action_report_fp_invoice_portrait',
)
# 2. Clear duplicate-attach flags on the auto-dispatch records.
# The PDF is already auto-attached by the mail.template's
# report_template_ids; leaving these flags on produces 2 PDFs.
for xmlid, flags in [
('fusion_plating_notifications.fp_notif_quote_sent',
{'attach_quotation': False}),
('fusion_plating_notifications.fp_notif_so_confirmed',
{'attach_sale_order': False}),
('fusion_plating_notifications.fp_notif_invoice_posted',
{'attach_invoice': False}),
]:
rec = env.ref(xmlid, raise_if_not_found=False)
if not rec:
continue
needs_write = any(rec[k] != v for k, v in flags.items())
if needs_write:
rec.write(flags)
_logger.info(
'fusion_plating_notifications: cleared duplicate-attach '
'flags on %s (%s)', xmlid, flags,
)
def _apply_report_template(env, mail_template_xmlid, report_xmlid):
"""Replace the template's report_template_ids with exactly [report].
We use `set` semantics (replace all) rather than `add` so that old
attachments from previous refactors get cleaned up — e.g. when the
Acknowledgement report was consolidated into the Sales Order report,
the now-stale Acknowledgement reference gets removed here.
"""
mail_template = env.ref(mail_template_xmlid, raise_if_not_found=False)
report = env.ref(report_xmlid, raise_if_not_found=False)
if not mail_template or not report:
_logger.warning(
'fusion_plating_notifications post_init: missing %s or %s',
mail_template_xmlid, report_xmlid,
)
return
current_ids = set(mail_template.report_template_ids.ids)
if current_ids != {report.id}:
mail_template.write({
'report_template_ids': [(6, 0, [report.id])],
})
_logger.info(
'fusion_plating_notifications: set report %s on template %s',
report_xmlid, mail_template_xmlid,
)