[IMP] mail: make channel_info private
Make `channel_info` private so that it is no longer exposed to RPCs. closes odoo/odoo#127078 Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
This commit is contained in:
@@ -49,7 +49,7 @@ class TestOutOfOffice(TestHrHolidaysCommon):
|
||||
'channel_type': 'chat',
|
||||
'name': 'test'
|
||||
})
|
||||
channel_info = channel.channel_info()[0]
|
||||
channel_info = channel._channel_info()[0]
|
||||
# shape of channelMembers is [('insert', data...)], [0][1] accesses the data
|
||||
members_data = channel_info['channel']['channelMembers'][0][1]
|
||||
self.assertEqual(len(members_data), 2, "Channel info should get info for the 2 members")
|
||||
|
||||
@@ -59,11 +59,11 @@ class DiscussChannel(models.Model):
|
||||
notifications = self._channel_channel_notifications(unpinned_members.partner_id.ids) + notifications
|
||||
return notifications
|
||||
|
||||
def channel_info(self):
|
||||
def _channel_info(self):
|
||||
""" Extends the channel header by adding the livechat operator and the 'anonymous' profile
|
||||
:rtype : list(dict)
|
||||
"""
|
||||
channel_infos = super().channel_info()
|
||||
channel_infos = super()._channel_info()
|
||||
channel_infos_dict = dict((c['id'], c) for c in channel_infos)
|
||||
for channel in self:
|
||||
channel_infos_dict[channel.id]['channel']['anonymous_name'] = channel.anonymous_name
|
||||
|
||||
@@ -199,7 +199,7 @@ class ImLivechatChannel(models.Model):
|
||||
discuss_channel = self.env["discuss.channel"].with_context(mail_create_nosubscribe=False).sudo().create(discuss_channel_vals)
|
||||
if user_operator:
|
||||
discuss_channel._broadcast([user_operator.partner_id.id])
|
||||
return discuss_channel.sudo().channel_info()[0]
|
||||
return discuss_channel.sudo()._channel_info()[0]
|
||||
else:
|
||||
operator_partner_id = user_operator.partner_id if user_operator else chatbot_script.operator_partner_id
|
||||
display_name = operator_partner_id.user_livechat_username or operator_partner_id.display_name
|
||||
|
||||
@@ -46,8 +46,10 @@ QUnit.test("closing a chat window with no message from admin side unpins it", as
|
||||
await click(".o_menu_systray i[aria-label='Messages']");
|
||||
await click(".o-mail-NotificationItem");
|
||||
await click(".o-mail-ChatWindow-header .o-mail-ChatWindow-command[title='Close Chat Window']");
|
||||
const channels = await env.services.orm.silent.call("discuss.channel", "channel_info", [
|
||||
channelId,
|
||||
]);
|
||||
assert.strictEqual(channels[0].is_pinned, false, "Livechat channel should not be pinned");
|
||||
const [channel] = await env.services.rpc(
|
||||
"/discuss/channel/info",
|
||||
{ channel_id: channelId },
|
||||
{ silent: true }
|
||||
);
|
||||
assert.strictEqual(channel.is_pinned, false, "Livechat channel should not be pinned");
|
||||
});
|
||||
|
||||
@@ -45,6 +45,13 @@ class ChannelController(http.Controller):
|
||||
raise NotFound()
|
||||
channel.write({"image_128": data})
|
||||
|
||||
@http.route("/discuss/channel/info", methods=["POST"], type="json")
|
||||
def discuss_channel_info(self, channel_id):
|
||||
member_sudo = request.env["discuss.channel.member"]._get_as_sudo_from_request_or_raise(
|
||||
request=request, channel_id=int(channel_id)
|
||||
)
|
||||
return member_sudo.channel_id._channel_info()
|
||||
|
||||
@http.route("/discuss/channel/messages", methods=["POST"], type="json", auth="public")
|
||||
def discuss_channel_messages(self, channel_id, before=None, after=None, limit=30, around=None):
|
||||
channel_member_sudo = request.env["discuss.channel.member"]._get_as_sudo_from_request_or_raise(
|
||||
|
||||
@@ -145,7 +145,7 @@ class PublicPageController(http.Controller):
|
||||
"mail.discuss_public_channel_template",
|
||||
{
|
||||
"data": {
|
||||
"channelData": channel_sudo.channel_info()[0],
|
||||
"channelData": channel_sudo._channel_info()[0],
|
||||
"discussPublicViewData": dict(
|
||||
{
|
||||
"channel": [("insert", {"id": channel_sudo.id, "model": "discuss.channel"})],
|
||||
|
||||
@@ -327,7 +327,7 @@ class Channel(models.Model):
|
||||
self.message_unsubscribe(partner.ids)
|
||||
if partner not in self.with_context(active_test=False).channel_partner_ids:
|
||||
return True
|
||||
channel_info = self.channel_info()[0] # must be computed before leaving the channel (access rights)
|
||||
channel_info = self._channel_info()[0] # must be computed before leaving the channel (access rights)
|
||||
member = self.env['discuss.channel.member'].search([('channel_id', '=', self.id), ('partner_id', '=', partner.id)])
|
||||
member_id = member.id
|
||||
member.unlink()
|
||||
@@ -393,7 +393,7 @@ class Channel(models.Model):
|
||||
user = member.partner_id.user_ids[0] if member.partner_id.user_ids else self.env['res.users']
|
||||
if user:
|
||||
notifications.append((member.partner_id, 'discuss.channel/joined', {
|
||||
'channel': member.channel_id.with_user(user).with_context(allowed_company_ids=user.company_ids.ids).sudo().channel_info()[0],
|
||||
'channel': member.channel_id.with_user(user).with_context(allowed_company_ids=user.company_ids.ids).sudo()._channel_info()[0],
|
||||
'invited_by_user_id': self.env.user.id,
|
||||
'open_chat_window': open_chat_window,
|
||||
}))
|
||||
@@ -411,7 +411,7 @@ class Channel(models.Model):
|
||||
guest = member.guest_id
|
||||
if guest:
|
||||
notifications.append((guest, 'discuss.channel/joined', {
|
||||
'channel': member.channel_id.sudo().channel_info()[0],
|
||||
'channel': member.channel_id.sudo()._channel_info()[0],
|
||||
}))
|
||||
notifications.append((channel, 'mail.record/insert', {
|
||||
'Channel': {
|
||||
@@ -670,7 +670,7 @@ class Channel(models.Model):
|
||||
user_channels = self.with_user(user_id).with_context(
|
||||
allowed_company_ids=user_id.company_ids.ids
|
||||
)
|
||||
for channel_info in user_channels.channel_info():
|
||||
for channel_info in user_channels._channel_info():
|
||||
notifications.append((partner, 'discuss.channel/legacy_insert', channel_info))
|
||||
return notifications
|
||||
|
||||
@@ -747,7 +747,7 @@ class Channel(models.Model):
|
||||
}
|
||||
self.message_post(body=notification, message_type="notification", subtype_xmlid="mail.mt_comment")
|
||||
|
||||
def channel_info(self):
|
||||
def _channel_info(self):
|
||||
""" Get the informations header for the current channels
|
||||
:returns a list of channels values
|
||||
:rtype : list(dict)
|
||||
@@ -919,7 +919,7 @@ class Channel(models.Model):
|
||||
'name': ', '.join(self.env['res.partner'].sudo().browse(partners_to).mapped('name')),
|
||||
})
|
||||
channel._broadcast(partners_to)
|
||||
return channel.channel_info()[0]
|
||||
return channel._channel_info()[0]
|
||||
|
||||
def channel_fold(self, state=None):
|
||||
""" Update the fold_state of the given session. In order to syncronize web browser
|
||||
@@ -960,7 +960,7 @@ class Channel(models.Model):
|
||||
if not pinned:
|
||||
self.env['bus.bus']._sendone(self.env.user.partner_id, 'discuss.channel/unpin', {'id': self.id})
|
||||
else:
|
||||
self.env['bus.bus']._sendone(self.env.user.partner_id, 'discuss.channel/legacy_insert', self.channel_info()[0])
|
||||
self.env['bus.bus']._sendone(self.env.user.partner_id, 'discuss.channel/legacy_insert', self._channel_info()[0])
|
||||
|
||||
def _channel_seen(self, last_message_id=None, allow_older=False):
|
||||
"""
|
||||
@@ -1095,7 +1095,7 @@ class Channel(models.Model):
|
||||
'link': Markup('<a href="#" class="o_channel_redirect" data-oe-id="%s">#%s</a>') % (new_channel.id, new_channel.name)
|
||||
}
|
||||
new_channel.message_post(body=notification, message_type="notification", subtype_xmlid="mail.mt_comment")
|
||||
channel_info = new_channel.channel_info()[0]
|
||||
channel_info = new_channel._channel_info()[0]
|
||||
self.env['bus.bus']._sendone(self.env.user.partner_id, 'discuss.channel/legacy_insert', channel_info)
|
||||
return channel_info
|
||||
|
||||
@@ -1117,7 +1117,7 @@ class Channel(models.Model):
|
||||
'name': name,
|
||||
})
|
||||
channel._broadcast(partners_to)
|
||||
return channel.channel_info()[0]
|
||||
return channel._channel_info()[0]
|
||||
|
||||
@api.model
|
||||
def get_mention_suggestions(self, search, limit=8):
|
||||
|
||||
@@ -103,7 +103,7 @@ class MailGuest(models.Model):
|
||||
self.ensure_one()
|
||||
odoobot = self.env.ref('base.partner_root')
|
||||
return {
|
||||
'channels': self.channel_ids.channel_info(),
|
||||
'channels': self.channel_ids._channel_info(),
|
||||
'companyName': self.env.company.name,
|
||||
'currentGuest': {
|
||||
'id': self.id,
|
||||
|
||||
@@ -51,7 +51,7 @@ class ResUsers(models.Model):
|
||||
def _init_messaging(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'channels': self.partner_id._get_channels_as_member().channel_info(),
|
||||
'channels': self.partner_id._get_channels_as_member()._channel_info(),
|
||||
'hasGifPickerFeature': bool(self.env["ir.config_parameter"].sudo().get_param("discuss.tenor_api_key")),
|
||||
**super()._init_messaging(),
|
||||
}
|
||||
|
||||
@@ -450,7 +450,7 @@ export class Messaging {
|
||||
const { id, message: messageData } = notif.payload;
|
||||
let channel = this.store.threads[createLocalId("discuss.channel", id)];
|
||||
if (!channel || !channel.type) {
|
||||
const [channelData] = await this.orm.call("discuss.channel", "channel_info", [id]);
|
||||
const [channelData] = await this.rpc("/discuss/channel/info", { channel_id: id });
|
||||
channel = this.threadService.insert({
|
||||
model: "discuss.channel",
|
||||
type: channelData.channel.channel_type,
|
||||
|
||||
@@ -83,7 +83,7 @@ export class ThreadService {
|
||||
* @returns {Promise<Thread>}
|
||||
*/
|
||||
async fetchChannel(id) {
|
||||
const [channelData] = await this.orm.call("discuss.channel", "channel_info", [id]);
|
||||
const [channelData] = await this.rpc("/discuss/channel/info", { channel_id: id });
|
||||
return this.insert({
|
||||
...channelData,
|
||||
model: "discuss.channel",
|
||||
|
||||
@@ -1070,7 +1070,7 @@ QUnit.test("Do no channel_info after unpin", async (assert) => {
|
||||
const channelId = pyEnv["discuss.channel"].create({ name: "General", channel_type: "chat" });
|
||||
const { env, openDiscuss } = await start({
|
||||
mockRPC(route, args, originalRPC) {
|
||||
if (args.method === "channel_info") {
|
||||
if (route === "/discuss/channel/info") {
|
||||
assert.step("channel_info");
|
||||
}
|
||||
return originalRPC(route, args);
|
||||
|
||||
@@ -49,9 +49,9 @@ patch(MockServer.prototype, "mail/models/discuss_channel", {
|
||||
: undefined;
|
||||
return this._mockDiscussChannelChannelGet(partners_to, pin);
|
||||
}
|
||||
if (args.model === "discuss.channel" && args.method === "channel_info") {
|
||||
const ids = args.args[0];
|
||||
return this._mockDiscussChannelChannelInfo(ids);
|
||||
if (route === "/discuss/channel/info") {
|
||||
const id = args.channel_id;
|
||||
return this._mockDiscussChannelChannelInfo([id]);
|
||||
}
|
||||
if (args.model === "discuss.channel" && args.method === "add_members") {
|
||||
const ids = args.args[0];
|
||||
|
||||
@@ -381,14 +381,14 @@ class TestChannelInternals(MailCommon):
|
||||
|
||||
chat._channel_seen(msg_2.id)
|
||||
self.assertEqual(
|
||||
chat.channel_info()[0]['seen_partners_info'][0]['seen_message_id'],
|
||||
chat._channel_info()[0]['seen_partners_info'][0]['seen_message_id'],
|
||||
msg_2.id,
|
||||
"Last message id should have been updated"
|
||||
)
|
||||
|
||||
chat._channel_seen(msg_1.id)
|
||||
self.assertEqual(
|
||||
chat.channel_info()[0]['seen_partners_info'][0]['seen_message_id'],
|
||||
chat._channel_info()[0]['seen_partners_info'][0]['seen_message_id'],
|
||||
msg_2.id,
|
||||
"Last message id should stay the same after mark channel as seen with an older message"
|
||||
)
|
||||
|
||||
@@ -36,6 +36,6 @@ class WebsiteLivechatChatbotScriptController(http.Controller):
|
||||
|
||||
return request.render("im_livechat.chatbot_test_script_page", {
|
||||
'server_url': chatbot_script.get_base_url(),
|
||||
'channel_data': discuss_channel.channel_info()[0],
|
||||
'channel_data': discuss_channel._channel_info()[0],
|
||||
'chatbot_data': chatbot_script._format_for_frontend()
|
||||
})
|
||||
|
||||
@@ -22,13 +22,13 @@ class DiscussChannel(models.Model):
|
||||
if self.livechat_active and not self.message_ids:
|
||||
self.sudo().unlink()
|
||||
|
||||
def channel_info(self):
|
||||
def _channel_info(self):
|
||||
"""
|
||||
Override to add visitor information on the mail channel infos.
|
||||
This will be used to display a banner with visitor informations
|
||||
at the top of the livechat channel discussion view in discuss module.
|
||||
"""
|
||||
channel_infos = super().channel_info()
|
||||
channel_infos = super()._channel_info()
|
||||
channel_infos_dict = dict((c['id'], c) for c in channel_infos)
|
||||
for channel in self.filtered('livechat_visitor_id'):
|
||||
visitor = channel.livechat_visitor_id
|
||||
|
||||
@@ -92,7 +92,7 @@ class WebsiteVisitor(models.Model):
|
||||
'fold_state': 'open',
|
||||
'is_minimized': True,
|
||||
})
|
||||
discuss_channels_info = discuss_channels.channel_info()
|
||||
discuss_channels_info = discuss_channels._channel_info()
|
||||
notifications = []
|
||||
for discuss_channel_info in discuss_channels_info:
|
||||
notifications.append([operator.partner_id, 'website_livechat.send_chat_request', discuss_channel_info])
|
||||
|
||||
Reference in New Issue
Block a user