mirror of https://github.com/OCA/social.git
commit
c0910eaaf0
|
@ -13,3 +13,14 @@ class MailMessageSchedule(models.Model):
|
||||||
return super(MailMessageSchedule, _self)._send_notifications(
|
return super(MailMessageSchedule, _self)._send_notifications(
|
||||||
default_notify_kwargs=default_notify_kwargs
|
default_notify_kwargs=default_notify_kwargs
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _group_by_model(self):
|
||||||
|
"""Make sure only mail.thread children are grouped with model."""
|
||||||
|
result = super()._group_by_model()
|
||||||
|
for model, records in result.copy().items():
|
||||||
|
# Move records without mail.thread mixin to a False key
|
||||||
|
if model and not hasattr(model, "_notify_thread"):
|
||||||
|
result.pop(model)
|
||||||
|
result.setdefault(False, self.browse())
|
||||||
|
result[False] += records
|
||||||
|
return result
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright 2022-2023 Moduon Team S.L. <info@moduon.team>
|
# Copyright 2022-2024 Moduon Team S.L. <info@moduon.team>
|
||||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
|
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
|
||||||
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
@ -12,7 +12,15 @@ class MailThread(models.AbstractModel):
|
||||||
|
|
||||||
def _notify_thread(self, message, msg_vals=False, **kwargs):
|
def _notify_thread(self, message, msg_vals=False, **kwargs):
|
||||||
"""Defer emails by default."""
|
"""Defer emails by default."""
|
||||||
_self = self
|
# Remember if the author should be notified when deferring
|
||||||
|
kwargs.setdefault(
|
||||||
|
"mail_post_defer_notify_author",
|
||||||
|
self.env.context.get("mail_notify_author", False),
|
||||||
|
)
|
||||||
|
_self = self.with_context(
|
||||||
|
mail_notify_author=kwargs["mail_post_defer_notify_author"]
|
||||||
|
)
|
||||||
|
# Don't defer automatically if forcing send
|
||||||
if "mail_defer_seconds" not in _self.env.context:
|
if "mail_defer_seconds" not in _self.env.context:
|
||||||
force_send = _self.env.context.get("mail_notify_force_send") or kwargs.get(
|
force_send = _self.env.context.get("mail_notify_force_send") or kwargs.get(
|
||||||
"force_send", False
|
"force_send", False
|
||||||
|
@ -21,6 +29,7 @@ class MailThread(models.AbstractModel):
|
||||||
if not force_send:
|
if not force_send:
|
||||||
# If deferring message, give the user some minimal time to revert it
|
# If deferring message, give the user some minimal time to revert it
|
||||||
_self = _self.with_context(mail_defer_seconds=30)
|
_self = _self.with_context(mail_defer_seconds=30)
|
||||||
|
# Apply deferring
|
||||||
defer_seconds = _self.env.context.get("mail_defer_seconds")
|
defer_seconds = _self.env.context.get("mail_defer_seconds")
|
||||||
if defer_seconds:
|
if defer_seconds:
|
||||||
kwargs.setdefault(
|
kwargs.setdefault(
|
||||||
|
|
|
@ -182,6 +182,40 @@ class MessagePostCase(MailPostDeferCommon):
|
||||||
with self.assertRaises(UserError):
|
with self.assertRaises(UserError):
|
||||||
self.partner_portal._message_update_content(msg, "", [])
|
self.partner_portal._message_update_content(msg, "", [])
|
||||||
|
|
||||||
|
def test_model_without_threading(self):
|
||||||
|
"""When models don't inherit from mail.thread, they still work."""
|
||||||
|
self.partner_portal.email = "portal@example.com"
|
||||||
|
with self.mock_mail_gateway():
|
||||||
|
self.env["mail.thread"].with_context(
|
||||||
|
mail_notify_author=True
|
||||||
|
).message_notify(
|
||||||
|
author_id=self.partner_employee.id,
|
||||||
|
body="test body",
|
||||||
|
model="res.country",
|
||||||
|
partner_ids=(self.partner_employee | self.partner_portal).ids,
|
||||||
|
res_id=self.ref("base.es"),
|
||||||
|
)
|
||||||
|
self.assertNoMail(self.partner_employee | self.partner_portal)
|
||||||
|
# One minute later, the cron sends the mail
|
||||||
|
with freezegun.freeze_time("2023-01-02 10:01:00"):
|
||||||
|
self.env["mail.message.schedule"]._send_notifications_cron()
|
||||||
|
self.env["mail.mail"].process_email_queue()
|
||||||
|
self.assertMailMail(
|
||||||
|
self.partner_portal,
|
||||||
|
"sent",
|
||||||
|
author=self.partner_employee,
|
||||||
|
content="test body",
|
||||||
|
)
|
||||||
|
self.assertMailMail(
|
||||||
|
self.partner_employee,
|
||||||
|
"sent",
|
||||||
|
author=self.partner_employee,
|
||||||
|
content="test body",
|
||||||
|
)
|
||||||
|
# Safety belt to avoid false positives in this test
|
||||||
|
self.assertFalse(hasattr(self.env["res.country"], "_notify_thread"))
|
||||||
|
self.assertTrue(hasattr(self.env["res.partner"], "_notify_thread"))
|
||||||
|
|
||||||
|
|
||||||
@tagged("-at_install", "post_install")
|
@tagged("-at_install", "post_install")
|
||||||
@freezegun.freeze_time("2023-01-02 10:00:00")
|
@freezegun.freeze_time("2023-01-02 10:00:00")
|
||||||
|
|
Loading…
Reference in New Issue