Repository
odoo/odoo · module folder
Module version
1.0
Category
Website/Live Chat
Folder size
8.43 MB
License
LGPL-3
Application
Yes
Auto-installable
No
Website
https://www.odoo.com/app/live-chat
Last tracking update
2026-08-15 22:44:17
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Xavier Morel, Olivier Dony, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Lucas Perais (lpe), Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Romeo Fragomeli, Sébastien Theys, Julien Mougenot, Rémy Voet (ryv), Tiffany Chang (tic), ThanhDodeurOdoo, Gorash, Pierre Paridans, William Braeckman, Romain Estievenart, Miquel Raïch, yhu-odoo, Didier (did), Julien Banken, tsm-odoo, Louis Wicket (wil), Maximilien (malb), Victor Piryns (pivi), Dylan Kiss (dyki), Rahul Prajapati, omra-odoo, Zelong Lin, maad-odoo, bary, Maryam Kia, reka-odoo, Alex Kühn, Chrysanthe (chgo), Junqi Wu, mano-odoo, Pierre Pulinckx (PIPU), aych-odoo, Pierre Pulinckx, Bastien PIERRE, Mahdi Alijani (malj), Krzysztof Magusiak (krma), nees-odoo, utma-odoo, Ayush Chauhan (aych), Giorgio Tocco (gito), akha, jayp-odoo, Laetitia (ldau), ramh, Kevin Gerard (kege), Akash Parmar, pmah-odoo, nmak-odoo, saurabh, ibo-odoo, akth-odoo, akus-odoo, Haja Ram, chpa-odoo, shmn-odoo, mear-odoo, niyp-odoo, Louis Wicket, ypat-odoo
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
crm_livechat, hr_livechat, spreadsheet_dashboard_im_livechat, test_discuss_full, website_hr_recruitment_livechat, website_livechat
Description
Live Chat Support
==========================

Allow to drop instant messaging widgets on any web page that will communicate
with the current server and dispatch visitors request amongst several live
chat operators.
Help your customers with this chat, and analyse their feedback.

        

Code Analysis

Views touched (47)
XML IDNameModelTypeStatus
chatbot_script_answer_view_form chatbot.script.answer.view.form chatbot.script.answer form New
chatbot_script_answer_view_tree chatbot.script.answer.view.list chatbot.script.answer list New
chatbot_script_step_view_form chatbot.script.step.view.form chatbot.script.step form New
chatbot_script_step_view_tree chatbot.script.step.view.list chatbot.script.step list New
chatbot_script_view_form chatbot.script.view.form chatbot.script form New
chatbot_script_view_search chatbot.script.view.search chatbot.script search New
chatbot_script_view_tree chatbot.script.view.list chatbot.script list New
chatbot_test_script_page chatbot_test_script_page ir.ui.view qweb New
discuss_channel_looking_for_help_view_kanban discuss.channel.kanban discuss.channel kanban New
discuss_channel_looking_for_help_view_list discuss.channel.looking.for.help.list discuss.channel list New
discuss_channel_looking_for_help_view_search discuss.channel.looking.for.help.view.search discuss.channel search New
discuss_channel_view_form discuss.channel.form discuss.channel form New
discuss_channel_view_graph discuss.channel.graph discuss.channel graph New
discuss_channel_view_kanban discuss.channel.kanban discuss.channel kanban New
discuss_channel_view_pivot discuss.channel.pivot discuss.channel pivot New
discuss_channel_view_search discuss.channel.search discuss.channel search New
discuss_channel_view_tree discuss.channel.list discuss.channel list New
external_loader Livechat : external_script field of livechat channel ir.ui.view qweb New
im_livechat.digest_digest_view_form_inherit im.livechat.digest.digest.view.form.inherit digest.digest form Inherits digest.digest_digest_view_form
im_livechat.unit_embed_suite im_livechat.unit_embed_suite ir.ui.view qweb New
im_livechat_agent_history_view_graph im_livechat.agent.history.graph im_livechat.channel.member.history graph New
im_livechat_agent_history_view_pivot im_livechat.agent.history.pivot im_livechat.channel.member.history pivot New
im_livechat_agent_history_view_search im_livechat.agent.history.search im_livechat.channel.member.history search New
im_livechat_channel_conversation_tag_view_form im.livechat.channel.conversation.tag.form im_livechat.conversation.tag form New
im_livechat_channel_conversation_tag_view_list im.livechat.channel.conversation.tag.list im_livechat.conversation.tag list New
im_livechat_channel_member_history_view_search im_livechat.channel.member.history.view.search im_livechat.channel.member.history search New
im_livechat_channel_member_history_view_tree im_livechat.channel.member.history.view.list im_livechat.channel.member.history list New
im_livechat_channel_rule_view_form im_livechat.channel.rule.form im_livechat.channel.rule form New
im_livechat_channel_rule_view_kanban im_livechat.channel.rule.kanban im_livechat.channel.rule kanban New
im_livechat_channel_rule_view_tree im.livechat.channel.rule.list im_livechat.channel.rule list New
im_livechat_channel_view_form im_livechat.channel.form im_livechat.channel form New
im_livechat_channel_view_kanban im_livechat.channel.kanban im_livechat.channel kanban New
im_livechat_channel_view_search im.livechat.channel.view.search im_livechat.channel search New
im_livechat_expertise_view_form im.livechat.expertise.form im_livechat.expertise form New
im_livechat_expertise_view_list im.livechat.expertise.list im_livechat.expertise list New
im_livechat_report_channel_view_form im_livechat.report.channel.form im_livechat.report.channel form New
im_livechat_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph New
im_livechat_report_channel_view_list im_livechat.report.channel.list im_livechat.report.channel list New
im_livechat_report_channel_view_pivot im_livechat.report.channel.pivot im_livechat.report.channel pivot New
im_livechat_report_channel_view_search im_livechat.report.channel.search im_livechat.report.channel search New
livechat_email_template livechat_email_template ir.ui.view qweb New
loader Livechat : Javascript appending the livechat button ir.ui.view qweb New
report_livechat_conversation report_livechat_conversation ir.ui.view qweb New
res_users_form_view res.users.form.im_livechat res.users form Inherits base.view_users_form
res_users_form_view_simple_modif res.users.preferences.form.im_livechat res.users form Inherits base.view_users_form_simple_modif
support_page Livechat : Support Page ir.ui.view qweb New
view_partner_form res.partner.view.buttons res.partner form Inherits base.view_partner_form
HTTP endpoints (53)
Route(s)HandlerAuthTypeMethodsFlags
/chatbot/cors/restart CorsLivechatChatbotScriptController.cors_chatbot_restart public jsonrpc ALL
/chatbot/cors/answer/save CorsLivechatChatbotScriptController.cors_chatbot_save_answer public jsonrpc ALL
/chatbot/cors/step/trigger CorsLivechatChatbotScriptController.cors_chatbot_trigger_step public jsonrpc ALL
/chatbot/cors/step/validate_email CorsLivechatChatbotScriptController.cors_chatbot_validate_email public jsonrpc ALL
/im_livechat/cors/download_transcript/<int:channel_id> CorsLivechatController.cors_download_livechat_transcript public http ALL
/im_livechat/cors/feedback CorsLivechatController.cors_feedback public jsonrpc ALL
/im_livechat/cors/get_session CorsLivechatController.cors_get_session public jsonrpc POST
/im_livechat/cors/history CorsLivechatController.cors_history_pages public jsonrpc ALL
/im_livechat/cors/init CorsLivechatController.cors_livechat_init public jsonrpc ALL
/im_livechat/cors/visitor_leave_session CorsLivechatController.cors_visitor_leave_session public jsonrpc ALL
/im_livechat/cors/attachment/delete LivechatAttachmentController.im_livechat_attachment_delete public jsonrpc POST
/im_livechat/cors/attachment/upload LivechatAttachmentController.im_livechat_attachment_upload public http ALL csrf off
(inherited route override) LivechatAttachmentController.mail_attachment_upload inherited http ALL
/im_livechat/cors/channel/mark_as_read LivechatChannelController.livechat_channel_mark_as_read public jsonrpc POST
/im_livechat/cors/channel/messages LivechatChannelController.livechat_channel_messages public jsonrpc POST
/im_livechat/cors/channel/notify_typing LivechatChannelController.livechat_channel_notify_typing public jsonrpc POST
/im_livechat/conversation/create_and_link_expertise LivechatChannelController.livechat_conversation_create_and_link_expertise user jsonrpc POST
/im_livechat/conversation/update_tags LivechatChannelController.livechat_conversation_update_tags user jsonrpc POST sudo
/im_livechat/conversation/write_expertises LivechatChannelController.livechat_conversation_write_expertises user jsonrpc POST sudo
/im_livechat/session/update_note LivechatChannelController.livechat_session_update_note user jsonrpc POST sudo
/im_livechat/session/update_status LivechatChannelController.livechat_session_update_status user jsonrpc POST sudo
/chatbot/restart LivechatChatbotScriptController.chatbot_restart public jsonrpc ALL
/chatbot/answer/save LivechatChatbotScriptController.chatbot_save_answer public jsonrpc ALL sudo
/chatbot/step/trigger LivechatChatbotScriptController.chatbot_trigger_step public jsonrpc ALL sudo
/chatbot/step/validate_email LivechatChatbotScriptController.chatbot_validate_email public jsonrpc ALL sudo
/im_livechat/assets_embed.<any(css, js):ext> LivechatController.assets_embed public http ALL
/im_livechat/download_transcript/<int:channel_id> LivechatController.download_livechat_transcript public http ALL sudo
/im_livechat/email_livechat_transcript LivechatController.email_livechat_transcript user jsonrpc ALL
/im_livechat/external_lib.<any(css,js):ext> LivechatController.external_lib public http ALL
/im_livechat/feedback LivechatController.feedback public jsonrpc ALL sudo
/im_livechat/font-awesome LivechatController.fontawesome none http ALL
/im_livechat/emoji_bundle LivechatController.get_emoji_bundle public http ALL
/im_livechat/get_session LivechatController.get_session public jsonrpc POST sudo
/im_livechat/history LivechatController.history_pages public jsonrpc ALL sudo
/im_livechat/loader/<int:channel_id> LivechatController.loader public http ALL sudo
/im_livechat/odoo_ui_icons LivechatController.odoo_ui_icons none http ALL
/im_livechat/support/<int:channel_id> LivechatController.support_page public http ALL sudo
/im_livechat/visitor_leave_session LivechatController.visitor_leave_session public jsonrpc ALL
/im_livechat/cors/link_preview LivechatLinkPreviewController.livechat_link_preview public jsonrpc POST
/im_livechat/cors/link_preview/hide LivechatLinkPreviewController.livechat_link_preview_hide public jsonrpc POST
/im_livechat/cors/message/reaction LivechatMessageReactionController.livechat_message_reaction public jsonrpc POST
(inherited route override) LivechatRtcController.channel_call_join inherited http ALL sudo
/im_livechat/cors/rtc/channel/join_call LivechatRtcController.livechat_channel_call_join public jsonrpc POST
/im_livechat/cors/rtc/channel/leave_call LivechatRtcController.livechat_channel_call_leave public jsonrpc POST
/im_livechat/cors/channel/ping LivechatRtcController.livechat_channel_ping public jsonrpc POST
/im_livechat/cors/rtc/session/notify_call_members LivechatRtcController.livechat_session_call_notify public jsonrpc POST
/im_livechat/cors/rtc/session/update_and_broadcast LivechatRtcController.livechat_session_update_and_broadcast public jsonrpc POST
/im_livechat/cors/message/post LivechatThreadController.livechat_message_post public jsonrpc POST
/im_livechat/cors/message/update_content LivechatThreadController.livechat_message_update_content public jsonrpc POST
(inherited route override) ThreadController.mail_message_post inherited http ALL
/im_livechat/cors/action WebClient.livechat_action public jsonrpc POST
/im_livechat/cors/data WebClient.livechat_data public jsonrpc POST
/web/tests/livechat WebClient.test_external_livechat user http ALL
Models touched (23)

New fields (6)
  • discuss_channel_id Many2one → discuss.channel
    index=True ondelete='cascade' required=True string='Discussion Channel' args: 'discuss.channel'
  • mail_message_id Many2one → mail.message
    string='Related Mail Message' args: 'mail.message'
  • script_step_id Many2one → chatbot.script.step
    index='btree_not_null' string='Chatbot Step' args: 'chatbot.script.step'
  • user_raw_answer Html
    string="User's raw answer"
  • user_raw_script_answer_id Integer
    help='Id of the script answer. Useful for statistics when answer is deleted.'
  • user_script_answer_id Many2one → chatbot.script.answer
    ondelete='set null' string="User's answer" args: 'chatbot.script.answer'
Public methods (0)

No public methods.

New fields (7)
  • active Boolean
    default=True
  • first_step_warning Selection
    compute='_compute_first_step_warning' args: [('first_step_operator', 'First Step Operator'), ('first_step_invalid', 'First Step Invalid')]
  • image_1920 Image
    readonly=False related='operator_partner_id.image_1920'
  • livechat_channel_count Integer
    compute='_compute_livechat_channel_count' string='Livechat Channel Count'
  • operator_partner_id Many2one → res.partner
    copy=False index=True ondelete='restrict' required=True string='Bot Operator' args: 'res.partner'
  • script_step_ids One2many → chatbot.script.step
    copy=True string='Script Steps' args: 'chatbot.script.step', 'chatbot_script_id'
  • title Char
    default='Chatbot' required=True translate=True args: 'Title'
Public methods (5)
  • action_view_livechat_channels(self)
  • copy(self, default=None)
    Correctly copy the 'triggering_answer_ids' field from the original script_step_ids to the clone. This needs to be done in post-processing to make sure we get references to the newly created answers from the copy instead of references to the answers of the original. This implementation assumes that the order of created steps and answers will be kept between the original and the clone, using 'zip()' to match the records between the two.
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (5)
  • chatbot_script_id Many2one
    related='script_step_id.chatbot_script_id'
  • name Char
    required=True string='Answer' translate=True
  • redirect_link Char
    help='The visitor will be redirected to this link upon clicking the option (note that the script will end if the link is external to the livechat website).' args: 'Redirect Link'
  • script_step_id Many2one → chatbot.script.step
    index=True ondelete='cascade' required=True string='Script Step' args: 'chatbot.script.step'
  • sequence Integer
    default=1 string='Sequence'
Public methods (0)

No public methods.

New fields (10)
  • answer_ids One2many → chatbot.script.answer
    copy=True string='Answers' args: 'chatbot.script.answer', 'script_step_id'
  • chatbot_script_id Many2one → chatbot.script
    index=True ondelete='cascade' required=True string='Chatbot' args: 'chatbot.script'
  • is_forward_operator Boolean
    compute='_compute_is_forward_operator'
  • is_forward_operator_child Boolean
    compute='_compute_is_forward_operator_child'
  • message Html
    string='Message' translate=True
  • name Char
    compute='_compute_name' string='Name'
  • operator_expertise_ids Many2many → im_livechat.expertise
    help='When forwarding live chat conversations, the chatbot will prioritize users with matching expertise.' string='Operator Expertise' args: 'im_livechat.expertise'
  • sequence Integer
    string='Sequence'
  • step_type Selection
    default='text' required=True args: [('text', 'Text'), ('question_selection', 'Question'), ('question_email', 'Email'), ('question_phone', 'Phone'), ('forward_operator', 'Forward to Operator'), ('free_input_single', 'Free Input'), ('free_input_multi', 'Free Input (Multi-Line)')]
  • triggering_answer_ids Many2many → chatbot.script.answer
    compute='_compute_triggering_answer_ids' copy=False domain="[('script_step_id.sequence', '<', sequence), ('script_step_id.chatbot_script_id', '=', chatbot_script_id)]" help='Show this step only if all of these answers have been selected.' readonly=False store=True string='Only If' args: 'chatbot.script.answer'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    Ensure we correctly assign sequences when creating steps. Indeed, sequences are very important within the script, and will break the whole flow if not correctly defined. This override will group created steps by chatbot_id and increment the sequence accordingly. It will also look for an existing step for that chatbot and resume from the highest sequence. This cannot be done in a default_value for the sequence field as we cannot search by runbot_id. It is also safer and more efficient to do it here (we can batch everything). It is still possible to manually pass the 'sequence' in the values, which will take priority.

New fields (6)
  • kpi_livechat_conversations Boolean
    args: 'Conversations handled'
  • kpi_livechat_conversations_value Integer
    compute='_compute_kpi_livechat_conversations_value'
  • kpi_livechat_rating Boolean
    args: '% of Happiness'
  • kpi_livechat_rating_value Float
    compute='_compute_kpi_livechat_rating_value' digits=(16, 2)
  • kpi_livechat_response Boolean
    args: 'Time to answer (sec)'
  • kpi_livechat_response_value Float
    compute='_compute_kpi_livechat_response_value' digits=(16, 2)
Public methods (0)

No public methods.

New fields (1)
  • livechat_participant_history_ids Many2many → im_livechat.channel.member.history
    args: 'im_livechat.channel.member.history'
Public methods (0)

No public methods.

New fields (31)
  • channel_type Selection
    ondelete={'livechat': 'cascade'} selection_add=[('livechat', 'Livechat Conversation')]
  • chatbot_current_step_id Many2one → chatbot.script.step
    string='Chatbot Current Step' args: 'chatbot.script.step'
  • chatbot_message_ids One2many → chatbot.message
    groups='im_livechat.im_livechat_group_manager' string='Chatbot Messages' args: 'chatbot.message', 'discuss_channel_id'
  • country_id Many2one → res.country
    help='Country of the visitor of the channel' string='Country' args: 'res.country'
  • duration Float
    compute='_compute_duration' help='Duration of the session in hours' args: 'Duration'
  • livechat_agent_history_ids One2many → im_livechat.channel.member.history
    compute='_compute_livechat_agent_history_ids' search='_search_livechat_agent_history_ids' string='Agents (History)' args: 'im_livechat.channel.member.history'
  • livechat_agent_partner_ids Many2many → res.partner
    compute='_compute_livechat_agent_partner_ids' store=True string='Agents' args: 'res.partner', 'im_livechat_channel_member_history_discuss_channel_agent_rel'
  • livechat_agent_providing_help_history Many2one → im_livechat.channel.member.history
    compute='_compute_livechat_agent_providing_help_history' store=True string='Help Provided (Agent)' args: 'im_livechat.channel.member.history'
  • livechat_agent_requesting_help_history Many2one → im_livechat.channel.member.history
    compute='_compute_livechat_agent_requesting_help_history' store=True string='Help Requested (Agent)' args: 'im_livechat.channel.member.history'
  • livechat_bot_history_ids One2many → im_livechat.channel.member.history
    compute='_compute_livechat_bot_history_ids' search='_search_livechat_bot_history_ids' string='Bots (History)' args: 'im_livechat.channel.member.history'
  • livechat_bot_partner_ids Many2many → res.partner
    compute='_compute_livechat_bot_partner_ids' context={'active_test': False} store=True string='Bots' args: 'res.partner', 'im_livechat_channel_member_history_discuss_channel_bot_rel'
  • livechat_channel_id Many2one → im_livechat.channel
    index='btree_not_null' args: 'im_livechat.channel', 'Channel'
  • livechat_channel_member_history_ids One2many → im_livechat.channel.member.history
    args: 'im_livechat.channel.member.history', 'channel_id'
  • livechat_conversation_tag_ids Many2many → im_livechat.conversation.tag
    groups='im_livechat.im_livechat_group_user' help='Tags to qualify the conversation.' string='Live Chat Conversation Tags' args: 'im_livechat.conversation.tag', 'livechat_conversation_tag_rel'
  • livechat_customer_guest_ids Many2many → mail.guest
    compute='_compute_livechat_customer_guest_ids' string='Customers (Guests)' args: 'mail.guest'
  • livechat_customer_history_ids One2many → im_livechat.channel.member.history
    compute='_compute_livechat_customer_history_ids' search='_search_livechat_customer_history_ids' string='Customers (History)' args: 'im_livechat.channel.member.history'
  • livechat_customer_partner_ids Many2many → res.partner
    compute='_compute_livechat_customer_partner_ids' store=True string='Customers (Partners)' args: 'res.partner', 'im_livechat_channel_member_history_discuss_channel_customer_rel'
  • livechat_end_dt Datetime
    help='Session is closed when either the visitor or the last agent leaves the conversation.' args: 'Session end date'
  • livechat_expertise_ids Many2many → im_livechat.expertise
    store=True args: 'im_livechat.expertise', 'discuss_channel_im_livechat_expertise_rel', 'discuss_channel_id', 'im_livechat_expertise_id'
  • livechat_failure Selection
    selection=[('no_answer', 'Never Answered'), ('no_agent', 'No one Available'), ('no_failure', 'No Failure')] string='Live Chat Session Failure'
  • livechat_is_escalated Boolean
    compute='_compute_livechat_is_escalated' store=True args: 'Is session escalated'
  • livechat_lang_id Many2one → res.lang
    help='Lang of the visitor of the channel.' string='Language' args: 'res.lang'
  • livechat_matches_self_expertise Boolean
    compute='_compute_livechat_matches_self_expertise' search='_search_livechat_matches_self_expertise'
  • livechat_matches_self_lang Boolean
    compute='_compute_livechat_matches_self_lang' search='_search_livechat_matches_self_lang'
  • livechat_note Html
    groups='base.group_user' help='Note about the session, visible to all internal users having access to the session.' sanitize_style=True args: 'Live Chat Note'
  • livechat_operator_id Many2one → res.partner
    index='btree_not_null' string='Operator' args: 'res.partner'
  • livechat_outcome Selection
    compute='_compute_livechat_outcome' store=True args: [('no_answer', 'Never Answered'), ('no_agent', 'No one Available'), ('no_failure', 'Success'), ('escalated', 'Escalated')]
  • livechat_start_hour Float
    compute='_compute_livechat_start_hour' store=True args: 'Session Start Hour'
  • livechat_status Selection
    compute='_compute_livechat_status' groups='base.group_user' readonly=False selection=[('in_progress', 'In progress'), ('waiting', 'Waiting for customer'), ('need_help', 'Looking for help')] store=True
  • livechat_week_day Selection
    compute='_compute_livechat_week_day' store=True string='Day of the Week' args: [('0', 'Monday'), ('1', 'Tuesday'), ('2', 'Wednesday'), ('3', 'Thursday'), ('4', 'Friday'), ('5', 'Saturday'), ('6', 'Sunday')]
  • rating_last_text Selection
    store=True
Public methods (3)
  • execute_command_history(self, **kwargs)
  • livechat_join_channel_needing_help(self)
    Join a live chat for which help was requested. :returns: Whether the live chat was joined. False if the live chat could not be joined because another agent already joined the channel in the meantime. :rtype: bool
  • write(self, vals)

New fields (4)
  • agent_expertise_ids Many2many → im_livechat.expertise
    compute='_compute_agent_expertise_ids' compute_sudo=True inverse='_inverse_agent_expertise_ids' args: 'im_livechat.expertise'
  • chatbot_script_id Many2one → chatbot.script
    compute='_compute_chatbot_script_id' compute_sudo=True inverse='_inverse_chatbot_script_id' args: 'chatbot.script'
  • livechat_member_history_ids One2many → im_livechat.channel.member.history
    args: 'im_livechat.channel.member.history', 'member_id'
  • livechat_member_type Selection
    compute='_compute_livechat_member_type' compute_sudo=True inverse='_inverse_livechat_member_type' args: [('agent', 'Agent'), ('visitor', 'Visitor'), ('bot', 'Chatbot')]
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (22)
  • are_you_inside Boolean
    compute='_are_you_inside' readonly=True store=False string='Are you inside the matrix?'
  • available_operator_ids Many2many → res.users
    compute='_compute_available_operator_ids' args: 'res.users'
  • block_assignment_during_call Boolean
    help='While on a call, agents will not receive new conversations.' args: 'No Chats During Call'
  • button_background_color Char
    default='#875A7B' help='Default background color of the Livechat button'
  • button_text Char
    default=_default_button_text translate=True args: 'Text of the Button'
  • button_text_color Char
    default='#FFFFFF' help='Default text color of the Livechat button'
  • channel_ids One2many → discuss.channel
    args: 'discuss.channel', 'livechat_channel_id', 'Sessions'
  • chatbot_script_count Integer
    compute='_compute_chatbot_script_count' string='Number of Chatbot'
  • default_message Char
    default=_default_default_message help="This is an automated 'welcome' message that your visitor will see when they initiate a new conversation." translate=True args: 'Welcome Message'
  • header_background_color Char
    default='#875A7B' help='Default background color of the channel header once open'
  • max_sessions Integer
    default=10 help='Maximum number of concurrent sessions per operator.' string='Maximum Sessions'
  • max_sessions_mode Selection
    default='unlimited' help='If limited, operators will only handle the selected number of sessions at a time.' string='Sessions per Operator' args: [('unlimited', 'Unlimited'), ('limited', 'Limited')]
  • name Char
    required=True args: 'Channel Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • ongoing_session_count Integer
    compute='_compute_ongoing_sessions_count' args: 'Number of Ongoing Sessions'
  • remaining_session_capacity Integer
    compute='_compute_remaining_session_capacity' args: 'Remaining Session Capacity'
  • review_link Char
    help='Visitors who leave a positive review will be redirected to this optional link.' args: 'Review Link'
  • rule_ids One2many → im_livechat.channel.rule
    args: 'im_livechat.channel.rule', 'channel_id', 'Rules'
  • script_external Html
    compute='_compute_script_external' readonly=True sanitize=False store=False args: 'Script (external)'
  • title_color Char
    default='#FFFFFF' help='Default title color of the channel once open'
  • user_ids Many2many → res.users
    default=_default_user_ids string='Agents' args: 'res.users', 'im_livechat_channel_im_user', 'channel_id', 'user_id'
  • web_page Char
    compute='_compute_web_page_link' help='URL to a static page where you client can discuss with the operator of the channel.' readonly=True store=False args: 'Web Page'
Public methods (6)
  • action_join(self)
  • action_quit(self)
  • action_view_chatbot_scripts(self)
  • action_view_rating(self)
    Action to display the rating relative to the channel, so all rating of the sessions of the current channel :returns : the ir.action 'action_view_rating' with the correct context
  • get_livechat_info(self, username=None)
  • web_read(self, specification: <expr>) -> <expr>

New fields (26)
  • agent_expertise_ids Many2many → im_livechat.expertise
    compute='_compute_member_fields' store=True args: 'im_livechat.expertise'
  • avatar_128 Binary
    compute='_compute_avatar_128'
  • call_count Float
    aggregator='sum' related='has_call' args: '# of Sessions with Calls'
  • call_duration_hour Float
    aggregator='sum' compute='_compute_call_duration_hour' store=True args: 'Call Duration'
  • call_history_ids Many2many → discuss.call.history
    args: 'discuss.call.history'
  • call_percentage Float
    aggregator='avg' related='has_call' args: 'Session with Calls (%)'
  • channel_id Many2one → discuss.channel
    compute='_compute_member_fields' index=True ondelete='cascade' store=True args: 'discuss.channel'
  • chatbot_script_id Many2one → chatbot.script
    compute='_compute_member_fields' index='btree_not_null' store=True args: 'chatbot.script'
  • conversation_tag_ids Many2many → im_livechat.conversation.tag
    related='channel_id.livechat_conversation_tag_ids' args: 'im_livechat.conversation.tag', 'im_livechat_channel_member_history_conversation_tag_rel'
  • guest_id Many2one → mail.guest
    compute='_compute_member_fields' index='btree_not_null' store=True args: 'mail.guest'
  • has_call Float
    compute='_compute_has_call' store=True
  • help_status Selection
    compute='_compute_help_status' selection=[('requested', 'Help Requested'), ('provided', 'Help Provided')] store=True
  • livechat_member_type Selection
    compute='_compute_member_fields' store=True args: [('agent', 'Agent'), ('visitor', 'Visitor'), ('bot', 'Chatbot')]
  • member_id Many2one → discuss.channel.member
    index='btree_not_null' args: 'discuss.channel.member'
  • message_count Integer
    aggregator='avg' args: '# of Messages per Session'
  • partner_id Many2one → res.partner
    compute='_compute_member_fields' index='btree_not_null' store=True args: 'res.partner'
  • rating Float
    related='rating_id.rating'
  • rating_id Many2one → rating.rating
    compute='_compute_rating_id' store=True args: 'rating.rating'
  • rating_text Selection
    related='rating_id.rating_text' string='Rating text'
  • response_time_hour Float
    aggregator='avg' args: 'Response Time'
  • session_country_id Many2one → res.country
    related='channel_id.country_id' args: 'res.country'
  • session_duration_hour Float
    aggregator='avg' compute='_compute_session_duration_hour' help='Time spent by the persona in the session in hours' store=True args: 'Session Duration'
  • session_livechat_channel_id Many2one → im_livechat.channel
    related='channel_id.livechat_channel_id' args: 'im_livechat.channel', 'Live chat channel'
  • session_outcome Selection
    related='channel_id.livechat_outcome'
  • session_start_hour Float
    related='channel_id.livechat_start_hour'
  • session_week_day Selection
    related='channel_id.livechat_week_day'
Public methods (1)
  • action_open_discuss_channel_view(self, domain=())
    @api.model

New fields (8)
  • action Selection
    default='display_button' help="* 'Show' displays the chat button on the pages.\n* 'Show with notification' is 'Show' in addition to a floating text just next to the button.\n* 'Open automatically' displays the button and automatically opens the conversation pane.\n* 'Hide' hides the chat button on the pages.\n" required=True string='Live Chat Button' args: [('display_button', 'Show'), ('display_button_and_text', 'Show with notification'), ('auto_popup', 'Open automatically'), ('hide_button', 'Hide')]
  • auto_popup_timer Integer
    default=0 help="Delay (in seconds) to automatically open the conversation window. Note: the selected action must be 'Open automatically' otherwise this parameter will not be taken into account." args: 'Time to Open'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' index='btree_not_null' args: 'im_livechat.channel', 'Channel'
  • chatbot_enabled_condition Selection
    default='always' required=True selection=[('always', 'Always'), ('only_if_no_operator', 'Only when no operator is available'), ('only_if_operator', 'Only when an operator is available')] string='Enable ChatBot'
  • chatbot_script_id Many2one → chatbot.script
    string='Chatbot' args: 'chatbot.script'
  • country_ids Many2many → res.country
    help="The rule will only be applied for these countries. Example: if you select 'Belgium' and 'United States' and that you set the action to 'Hide', the chat button will be hidden on the specified URL from the visitors located in these 2 countries. This feature requires GeoIP installed on your server." args: 'res.country', 'im_livechat_channel_country_rel', 'channel_id', 'country_id', 'Countries'
  • regex_url Char
    help='Regular expression specifying the web pages this rule will be applied on.' args: 'URL Regex'
  • sequence Integer
    default=10 help='Given the order to find a matching rule. If 2 rules are matching for the given url/country, the one with the lowest sequence will be chosen.' args: 'Matching order'
Public methods (1)
  • match_rule(self, channel_id, url, country_id=False)
    determine if a rule of the given channel matches with the given url :param channel_id : the identifier of the channel_id :param url : the url to match with a rule :param country_id : the identifier of the country :returns the rule that matches the given condition. False otherwise. :rtype : im_livechat.channel.rule

New fields (3)
  • color Integer
    default=_get_default_color args: 'Color'
  • conversation_ids Many2many → discuss.channel
    string='Discuss Channels' args: 'discuss.channel', 'livechat_conversation_tag_rel'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True translate=True args: 'Name'
  • user_ids Many2many → res.users
    compute='_compute_user_ids' inverse='_inverse_user_ids' store=False string='Operators' args: 'res.users'
Public methods (0)

No public methods.

New fields (33)
  • agent_providing_help_history Many2one → im_livechat.channel.member.history
    readonly=True related='channel_id.livechat_agent_providing_help_history' args: 'im_livechat.channel.member.history'
  • agent_requesting_help_history Many2one → im_livechat.channel.member.history
    readonly=True related='channel_id.livechat_agent_requesting_help_history' args: 'im_livechat.channel.member.history'
  • call_duration_hour Float
    aggregator='avg' digits=(16, 2) readonly=True args: 'Call Duration'
  • channel_id Many2one → discuss.channel
    readonly=True args: 'discuss.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • chatbot_answers_path Char
    readonly=True args: 'Chatbot Answers'
  • chatbot_answers_path_str Char
    readonly=True args: 'Chatbot Answers (String)'
  • chatbot_script_id Many2one → chatbot.script
    readonly=True args: 'chatbot.script', 'Chatbot'
  • conversation_tag_ids Many2many → im_livechat.conversation.tag
    readonly=True related='channel_id.livechat_conversation_tag_ids' string='Tags used in this conversation' args: 'im_livechat.conversation.tag'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country of the visitor'
  • day_number Selection
    readonly=True selection=[('0', 'Sunday'), ('1', 'Monday'), ('2', 'Tuesday'), ('3', 'Wednesday'), ('4', 'Thursday'), ('5', 'Friday'), ('6', 'Saturday')] string='Day of the Week'
  • duration Float
    aggregator='avg' digits=(16, 2) help='Duration of the conversation (in minutes)' readonly=True args: 'Duration (min)'
  • handled_by_agent Integer
    aggregator='sum' readonly=True args: 'Handled by Agent'
  • handled_by_bot Integer
    aggregator='sum' readonly=True args: 'Handled by Bot'
  • has_call Float
    readonly=True args: 'Whether the session had a call'
  • lang_id Many2one → res.lang
    readonly=True related='channel_id.livechat_lang_id' string='Language' args: 'res.lang'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    aggregator='avg' help='Number of message in the conversation' readonly=True args: 'Messages per Session'
  • number_of_calls Float
    aggregator='sum' readonly=True related='has_call' args: '# of Sessions with calls'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Agent'
  • percentage_of_calls Float
    aggregator='avg' readonly=True related='has_call' args: 'Session with Calls (%)'
  • rating Integer
    aggregator='avg' readonly=True args: 'Rating'
  • rating_text Char
    readonly=True args: 'Satisfaction Rate'
  • session_expertise_ids Many2many → im_livechat.expertise
    readonly=True related='channel_id.livechat_expertise_ids' string='Expertises used in this session' args: 'im_livechat.expertise'
  • session_expertises Char
    readonly=True args: 'Expertises used in this session (String)'
  • session_outcome Selection
    readonly=True selection=[('no_answer', 'Never Answered'), ('no_agent', 'No one Available'), ('no_failure', 'Success'), ('escalated', 'Escalated')] string='Session Outcome'
  • start_date Datetime
    readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • start_date_minutes Char
    readonly=True args: 'Start Date of session, truncated to minutes'
  • start_hour Char
    readonly=True args: 'Start Hour of session'
  • time_to_answer Float
    aggregator='avg' digits=(16, 6) help='Average time in hours to give the first answer to the visitor' readonly=True args: 'Response Time'
  • uuid Char
    readonly=True args: 'UUID'
  • visitor_partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
Public methods (2)
  • action_open_discuss_channel_view(self, domain=())
    @api.model
  • formatted_read_group(self, domain, groupby=(), aggregates=(), having=(), offset=0, limit=None, order=None)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_open_rated_object(self)

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (3)
  • chatbot_script_ids One2many → chatbot.script
    args: 'chatbot.script', 'operator_partner_id'
  • livechat_channel_count Integer
    compute='_compute_livechat_channel_count'
  • user_livechat_username Char
    compute='_compute_user_livechat_username'
Public methods (1)
  • action_view_livechat_sessions(self)

New fields (7)
  • has_access_livechat Boolean
    compute='_compute_has_access_livechat' readonly=True store=False string='Has access to Livechat'
  • livechat_channel_ids Many2many → im_livechat.channel
    copy=False args: 'im_livechat.channel', 'im_livechat_channel_im_user', 'user_id', 'channel_id'
  • livechat_expertise_ids Many2many → im_livechat.expertise
    compute='_compute_livechat_expertise_ids' groups='im_livechat.im_livechat_group_user,base.group_erp_manager' help='When forwarding live chat conversations, the chatbot will prioritize users with matching expertise.' inverse='_inverse_livechat_expertise_ids' store=False string='Live Chat Expertise' args: 'im_livechat.expertise'
  • livechat_is_in_call Boolean
    compute='_compute_livechat_is_in_call' groups='im_livechat.im_livechat_group_user' help='Whether the user is in a call, only available if the user is in a live chat agent'
  • livechat_lang_ids Many2many → res.lang
    compute='_compute_livechat_lang_ids' groups='im_livechat.im_livechat_group_user,base.group_erp_manager' inverse='_inverse_livechat_lang_ids' store=False string='Livechat Languages' args: 'res.lang'
  • livechat_ongoing_session_count Integer
    compute='_compute_livechat_ongoing_session_count' groups='im_livechat.im_livechat_group_user' args: 'Number of Ongoing sessions'
  • livechat_username Char
    compute='_compute_livechat_username' groups='im_livechat.im_livechat_group_user,base.group_erp_manager' inverse='_inverse_livechat_username' store=False string='Livechat Username'
Public methods (3)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property
  • write(self, vals)

New fields (3)
  • livechat_expertise_ids Many2many → im_livechat.expertise
    help='When forwarding live chat conversations, the chatbot will prioritize users with matching expertise.' string='Live Chat Expertise' args: 'im_livechat.expertise'
  • livechat_lang_ids Many2many → res.lang
    comodel_name='res.lang' help='These languages, in addition to your main language, will be used to assign you to Live Chat sessions.' string='Livechat languages'
  • livechat_username Char
    help='This username will be used as your name in the livechat channels.' args: 'Livechat Username'
Public methods (0)

No public methods.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…