diff --git a/allow_mail_archived_partner/models/mail_thread.py b/allow_mail_archived_partner/models/mail_thread.py index dd82b0d..ad9c4ac 100755 --- a/allow_mail_archived_partner/models/mail_thread.py +++ b/allow_mail_archived_partner/models/mail_thread.py @@ -11,19 +11,17 @@ class MailThread(models.AbstractModel): _logger.info("=== MAILTHREAD CLASS LOADED (allow_mail_archived_partner) ===") def _notify_thread(self, message, msg_vals=False, **kwargs): - """ - Keep default behavior. - """ return super()._notify_thread(message, msg_vals=msg_vals, **kwargs) def _notify_get_recipients(self, message, msg_vals, **kwargs): """ - Force correct email recipients for manual sends (invoices), - including archived partners, and avoid incomplete recipient dicts. + Ensure archived partners can still be used as recipients for manual sends. + Important: message.partner_ids may appear empty for archived partners if + active_test=True, even if the M2M relation contains IDs. """ _logger.error("🔥🔥🔥 MailThread._notify_get_recipients CALLED 🔥🔥🔥") - # --- Ignore system / automatic notifications --- + # --- Ignore system/automatic notifications --- is_system_message = ( getattr(message, "message_type", None) == "notification" or ( @@ -33,7 +31,6 @@ class MailThread(models.AbstractModel): ) or (msg_vals and msg_vals.get("message_type") == "notification") ) - if is_system_message: _logger.debug("SYSTEM MESSAGE – using parent behavior") return super()._notify_get_recipients(message, msg_vals, **kwargs) @@ -47,18 +44,25 @@ class MailThread(models.AbstractModel): ) _logger.error(f"🔥 Is manual send? {is_manual_send}") - _logger.error( - f"🔥 Message partner_ids: {getattr(message, 'partner_ids', None)}" - ) - if not ( - is_manual_send and hasattr(message, "partner_ids") and message.partner_ids - ): - _logger.debug("Not a manual send or no partners – using parent behavior") + if not is_manual_send: + _logger.debug("Not a manual send – using parent behavior") return super()._notify_get_recipients(message, msg_vals, **kwargs) - # --- Manual send with partners --- - partner_ids = message.partner_ids.ids + # 🔥 CRITICAL: read partner_ids with active_test=False, otherwise archived partners disappear + msg_archived_ok = message.with_context(active_test=False) + msg_partner_rs = getattr( + msg_archived_ok, "partner_ids", self.env["res.partner"] + ) + _logger.error(f"🔥 Message partner_ids (active_test=False): {msg_partner_rs}") + + if not msg_partner_rs: + _logger.error( + "🔥 Manual send but no partners on message (even with active_test=False)" + ) + return super()._notify_get_recipients(message, msg_vals, **kwargs) + + partner_ids = msg_partner_rs.ids _logger.error(f"🔥 Manual send partners: {partner_ids}") # Get parent recipients (may be incomplete) @@ -77,24 +81,20 @@ class MailThread(models.AbstractModel): _logger.error(f"🔥 Parent returned {len(recipients)} recipients") def _is_bad_recipient(r): - return not r or not r.get("email") or not r.get("partner_id") + return (not r) or (not r.get("email")) or (not r.get("partner_id")) bad_recipients = [r for r in recipients if _is_bad_recipient(r)] - if bad_recipients: _logger.error( f"🔥 Found {len(bad_recipients)} incomplete recipient(s), forcing from partner_ids" ) - # Build forced recipients from partner_ids + # Build forced recipients from partner_ids (always correct) forced_recipients = [] - for partner_id in partner_ids: + for pid in partner_ids: partner = ( - self.env["res.partner"] - .with_context(active_test=False) - .browse(partner_id) + self.env["res.partner"].with_context(active_test=False).browse(pid) ) - if partner.exists() and partner.email: forced_recipients.append( { @@ -112,16 +112,14 @@ class MailThread(models.AbstractModel): ) _logger.error(f"🔥 Forced recipient: {partner.id} – {partner.email}") - # Prefer forced recipients if parent gave nothing useful + # Prefer forced recipients if parent gave nothing useful / incomplete if forced_recipients and (not recipients or bad_recipients): recipients = forced_recipients for i, recipient in enumerate(recipients): _logger.error( - f"🔥 Recipient {i}: " - f"partner_id={recipient.get('partner_id')}, " - f"notif={recipient.get('notif')}, " - f"email={recipient.get('email')}" + f"🔥 Recipient {i}: partner_id={recipient.get('partner_id')}, " + f"notif={recipient.get('notif')}, email={recipient.get('email')}" ) return recipients