Files
odoo_source/addons/website_livechat/models/website.py
T
tsm-odoo 633e031aa8 [FIX] im_livechat: error when loading a page with outdated guest
This PR fixes two issues:
- Incorrect write on `channel_member_ids` (trying to link guest instead
of channel member)
- Incorrect condition in  `livechatService.leaveSession` that relies on
the live chat to be initialized while it can acutally be called before
if the current session is outdated.

This could result in server errors in the following scenario:
- Open a live chat
- Log in
- Open a live chat from the website app
- Log out
- Reload the page

closes odoo/odoo#137834

Signed-off-by: Matthieu Stockbauer (tsm) <tsm@odoo.com>
2023-10-16 12:00:02 +00:00

78 lines
4.0 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models, _, Command
from odoo.addons.http_routing.models.ir_http import url_for
from odoo.addons.mail.models.discuss.mail_guest import add_guest_to_context
class Website(models.Model):
_inherit = "website"
channel_id = fields.Many2one('im_livechat.channel', string='Website Live Chat Channel')
@add_guest_to_context
def _get_livechat_channel_info(self):
""" Get the livechat info dict (button text, channel name, ...) for the livechat channel of
the current website.
"""
self.ensure_one()
if self.channel_id:
livechat_info = self.channel_id.sudo().get_livechat_info()
if livechat_info['available']:
livechat_request_session = self._get_livechat_request_session()
if livechat_request_session:
livechat_info['options']['chat_request_session'] = livechat_request_session
return livechat_info
return {}
def _get_livechat_request_session(self):
"""
Check if there is an opened chat request for the website livechat channel and the current visitor (from request).
If so, prepare the livechat session information that will be stored in visitor's cookies
and used by livechat widget to directly open this session instead of allowing the visitor to
initiate a new livechat session.
:param {int} channel_id: channel
:return: {dict} livechat request session information
"""
visitor = self.env['website.visitor']._get_visitor_from_request()
if visitor:
# get active chat_request linked to visitor
chat_request_channel = self.env['discuss.channel'].sudo().search([
('livechat_visitor_id', '=', visitor.id),
('livechat_channel_id', '=', self.channel_id.id),
('livechat_active', '=', True),
('has_message', '=', True)
], order='create_date desc', limit=1)
if chat_request_channel:
if not visitor.partner_id:
current_guest = self.env['mail.guest']._get_guest_from_context()
channel_guest_member = chat_request_channel.channel_member_ids.filtered(lambda m: m.guest_id)
if current_guest and current_guest != channel_guest_member.guest_id:
# Channel was created with a guest but the visitor was
# linked to another guest in the meantime. We need to
# update the channel to link it to the current guest.
chat_request_channel.write({'channel_member_ids': [Command.unlink(channel_guest_member.id), Command.create({'guest_id': current_guest.id})]})
if not current_guest:
channel_guest_member.guest_id._set_auth_cookie()
return {
"folded": False,
"id": chat_request_channel.id,
"requested_by_operator": chat_request_channel.create_uid in chat_request_channel.livechat_operator_id.user_ids,
"operator_pid": [
chat_request_channel.livechat_operator_id.id,
chat_request_channel.livechat_operator_id.user_livechat_username or chat_request_channel.livechat_operator_id.display_name,
chat_request_channel.livechat_operator_id.user_livechat_username,
],
"name": chat_request_channel.name,
"uuid": chat_request_channel.uuid,
"type": "chat_request"
}
return {}
def get_suggested_controllers(self):
suggested_controllers = super(Website, self).get_suggested_controllers()
suggested_controllers.append((_('Live Support'), url_for('/livechat'), 'website_livechat'))
return suggested_controllers