Odoo18-Base/addons/im_livechat/models/discuss_channel_member.py
2025-01-06 10:57:38 +07:00

56 lines
2.3 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime, timedelta
from odoo import api, models, fields
from odoo.osv import expression
from odoo.addons.mail.tools.discuss import Store
class ChannelMember(models.Model):
_inherit = 'discuss.channel.member'
@api.autovacuum
def _gc_unpin_livechat_sessions(self):
""" Unpin read livechat sessions with no activity for at least one day to
clean the operator's interface """
members = self.env['discuss.channel.member'].search([
('is_pinned', '=', True),
('last_seen_dt', '<=', datetime.now() - timedelta(days=1)),
('channel_id.channel_type', '=', 'livechat'),
])
sessions_to_be_unpinned = members.filtered(lambda m: m.message_unread_counter == 0)
sessions_to_be_unpinned.write({'unpin_dt': fields.Datetime.now()})
for member in sessions_to_be_unpinned:
member._bus_send("discuss.channel/unpin", {"id": member.channel_id.id})
def _to_store(self, store: Store, **kwargs):
super()._to_store(store, **kwargs)
for member in self.filtered(lambda m: m.channel_id.channel_type == "livechat"):
# sudo: discuss.channel - reading livechat channel to check whether current member is a bot is allowed
store.add(
member,
{
"is_bot": member.partner_id
in member.channel_id.sudo().livechat_channel_id.rule_ids.chatbot_script_id.operator_partner_id,
},
)
def _get_store_partner_fields(self, fields):
self.ensure_one()
if self.channel_id.channel_type == 'livechat':
return ["active", "country", "is_public", "user_livechat_username", "write_date"]
return super()._get_store_partner_fields(fields)
def _get_rtc_invite_members_domain(self, *a, **kw):
domain = super()._get_rtc_invite_members_domain(*a, **kw)
chatbot = self.channel_id.chatbot_current_step_id.chatbot_script_id
if self.channel_id.channel_type == "livechat" and chatbot:
domain = expression.AND(
[
domain,
[("partner_id", "!=", chatbot.operator_partner_id.id)],
]
)
return domain