You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.5 KiB
104 lines
3.5 KiB
# Copyright 2020 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
|
|
# Copyright 2019 Kolushov Alexandr <https://it-projects.info/team/KolushovAlexandr>
|
|
# License MIT (https://opensource.org/licenses/MIT).
|
|
|
|
# pylint: disable=sql-injection
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class MailMessage(models.Model):
|
|
_inherit = "mail.message"
|
|
|
|
sent = fields.Boolean(
|
|
"Sent",
|
|
compute="_compute_sent",
|
|
help="Was message sent to someone",
|
|
store=True,
|
|
index=True,
|
|
)
|
|
|
|
@api.depends("author_id", "partner_ids", "channel_ids", "res_id", "model")
|
|
def _compute_sent(self):
|
|
to_check = set(self.ids)
|
|
to_write = set()
|
|
|
|
if to_check:
|
|
# len(recipient_ids) > 1
|
|
field = self._fields["partner_ids"]
|
|
self.env.cr.execute(
|
|
"""
|
|
SELECT {message_field}
|
|
FROM (
|
|
SELECT {message_field}, count(*) AS partner_count
|
|
FROM {relation_table}
|
|
WHERE {message_field} in %s
|
|
GROUP BY {message_field}
|
|
) AS tmp WHERE partner_count > 1""".format(
|
|
message_field=field.column1,
|
|
partner_field=field.column2,
|
|
relation_table=field.relation,
|
|
),
|
|
(tuple(to_check),),
|
|
)
|
|
ids = {r[0] for r in self.env.cr.fetchall()}
|
|
to_check -= ids
|
|
to_write |= ids
|
|
|
|
if to_check:
|
|
# (len(recipient_ids) == 1 and recipient_ids[0].id != author_id.id)
|
|
self.env.cr.execute(
|
|
"""
|
|
SELECT {message_field}
|
|
FROM {relation_table} rel
|
|
LEFT JOIN mail_message msg ON msg.id = rel.{message_field}
|
|
WHERE rel.{partner_field} != msg.author_id AND rel.{message_field} in %s
|
|
""".format(
|
|
message_field=field.column1,
|
|
partner_field=field.column2,
|
|
relation_table=field.relation,
|
|
),
|
|
(tuple(to_check),),
|
|
)
|
|
ids = {r[0] for r in self.env.cr.fetchall()}
|
|
to_check -= ids
|
|
to_write |= ids
|
|
|
|
if to_check:
|
|
# (len(r_sudo.channel_ids))
|
|
field = self._fields["channel_ids"]
|
|
self.env.cr.execute(
|
|
"""
|
|
SELECT {message_field}
|
|
FROM (
|
|
SELECT {message_field}, count(*) AS channel_count
|
|
FROM {relation_table}
|
|
WHERE {message_field} in %s
|
|
GROUP BY {message_field}
|
|
) AS tmp WHERE channel_count > 0""".format(
|
|
message_field=field.column1,
|
|
channel_field=field.column2,
|
|
relation_table=field.relation,
|
|
),
|
|
(tuple(to_check),),
|
|
)
|
|
ids = {r[0] for r in self.env.cr.fetchall()}
|
|
to_check -= ids
|
|
to_write |= ids
|
|
|
|
self.browse(to_write).update({"sent": True})
|
|
|
|
@api.multi
|
|
def message_format(self):
|
|
message_values = super(MailMessage, self).message_format()
|
|
message_index = {message["id"]: message for message in message_values}
|
|
for item in self:
|
|
msg = message_index.get(item.id)
|
|
if msg:
|
|
msg["sent"] = item.sent
|
|
return message_values
|
|
|
|
|
|
class MailComposeMessage(models.TransientModel):
|
|
|
|
_inherit = "mail.compose.message"
|
|
sent = fields.Boolean(help="dummy field to fix inherit error", store=False)
|