[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:
Louis Wicket (wil)
2023-07-04 00:51:54 +02:00
parent 0d0546c455
commit ce07b37111
17 changed files with 41 additions and 32 deletions
@@ -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")
+2 -2
View File
@@ -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):
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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])