mirror of
https://github.com/bringout/oca-ocb-mail.git
synced 2026-04-21 20:22:04 +02:00
80 lines
3.8 KiB
Python
80 lines
3.8 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.http import request, route
|
|
from odoo.addons.mail.controllers.webclient import WebclientController
|
|
from odoo.addons.mail.tools.discuss import Store
|
|
|
|
|
|
class WebClient(WebclientController):
|
|
@route("/web/tests/livechat", type="http", auth="user")
|
|
def test_external_livechat(self, **kwargs):
|
|
return request.render(
|
|
"im_livechat.unit_embed_suite",
|
|
{
|
|
"server_url": request.env["ir.config_parameter"].get_base_url(),
|
|
"session_info": {"view_info": request.env["ir.ui.view"].get_view_info()},
|
|
},
|
|
)
|
|
|
|
@classmethod
|
|
def _process_request_for_internal_user(self, store: Store, name, params):
|
|
super()._process_request_for_internal_user(store, name, params)
|
|
if name == "im_livechat.channel":
|
|
store.add(request.env["im_livechat.channel"].search([]), ["are_you_inside", "name"])
|
|
if name == "/im_livechat/looking_for_help":
|
|
chats_looking_for_help = request.env["discuss.channel"].search(
|
|
[("livechat_status", "=", "need_help")], order="id ASC", limit=100
|
|
)
|
|
request.update_context(
|
|
channels=request.env.context["channels"] | chats_looking_for_help
|
|
)
|
|
if name == "/im_livechat/session/data":
|
|
channel_id = params.get("channel_id")
|
|
if not channel_id:
|
|
return
|
|
channel = request.env["discuss.channel"].search([("id", "=", channel_id)])
|
|
if not channel:
|
|
return
|
|
fields_to_store = channel._get_livechat_session_fields_to_store()
|
|
store.add(channel, fields=fields_to_store)
|
|
if name == "/im_livechat/fetch_self_expertise":
|
|
store.add(request.env.user, Store.Many("livechat_expertise_ids", ["name"]))
|
|
|
|
@classmethod
|
|
def _process_request_for_all(self, store: Store, name, params):
|
|
super()._process_request_for_all(store, name, params)
|
|
if name == "init_livechat":
|
|
partner, guest = request.env["res.partner"]._get_current_persona()
|
|
if partner:
|
|
store.add_global_values(self_partner=Store.One(partner, extra_fields="email"))
|
|
if guest:
|
|
store.add_global_values(self_guest=Store.One(guest))
|
|
# sudo - im_livechat.channel: allow access to live chat channel to
|
|
# check if operators are available.
|
|
channel = request.env["im_livechat.channel"].sudo().search([("id", "=", params)])
|
|
if not channel:
|
|
return
|
|
country_id = (
|
|
# sudo - res.country: accessing user country is allowed.
|
|
request.env["res.country"].sudo().search([("code", "=", code)]).id
|
|
if (code := request.geoip.country_code)
|
|
else None
|
|
)
|
|
url = request.httprequest.headers.get("Referer")
|
|
if (
|
|
# sudo - im_livechat.channel.rule: getting channel's rule is allowed.
|
|
matching_rule := request.env["im_livechat.channel.rule"]
|
|
.sudo()
|
|
.match_rule(params, url, country_id)
|
|
):
|
|
matching_rule = matching_rule.with_context(
|
|
lang=request.env["chatbot.script"]._get_chatbot_language(),
|
|
)
|
|
store.add_global_values(livechat_rule=Store.One(matching_rule))
|
|
store.add_global_values(
|
|
livechat_available=matching_rule.action != "hide_button"
|
|
and bool(matching_rule._is_bot_configured() or channel.available_operator_ids),
|
|
can_download_transcript=bool(
|
|
request.env.ref("im_livechat.action_report_livechat_conversation", False),
|
|
),
|
|
)
|