oca-ocb-core/odoo-bringout-oca-ocb-mail/mail/models/discuss/ir_websocket.py
Ernad Husremovic 2d3ee4855a 19.0 vanilla
2026-03-09 09:30:27 +01:00

39 lines
1.6 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
import re
from odoo import models
from odoo.fields import Domain
class IrWebsocket(models.AbstractModel):
"""Override to handle discuss specific features (channel in particular)."""
_inherit = "ir.websocket"
def _build_bus_channel_list(self, channels):
channels = list(channels) # do not alter original list
discuss_channel_ids = list()
for channel in list(channels):
if isinstance(channel, str) and channel.startswith("mail.guest_"):
channels.remove(channel)
guest = self.env["mail.guest"]._get_guest_from_token(channel.split("_")[1])
if guest:
self = self.with_context(guest=guest)
if isinstance(channel, str):
match = re.findall(r'discuss\.channel_(\d+)', channel)
if match:
channels.remove(channel)
discuss_channel_ids.append(int(match[0]))
guest = self.env["mail.guest"]._get_guest_from_context()
if guest:
channels.append(guest)
domain = ["|", ("is_member", "=", True), ("id", "in", discuss_channel_ids)]
all_user_channels = self.env["discuss.channel"].search(domain)
internal_specific_channels = [
(c, "internal_users")
for c in all_user_channels
if not self.env.user.share
]
channels.extend([*all_user_channels, *internal_specific_channels])
return super()._build_bus_channel_list(channels)