Live Chat

im_livechat
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite/Live Chat
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Olivier Dony, Thibault Delavallée, Xavier Morel, Lucas Perais (lpe), Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Romeo Fragomeli, Sébastien Theys, Julien Mougenot, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, ThanhDodeurOdoo, Pierre Paridans, William Braeckman, Romain Estievenart, Miquel Raïch, yhu-odoo, Didier (did), Julien Banken, Louis Wicket (wil), tsm-odoo, Maximilien (malb), Victor Piryns (pivi), Dylan Kiss (dyki), Rahul Prajapati, omra-odoo, Zelong Lin, maad-odoo, bary, Maryam Kia, Alex Kühn, Chrysanthe (chgo), Junqi Wu, mano-odoo, Pierre Pulinckx (PIPU), aych-odoo, Pierre Pulinckx, Bastien PIERRE, Krzysztof Magusiak (krma), Mahdi Alijani (malj), nees-odoo, utma-odoo, Giorgio Tocco (gito), Ayush Chauhan (aych), jayp-odoo, akha, Laetitia (ldau), ramh, Kevin Gerard (kege), nmak-odoo, Akash Parmar, pmah-odoo, saurabh, ibo-odoo, akth-odoo, akus-odoo, chpa-odoo, shmn-odoo, mear-odoo, Haja Ram, niyp-odoo, Louis Wicket, ypat-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - rating
    - digest
    - portal
    - http_routing
    - auth_signup
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 xpath 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 xpath Inherits base.view_users_form
res_users_form_view_simple_modif res.users.preferences.form.im_livechat res.users xpath 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 div Inherits base.view_partner_form
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.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite/Live Chat
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Xavier ALT, Nicolas Lempereur, Aaron Bohy, Lucas Perais (lpe), Odoo Online, Pierre Masereel, Jorge Pinna Puissant, Alexandre Kühn, Adrien Dieudonné, Sébastien Theys, Julien Mougenot, Samuel Degueldre, Nasreddin Boulif (bon), Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, Didier (did), Julien Banken, Thomas Lefebvre (thle), Louis Wicket (wil), tsm-odoo, nda, Victor Piryns (pivi), Dylan Kiss (dyki), Antoine (ande), Rahul Prajapati, Mahdi Cheikh Rouhou (macr), omra-odoo, Zelong Lin, maad-odoo, bary, Maryam Kia, reka-odoo, Bruno Boi (boi), Bastien Fafchamps (bafa), Julien Carion (juca), adsh-odoo, Alex Kühn, Martin Trigaux (mat), sami odoo, Louis (wil), Junqi Wu, mano-odoo, Antoine (anso), Pierre Pulinckx (PIPU), aych-odoo, Pierre Pulinckx (pipu), laro-odoo, Bastien PIERRE, zel-odoo, Krzysztof Magusiak (krma), Giorgio Tocco (gito), jayp-odoo, ramh, gito-odoo, Kevin Gerard (kege), Akash Parmar, pmah-odoo, saurabh, akth-odoo, akus-odoo, Lucas Thomassin
WEBSITE
WEBSITEhttps://www.odoo.com/app/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:56
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - rating
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (35)
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_view_form discuss.channel.form discuss.channel form New
discuss_channel_view_kanban discuss.channel.kanban discuss.channel kanban 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 xpath Inherits digest.digest_digest_view_form
im_livechat.rating_rating_view_kanban im_livechat.rating.rating.view.kanban rating.rating xpath Inherits rating.rating_rating_view_kanban
im_livechat.rating_rating_view_tree im_livechat.rating.rating.view.list rating.rating xpath Inherits rating.rating_rating_view_tree
im_livechat.unit_embed_suite im_livechat.unit_embed_suite ir.ui.view qweb 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator 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
rating_rating_view_search_livechat rating.rating.search.livechat rating.rating xpath Inherits rating.rating_rating_view_search
res_users_form_view res.users.form.im_livechat res.users xpath Inherits base.view_users_form
res_users_form_view_simple_modif res.users.preferences.form.im_livechat res.users xpath Inherits base.view_users_form_simple_modif
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (17)

New fields (5)
  • discuss_channel_id Many2one → discuss.channel
    ondelete='cascade' required=True string='Discussion Channel' args: 'discuss.channel'
  • mail_message_id Many2one → mail.message
    ondelete='cascade' required=True string='Related Mail Message' args: 'mail.message'
  • script_step_id Many2one → chatbot.script.step
    ondelete='cascade' required=True string='Chatbot Step' args: 'chatbot.script.step'
  • user_raw_answer Html
    string="User's raw answer"
  • 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 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
    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 (7)
  • answer_ids One2many → chatbot.script.answer
    copy=True string='Answers' args: 'chatbot.script.answer', 'script_step_id'
  • chatbot_script_id Many2one → chatbot.script
    ondelete='cascade' required=True string='Chatbot' args: 'chatbot.script'
  • is_forward_operator_child Boolean
    compute='_compute_is_forward_operator_child'
  • message Text
    string='Message' translate=True
  • 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)]" 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 (9)
  • anonymous_name Char
    args: 'Anonymous Name'
  • 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
    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_active Boolean
    help='Livechat session is active until visitor leaves the conversation.' args: 'Is livechat ongoing?'
  • livechat_channel_id Many2one → im_livechat.channel
    index='btree_not_null' args: 'im_livechat.channel', 'Channel'
  • livechat_operator_id Many2one → res.partner
    index='btree_not_null' string='Operator' args: 'res.partner'
Public methods (1)
  • execute_command_history(self, **kwargs)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (18)
  • 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'
  • button_background_color Char
    default='#875A7B' help='Default background color of the Livechat button'
  • button_text Char
    default=_default_button_text help='Default text displayed on the Livechat Support Button' 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'
  • image_128 Image
    max_height=128 max_width=128 args: 'Image'
  • input_placeholder Char
    help='Text that prompts the user to initiate the chat.' translate=True args: 'Chat Input Placeholder'
  • name Char
    required=True args: 'Channel Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • 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='Operators' 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 (5)
  • 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)

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: 'Open automatically timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • chatbot_only_if_no_operator Boolean
    help='Enable the bot only if there is no operator available' string='Enabled only if no operator'
  • 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', 'Country'
  • 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 (22)
  • channel_id Many2one → discuss.channel
    readonly=True args: 'discuss.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country of the visitor'
  • day_number Char
    help='1 is Monday, 7 is Sunday' readonly=True args: 'Day Number'
  • days_of_activity Integer
    aggregator='max' help='Number of days since the first session of the operator' readonly=True args: 'Days of activity'
  • duration Float
    aggregator='avg' digits=(16, 2) help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • is_anonymous Integer
    readonly=True args: 'Is visitor anonymous'
  • is_happy Integer
    readonly=True args: 'Visitor is Happy'
  • is_unrated Integer
    readonly=True args: 'Session not rated'
  • is_without_answer Integer
    aggregator='sum' help='A session is without answer if the operator did not answer. \n If the visitor is also the operator, the session will always be answered.' readonly=True args: 'Session(s) without answer'
  • 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: 'Average message'
  • nbr_speaker Integer
    aggregator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • rating Integer
    aggregator='avg' readonly=True args: 'Rating'
  • rating_text Char
    readonly=True args: 'Satisfaction Rate'
  • start_date Datetime
    readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • start_hour Char
    readonly=True args: 'Start Hour of session'
  • technical_name Char
    readonly=True args: 'Code'
  • time_to_answer Float
    aggregator='avg' digits=(16, 2) help='Average time in seconds to give the first answer to the visitor' readonly=True args: 'Time to answer (sec)'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self)

New fields (8)
  • channel_id Many2one → discuss.channel
    readonly=True args: 'discuss.channel', 'Conversation'
  • duration Float
    aggregator='avg' digits=(16, 2) help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    aggregator='sum' readonly=True args: '# of Sessions'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • rating Float
    aggregator='avg' help='Average rating given by the visitor' readonly=True args: 'Average rating'
  • start_date Datetime
    readonly=True args: 'Start Date of session'
  • time_to_answer Float
    aggregator='avg' digits=(16, 2) help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • parent_author_name Char
    compute='_compute_parent_author_name'
  • parent_body Html
    compute='_compute_parent_body'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_open_rated_object(self)

New fields (1)
  • user_livechat_username Char
    compute='_compute_user_livechat_username'
Public methods (0)

No public methods.

New fields (3)
  • has_access_livechat Boolean
    compute='_compute_has_access_livechat' readonly=True store=False string='Has access to Livechat'
  • livechat_lang_ids Many2many → res.lang
    compute='_compute_livechat_lang_ids' inverse='_inverse_livechat_lang_ids' store=False string='Livechat Languages' args: 'res.lang'
  • livechat_username Char
    compute='_compute_livechat_username' inverse='_inverse_livechat_username' store=False string='Livechat Username'
Public methods (2)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property

New fields (2)
  • 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.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite/Live Chat
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Xavier ALT, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, GitHub, Yannick Tivisse, Odoo Online, Pierre Masereel, Romain Derie, Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Adrien Dieudonné, Sébastien Theys, Joseph Caburnay, Florent de Labarre, Julien Mougenot, Samuel Degueldre, std-odoo, Nasreddin Boulif (bon), Tiffany Chang (tic), Rémy Voet (ryv), Thanh Dodeur, Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, Benoit Socias, Didier (did), Antoine Guenet, Antoine Vandevenne (anv), Renaud Thiry, niyasraphy, Thomas Lefebvre (thle), Pedram (PEBR), Louis Wicket (wil), tsm-odoo, nda, Victor Piryns (pivi), Fernanda Hernández, Dylan Kiss (dyki), FrancoisGe, Michael (mcm), Rahul Prajapati, prye-odoo, Brieuc-brd, maad-odoo, Maryam Kia, Julien Carion (juca), adsh-odoo, Alex Kühn, Martin Trigaux (mat), shsa-odoo, Louis (wil), Victorien (viso), kais-odoo, Morgane (morm), aych-odoo, Pierre Pulinckx (pipu), Bastien PIERRE, zel-odoo, Pulinckx Pierre (PIPU), suresh badikala, Jessy Sobreiro
WEBSITE
WEBSITEhttps://www.odoo.com/app/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - rating
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (34)
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.tree chatbot.script.answer tree 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.tree chatbot.script.step tree 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.tree chatbot.script tree New
chatbot_test_script_page chatbot_test_script_page ir.ui.view qweb New
discuss_channel_view_form discuss.channel.form discuss.channel form New
discuss_channel_view_search discuss.channel.search discuss.channel search New
discuss_channel_view_tree discuss.channel.tree discuss.channel tree 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 xpath Inherits digest.digest_digest_view_form
im_livechat.qunit_embed_suite im_livechat.qunit_embed_suite ir.ui.view qweb New
im_livechat.rating_rating_view_kanban im_livechat.rating.rating.view.kanban rating.rating xpath Inherits rating.rating_rating_view_kanban
im_livechat.rating_rating_view_tree im_livechat.rating.rating.view.tree rating.rating xpath Inherits rating.rating_rating_view_tree
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.tree im_livechat.channel.rule tree 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator 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
rating_rating_view_search_livechat rating.rating.search.livechat rating.rating xpath Inherits rating.rating_rating_view_search
res_users_form_view res.users.form.im_livechat res.users xpath Inherits base.view_users_form
res_users_form_view_simple_modif res.users.preferences.form.im_livechat res.users xpath Inherits base.view_users_form_simple_modif
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (17)

New fields (5)
  • discuss_channel_id Many2one → discuss.channel
    ondelete='cascade' required=True string='Discussion Channel' args: 'discuss.channel'
  • mail_message_id Many2one → mail.message
    ondelete='cascade' required=True string='Related Mail Message' args: 'mail.message'
  • script_step_id Many2one → chatbot.script.step
    ondelete='cascade' required=True string='Chatbot Step' args: 'chatbot.script.step'
  • user_raw_answer Html
    string="User's raw answer"
  • 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 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 (4)
  • action_view_livechat_channels(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
    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.
  • 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
    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 (7)
  • answer_ids One2many → chatbot.script.answer
    copy=True string='Answers' args: 'chatbot.script.answer', 'script_step_id'
  • chatbot_script_id Many2one → chatbot.script
    ondelete='cascade' required=True string='Chatbot' args: 'chatbot.script'
  • is_forward_operator_child Boolean
    compute='_compute_is_forward_operator_child'
  • message Text
    string='Message' translate=True
  • 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)]" 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 (9)
  • anonymous_name Char
    args: 'Anonymous Name'
  • 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
    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_active Boolean
    help='Livechat session is active until visitor leaves the conversation.' args: 'Is livechat ongoing?'
  • livechat_channel_id Many2one → im_livechat.channel
    index='btree_not_null' args: 'im_livechat.channel', 'Channel'
  • livechat_operator_id Many2one → res.partner
    index='btree_not_null' string='Operator' args: 'res.partner'
Public methods (1)
  • execute_command_history(self, **kwargs)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (18)
  • 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'
  • button_background_color Char
    default='#875A7B' help='Default background color of the Livechat button'
  • button_text Char
    default=_default_button_text help='Default text displayed on the Livechat Support Button' 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'
  • image_128 Image
    max_height=128 max_width=128 args: 'Image'
  • input_placeholder Char
    help='Text that prompts the user to initiate the chat.' translate=True args: 'Chat Input Placeholder'
  • name Char
    required=True args: 'Channel Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • 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='Operators' 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 (5)
  • 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)

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: 'Open automatically timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • chatbot_only_if_no_operator Boolean
    help='Enable the bot only if there is no operator available' string='Enabled only if no operator'
  • 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', 'Country'
  • 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 (22)
  • channel_id Many2one → discuss.channel
    readonly=True args: 'discuss.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country of the visitor'
  • day_number Char
    help='1 is Monday, 7 is Sunday' readonly=True args: 'Day Number'
  • days_of_activity Integer
    group_operator='max' help='Number of days since the first session of the operator' readonly=True args: 'Days of activity'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • is_anonymous Integer
    readonly=True args: 'Is visitor anonymous'
  • is_happy Integer
    readonly=True args: 'Visitor is Happy'
  • is_unrated Integer
    readonly=True args: 'Session not rated'
  • is_without_answer Integer
    group_operator='sum' help='A session is without answer if the operator did not answer. \n If the visitor is also the operator, the session will always be answered.' readonly=True args: 'Session(s) without answer'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    group_operator='avg' help='Number of message in the conversation' readonly=True args: 'Average message'
  • nbr_speaker Integer
    group_operator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • rating Integer
    group_operator='avg' readonly=True args: 'Rating'
  • rating_text Char
    readonly=True args: 'Satisfaction Rate'
  • start_date Datetime
    readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • start_hour Char
    readonly=True args: 'Start Hour of session'
  • technical_name Char
    readonly=True args: 'Code'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time in seconds to give the first answer to the visitor' readonly=True args: 'Time to answer (sec)'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self)

New fields (8)
  • channel_id Many2one → discuss.channel
    readonly=True args: 'discuss.channel', 'Conversation'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    group_operator='sum' readonly=True args: '# of Sessions'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • rating Float
    group_operator='avg' help='Average rating given by the visitor' readonly=True args: 'Average rating'
  • start_date Datetime
    readonly=True args: 'Start Date of session'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • parent_author_name Char
    compute='_compute_parent_author_name'
  • parent_body Html
    compute='_compute_parent_body'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_open_rated_object(self)

New fields (1)
  • user_livechat_username Char
    compute='_compute_user_livechat_username'
Public methods (1)
  • search_for_channel_invite(self, search_term, channel_id=None, limit=30)
    @api.model

New fields (3)
  • has_access_livechat Boolean
    compute='_compute_has_access_livechat' readonly=True store=False string='Has access to Livechat'
  • livechat_lang_ids Many2many → res.lang
    compute='_compute_livechat_lang_ids' inverse='_inverse_livechat_lang_ids' store=False string='Livechat Languages' args: 'res.lang'
  • livechat_username Char
    compute='_compute_livechat_username' inverse='_inverse_livechat_username' store=False string='Livechat Username'
Public methods (2)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property

New fields (3)
  • is_discuss_sidebar_category_livechat_open Boolean
    default=True args: 'Is category livechat open'
  • 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.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite/Live Chat
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Xavier ALT, Xavier Morel, Aaron Bohy, GitHub, qsm-odoo, Romain Derie, Adrien Dieudonne, Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Aurélien Warnon, Romeo Fragomeli, Victor Feyens, Sébastien Theys, Joseph Caburnay, Florent de Labarre, Julien Mougenot, Vincent Schippefilt, Samuel Degueldre, std-odoo, Nasreddin Boulif (bon), Thanh Dodeur, Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, Hiral Bhavsar, Didier (did), Antoine Guenet, Antoine Vandevenne (anv), luvi, Fabio Barbero, Ipsita Borisagar, niyasraphy, Louis Wicket (wil), tsm-odoo, Victor Piryns (pivi), miad-odoo, FrancoisGe, Michael (mcm), Rahul Prajapati, Brieuc-brd, Mahdi Cheikh Rouhou (macr), Zelong Lin, Giang Pham, Martin Trigaux (mat), Elisabeth Dickinson, Ryan Cen, Morgane (morm), Nemael, aych-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:49
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - rating
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (32)
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.tree chatbot.script.answer tree 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.tree chatbot.script.step tree 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.tree chatbot.script tree New
chatbot_test_script_page chatbot_test_script_page ir.ui.view qweb 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 xpath Inherits digest.digest_digest_view_form
im_livechat_canned_response_view_tree im_livechat.canned_response.tree mail.shortcode tree 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.tree im_livechat.channel.rule tree 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator 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
mail_channel_view_form mail.channel.form mail.channel form New
mail_channel_view_search mail.channel.search mail.channel search New
mail_channel_view_tree mail.channel.tree mail.channel tree New
rating_rating_view_search_livechat rating.rating.search.livechat rating.rating xpath Inherits rating.rating_rating_view_search
res_users_form_view res.users.form.im_livechat res.users xpath Inherits base.view_users_form
res_users_form_view_simple_modif res.users.preferences.form.im_livechat res.users xpath Inherits base.view_users_form_simple_modif
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (16)

New fields (5)
  • mail_channel_id Many2one → mail.channel
    ondelete='cascade' required=True string='Discussion Channel' args: 'mail.channel'
  • mail_message_id Many2one → mail.message
    ondelete='cascade' required=True string='Related Mail Message' args: 'mail.message'
  • script_step_id Many2one → chatbot.script.step
    ondelete='cascade' required=True string='Chatbot Step' args: 'chatbot.script.step'
  • user_raw_answer Html
    string="User's raw answer"
  • 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 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 (4)
  • action_view_livechat_channels(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
    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.
  • 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
    ondelete='cascade' required=True string='Script Step' args: 'chatbot.script.step'
  • sequence Integer
    default=1 string='Sequence'
Public methods (1)
  • name_get(self)

New fields (7)
  • answer_ids One2many → chatbot.script.answer
    copy=True string='Answers' args: 'chatbot.script.answer', 'script_step_id'
  • chatbot_script_id Many2one → chatbot.script
    ondelete='cascade' required=True string='Chatbot' args: 'chatbot.script'
  • is_forward_operator_child Boolean
    compute='_compute_is_forward_operator_child'
  • message Text
    string='Message' translate=True
  • 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)]" 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 (17)
  • are_you_inside Boolean
    compute='_are_you_inside' readonly=True store=False string='Are you inside the matrix?'
  • button_background_color Char
    default='#875A7B' help='Default background color of the Livechat button'
  • button_text Char
    default=_default_button_text help='Default text displayed on the Livechat Support Button' args: 'Text of the Button'
  • button_text_color Char
    default='#FFFFFF' help='Default text color of the Livechat button'
  • channel_ids One2many → mail.channel
    args: 'mail.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." args: 'Welcome Message'
  • header_background_color Char
    default='#875A7B' help='Default background color of the channel header once open'
  • image_128 Image
    default=_default_image max_height=128 max_width=128 args: 'Image'
  • input_placeholder Char
    help='Text that prompts the user to initiate the chat.' args: 'Chat Input Placeholder'
  • name Char
    required=True args: 'Channel Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • 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='Operators' 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 (5)
  • 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)

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: 'Open automatically timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • chatbot_only_if_no_operator Boolean
    help='Enable the bot only if there is no operator available' string='Enabled only if no operator'
  • 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', 'Country'
  • 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 (22)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country of the visitor'
  • day_number Char
    help='1 is Monday, 7 is Sunday' readonly=True args: 'Day Number'
  • days_of_activity Integer
    group_operator='max' help='Number of days since the first session of the operator' readonly=True args: 'Days of activity'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • is_anonymous Integer
    readonly=True args: 'Is visitor anonymous'
  • is_happy Integer
    readonly=True args: 'Visitor is Happy'
  • is_unrated Integer
    readonly=True args: 'Session not rated'
  • is_without_answer Integer
    group_operator='sum' help='A session is without answer if the operator did not answer. \n If the visitor is also the operator, the session will always be answered.' readonly=True args: 'Session(s) without answer'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    group_operator='avg' help='Number of message in the conversation' readonly=True args: 'Average message'
  • nbr_speaker Integer
    group_operator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • rating Integer
    group_operator='avg' readonly=True args: 'Rating'
  • rating_text Char
    readonly=True args: 'Satisfaction Rate'
  • start_date Datetime
    readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • start_hour Char
    readonly=True args: 'Start Hour of session'
  • technical_name Char
    readonly=True args: 'Code'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time in seconds to give the first answer to the visitor' readonly=True args: 'Time to answer (sec)'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self)

New fields (7)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    group_operator='sum' readonly=True args: '# of Sessions'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    readonly=True args: 'Start Date of session'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self)

New fields (8)
  • anonymous_name Char
    args: 'Anonymous Name'
  • 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
    string='Chatbot Messages' args: 'chatbot.message', 'mail_channel_id'
  • country_id Many2one → res.country
    help='Country of the visitor of the channel' string='Country' args: 'res.country'
  • livechat_active Boolean
    help='Livechat session is active until visitor leaves the conversation.' args: 'Is livechat ongoing?'
  • livechat_channel_id Many2one → im_livechat.channel
    index='btree_not_null' args: 'im_livechat.channel', 'Channel'
  • livechat_operator_id Many2one → res.partner
    string='Operator' args: 'res.partner'
Public methods (2)
  • channel_info(self)
    Extends the channel header by adding the livechat operator and the 'anonymous' profile :rtype : list(dict)
  • execute_command_history(self, **kwargs)

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 (1)
  • user_livechat_username Char
    compute='_compute_user_livechat_username'
Public methods (0)

No public methods.

New fields (1)
  • livechat_username Char
    help='This username will be used as your name in the livechat channels.' args: 'Livechat Username'
Public methods (2)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property

New fields (1)
  • is_discuss_sidebar_category_livechat_open Boolean
    default=True args: 'Is category livechat open'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite/Live Chat
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Xavier ALT, Xavier Morel, Mohammed Shekha, Nicolas Lempereur, Aaron Bohy, Lucas Perais (lpe), Barad Mahendra, qsm-odoo, Nicolas Seinlet, Romain Derie, Jorge Pinna Puissant, Alexandre Kühn, Xavier-Do, Romeo Fragomeli, Xavier Dubuc, Sébastien Theys, Julien Mougenot, Samuel Degueldre, std-odoo, Thanh Dodeur, Mathieu Duckerts-Antoine, Hiral Bhavsar, yograj tandel, root, Florian Damhaut, Didier (did), Michael Mattiello (mcm), dht-odoo, Julien Giannone, Ipsita Borisagar, Louis Wicket (wil), tsm-odoo, miad-odoo, Simon Genin (ges), Qiuyu (QHO), Leonardo Pavan Rocha, Lưu Quang Huy
WEBSITE
WEBSITEhttps://www.odoo.com/app/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - rating
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (25)
XML IDNameModelTypeStatus
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 xpath Inherits digest.digest_digest_view_form
im_livechat_canned_response_view_tree im_livechat.canned_response.tree mail.shortcode tree 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.tree im_livechat.channel.rule tree 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator 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
mail_channel_view_form mail.channel.form mail.channel form New
mail_channel_view_search mail.channel.search mail.channel search New
mail_channel_view_tree mail.channel.tree mail.channel tree New
rating_rating_view_form_livechat rating.rating.form.livechat rating.rating xpath Inherits rating.rating_rating_view_form
rating_rating_view_search_livechat rating.rating.search.livechat rating.rating xpath Inherits rating.rating_rating_view_search
res_users_form_view res.users.form.im_livechat res.users xpath Inherits base.view_users_form
res_users_form_view_simple_modif res.users.preferences.form.im_livechat res.users xpath Inherits base.view_users_form_simple_modif
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (12)

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
    help='Time to answer the user in second.' 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 (16)
  • are_you_inside Boolean
    compute='_are_you_inside' readonly=True store=False string='Are you inside the matrix?'
  • button_background_color Char
    default='#878787' help='Default background color of the Livechat button'
  • button_text Char
    default=_default_button_text help='Default text displayed on the Livechat Support Button' translate=True args: 'Text of the Button'
  • button_text_color Char
    default='#FFFFFF' help='Default text color of the Livechat button'
  • channel_ids One2many → mail.channel
    args: 'mail.channel', 'livechat_channel_id', 'Sessions'
  • 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'
  • image_128 Image
    default=_default_image max_height=128 max_width=128 args: 'Image'
  • input_placeholder Char
    help='Text that prompts the user to initiate the chat.' translate=True args: 'Chat Input Placeholder'
  • name Char
    help='The name of the channel' required=True args: 'Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • 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='Operators' 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 (4)
  • action_join(self)
  • action_quit(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)

New fields (6)
  • action Selection
    default='display_button' help="* 'Display the button' displays the chat button on the pages.\n* 'Auto popup' displays the button and automatically open the conversation pane.\n* 'Hide the button' hides the chat button on the pages." required=True string='Action' args: [('display_button', 'Display the button'), ('auto_popup', 'Auto popup'), ('hide_button', 'Hide the button')]
  • auto_popup_timer Integer
    default=0 help="Delay (in seconds) to automatically open the conversation window. Note: the selected action must be 'Auto popup' otherwise this parameter will not be taken into account." args: 'Auto popup timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • 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 Button', 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', 'Country'
  • 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 (22)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country of the visitor'
  • day_number Char
    help='Day number of the session (1 is Monday, 7 is Sunday)' readonly=True args: 'Day Number'
  • days_of_activity Integer
    group_operator='max' help='Number of days since the first session of the operator' readonly=True args: 'Days of activity'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • is_anonymous Integer
    readonly=True args: 'Is visitor anonymous'
  • is_happy Integer
    readonly=True args: 'Visitor is Happy'
  • is_unrated Integer
    readonly=True args: 'Session not rated'
  • is_without_answer Integer
    group_operator='sum' help='A session is without answer if the operator did not answer. \n If the visitor is also the operator, the session will always be answered.' readonly=True args: 'Session(s) without answer'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    group_operator='avg' help='Number of message in the conversation' readonly=True args: 'Average message'
  • nbr_speaker Integer
    group_operator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • rating Integer
    group_operator='avg' readonly=True args: 'Rating'
  • rating_text Char
    readonly=True args: 'Satisfaction Rate'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • start_hour Char
    help='Start hour of the conversation' readonly=True args: 'Start Hour of session'
  • technical_name Char
    readonly=True args: 'Code'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time in seconds to give the first answer to the visitor' readonly=True args: 'Time to answer (sec)'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self)

New fields (7)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    group_operator='sum' help='Number of conversation' readonly=True args: '# of Sessions'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self)

New fields (6)
  • anonymous_name Char
    args: 'Anonymous Name'
  • channel_type Selection
    selection_add=[('livechat', 'Livechat Conversation')]
  • country_id Many2one → res.country
    help='Country of the visitor of the channel' string='Country' args: 'res.country'
  • livechat_active Boolean
    help='Livechat session is active until visitor leave the conversation.' args: 'Is livechat ongoing?'
  • livechat_channel_id Many2one → im_livechat.channel
    args: 'im_livechat.channel', 'Channel'
  • livechat_operator_id Many2one → res.partner
    help='Operator for this specific channel' string='Operator' args: 'res.partner'
Public methods (2)
  • channel_info(self)
    Extends the channel header by adding the livechat operator and the 'anonymous' profile :rtype : list(dict)
  • execute_command_history(self, **kwargs)

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 (1)
  • user_livechat_username Char
    compute='_compute_user_livechat_username'
Public methods (0)

No public methods.

New fields (1)
  • livechat_username Char
    help='This username will be used as your name in the livechat channels.' args: 'Livechat Username'
Public methods (2)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property

New fields (1)
  • is_discuss_sidebar_category_livechat_open Boolean
    default=True args: 'Is category livechat open'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite/Live Chat
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, Aaron Bohy, Barad Mahendra, Yannick Tivisse, qsm-odoo, Alexandre Kühn, Adrian Torres, Xavier-Do, Xavier Dubuc, Sébastien Theys, Julien Mougenot, fw-bot, Debauche Stéphane, David Beguin, Thanh Dodeur, Mathieu Duckerts-Antoine, Hiral Bhavsar, root, Romain Estievenart, Kevin Baptiste, mcm-odoo, Didier (did), Julien Giannone, Ipsita Borisagar, bve-odoo, tsm-odoo, miad-odoo, Fernanda Hernández
WEBSITE
WEBSITEhttps://www.odoo.com/page/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - rating
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (27)
XML IDNameModelTypeStatus
assets_backend im_livechat assets backend ir.ui.view qweb Inherits web.assets_backend
external_lib Livechat : External Librairies of the Livechat, required to make it work ir.ui.view qweb 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 xpath Inherits digest.digest_digest_view_form
im_livechat_canned_response_view_tree im_livechat.canned_response.tree mail.shortcode tree 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.tree im_livechat.channel.rule tree 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator 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
mail_channel_view_form mail.channel.form mail.channel form New
mail_channel_view_search mail.channel.search mail.channel search New
mail_channel_view_tree mail.channel.tree mail.channel tree New
qunit_suite livechat_tests ir.ui.view qweb Inherits web.qunit_suite_tests
rating_rating_view_search_livechat rating.rating.search.livechat rating.rating xpath Inherits rating.rating_rating_view_search
res_users_form_view res.users.form.im_livechat res.users xpath Inherits base.view_users_form
res_users_form_view_simple_modif res.users.preferences.form.im_livechat res.users xpath Inherits base.view_users_form_simple_modif
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (11)

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
    help='Time to answer the user in second.' args: 'Time to answer(sec)'
  • kpi_livechat_response_value Float
    compute='_compute_kpi_livechat_response_value'
Public methods (0)

No public methods.

New fields (16)
  • are_you_inside Boolean
    compute='_are_you_inside' readonly=True store=False string='Are you inside the matrix?'
  • button_background_color Char
    default='#878787' help='Default background color of the Livechat button'
  • button_text Char
    default='Have a Question? Chat with us.' help='Default text displayed on the Livechat Support Button' translate=True args: 'Text of the Button'
  • button_text_color Char
    default='#FFFFFF' help='Default text color of the Livechat button'
  • channel_ids One2many → mail.channel
    args: 'mail.channel', 'livechat_channel_id', 'Sessions'
  • default_message Char
    default='How may I help you?' 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'
  • image_128 Image
    default=_default_image max_height=128 max_width=128 args: 'Image'
  • input_placeholder Char
    help='Text that prompts the user to initiate the chat.' translate=True args: 'Chat Input Placeholder'
  • name Char
    help='The name of the channel' required=True args: 'Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • rule_ids One2many → im_livechat.channel.rule
    args: 'im_livechat.channel.rule', 'channel_id', 'Rules'
  • script_external Text
    compute='_compute_script_external' readonly=True 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='Operators' 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 (4)
  • action_join(self)
  • action_quit(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 domain
  • get_livechat_info(self, username='Visitor')

New fields (6)
  • action Selection
    default='display_button' help="* 'Display the button' displays the chat button on the pages.\n* 'Auto popup' displays the button and automatically open the conversation pane.\n* 'Hide the button' hides the chat button on the pages." required=True string='Action' args: [('display_button', 'Display the button'), ('auto_popup', 'Auto popup'), ('hide_button', 'Hide the button')]
  • auto_popup_timer Integer
    default=0 help="Delay (in seconds) to automatically open the conversation window. Note: the selected action must be 'Auto popup' otherwise this parameter will not be taken into account." args: 'Auto popup timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • 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 Button', 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', 'Country'
  • 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 (22)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country of the visitor'
  • day_number Char
    help='Day number of the session (1 is Monday, 7 is Sunday)' readonly=True args: 'Day Number'
  • days_of_activity Integer
    group_operator='max' help='Number of days since the first session of the operator' readonly=True args: 'Days of activity'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • is_anonymous Integer
    readonly=True args: 'Is visitor anonymous'
  • is_happy Integer
    readonly=True args: 'Visitor is Happy'
  • is_unrated Integer
    readonly=True args: 'Session not rated'
  • is_without_answer Integer
    group_operator='sum' help='A session is without answer if the operator did not answer. \n If the visitor is also the operator, the session will always be answered.' readonly=True args: 'Session(s) without answer'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    group_operator='avg' help='Number of message in the conversation' readonly=True args: 'Average message'
  • nbr_speaker Integer
    group_operator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • rating Integer
    group_operator='avg' readonly=True args: 'Rating'
  • rating_text Char
    readonly=True args: 'Satisfaction Rate'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • start_hour Char
    help='Start hour of the conversation' readonly=True args: 'Start Hour of session'
  • technical_name Char
    readonly=True args: 'Code'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time in seconds to give the first answer to the visitor' readonly=True args: 'Time to answer (sec)'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self)

New fields (7)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    group_operator='sum' help='Number of conversation' readonly=True args: '# of Sessions'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self)

New fields (6)
  • anonymous_name Char
    args: 'Anonymous Name'
  • channel_type Selection
    selection_add=[('livechat', 'Livechat Conversation')]
  • country_id Many2one → res.country
    help='Country of the visitor of the channel' string='Country' args: 'res.country'
  • livechat_active Boolean
    help='Livechat session is active until visitor leave the conversation.' args: 'Is livechat ongoing?'
  • livechat_channel_id Many2one → im_livechat.channel
    args: 'im_livechat.channel', 'Channel'
  • livechat_operator_id Many2one → res.partner
    help='Operator for this specific channel' string='Operator' args: 'res.partner'
Public methods (2)
  • channel_fetch_slot(self)
    @api.model
  • channel_info(self, extra_info=False)
    Extends the channel header by adding the livechat operator and the 'anonymous' profile :rtype : list(dict)

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 (1)
  • user_livechat_username Char
    compute='_compute_user_livechat_username'
Public methods (0)

No public methods.

New fields (1)
  • 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.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite/Live Chat
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Aaron Bohy, Jeremy Kersten, GitHub, Barad Mahendra, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, jem-odoo, Jorge Pinna Puissant, Alexandre Kühn, Adrian Torres, Xavier-Do, mgh-odoo, Sébastien Theys, Nasreddin (bon), Debauche Stéphane, David Beguin, Lucas Lefèvre, Ivan Yelizariev, Naglis Jonaitis, ThanhDodeurOdoo, Mathieu Duckerts-Antoine, root, Kevin Baptiste, mcm-odoo, Didier (did)
WEBSITE
WEBSITEhttps://www.odoo.com/page/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (26)
XML IDNameModelTypeStatus
assets_backend im_livechat assets backend ir.ui.view qweb Inherits web.assets_backend
external_lib Livechat : External Librairies of the Livechat, required to make it work ir.ui.view qweb New
external_loader Livechat : external_script field of livechat channel ir.ui.view qweb New
im_livechat_canned_response_view_tree im_livechat.canned_response.tree mail.shortcode tree 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.tree im_livechat.channel.rule tree 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator 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
mail_channel_view_form mail.channel.form mail.channel form New
mail_channel_view_search mail.channel.search mail.channel search New
mail_channel_view_tree mail.channel.tree mail.channel tree New
qunit_suite livechat_tests ir.ui.view qweb Inherits web.qunit_suite
rating_rating_view_search_livechat rating.rating.search.livechat rating.rating xpath Inherits rating.rating_rating_view_search
res_users_form_view res.users.form.im_livechat res.users xpath Inherits base.view_users_form
res_users_form_view_simple_modif res.users.preferences.form.im_livechat res.users xpath Inherits base.view_users_form_simple_modif
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (10)

New fields (12)
  • are_you_inside Boolean
    compute='_are_you_inside' readonly=True store=False string='Are you inside the matrix?'
  • button_text Char
    default='Have a Question? Chat with us.' help='Default text displayed on the Livechat Support Button' args: 'Text of the Button'
  • channel_ids One2many → mail.channel
    args: 'mail.channel', 'livechat_channel_id', 'Sessions'
  • default_message Char
    default='How may I help you?' help="This is an automated 'welcome' message that your visitor will see when they initiate a new conversation." args: 'Welcome Message'
  • image_128 Image
    default=_default_image max_height=128 max_width=128 args: 'Image'
  • input_placeholder Char
    help='Text that prompts the user to initiate the chat.' args: 'Chat Input Placeholder'
  • name Char
    help='The name of the channel' required=True args: 'Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • rule_ids One2many → im_livechat.channel.rule
    args: 'im_livechat.channel.rule', 'channel_id', 'Rules'
  • script_external Text
    compute='_compute_script_external' readonly=True store=False args: 'Script (external)'
  • user_ids Many2many → res.users
    default=_default_user_ids string='Operators' 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 (4)
  • action_join(self)
  • action_quit(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 domain
  • get_livechat_info(self, username='Visitor')

New fields (6)
  • action Selection
    default='display_button' help="* 'Display the button' displays the chat button on the pages.\n* 'Auto popup' displays the button and automatically open the conversation pane.\n* 'Hide the button' hides the chat button on the pages." required=True string='Action' args: [('display_button', 'Display the button'), ('auto_popup', 'Auto popup'), ('hide_button', 'Hide the button')]
  • auto_popup_timer Integer
    default=0 help="Delay (in seconds) to automatically open the conversation window. Note: the selected action must be 'Auto popup' otherwise this parameter will not be taken into account." args: 'Auto popup timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • 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 Button', 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', 'Country'
  • 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 (22)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country of the visitor'
  • day_number Char
    help='Day number of the session (1 is Monday, 7 is Sunday)' readonly=True args: 'Day Number'
  • days_of_activity Integer
    group_operator='max' help='Number of days since the first session of the operator' readonly=True args: 'Days of activity'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • is_anonymous Integer
    readonly=True args: 'Is visitor anonymous'
  • is_happy Integer
    readonly=True args: 'Visitor is Happy'
  • is_unrated Integer
    readonly=True args: 'Session not rated'
  • is_without_answer Integer
    group_operator='sum' help='A session is without answer if the operator did not answer. \n If the visitor is also the operator, the session will always be answered.' readonly=True args: 'Session(s) without answer'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    group_operator='avg' help='Number of message in the conversation' readonly=True args: 'Average message'
  • nbr_speaker Integer
    group_operator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • rating Integer
    group_operator='avg' readonly=True args: 'Rating'
  • rating_text Char
    readonly=True args: 'Satisfaction Rate'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • start_hour Char
    help='Start hour of the conversation' readonly=True args: 'Start Hour of session'
  • technical_name Char
    readonly=True args: 'Code'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time in seconds to give the first answer to the visitor' readonly=True args: 'Time to answer (sec)'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self)

New fields (7)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    group_operator='sum' help='Number of conversation' readonly=True args: '# of Sessions'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (1)
  • power_on(self, *args, **kwargs)
    @api.model

New fields (5)
  • anonymous_name Char
    args: 'Anonymous Name'
  • channel_type Selection
    selection_add=[('livechat', 'Livechat Conversation')]
  • country_id Many2one → res.country
    help='Country of the visitor of the channel' string='Country' args: 'res.country'
  • livechat_channel_id Many2one → im_livechat.channel
    args: 'im_livechat.channel', 'Channel'
  • livechat_operator_id Many2one → res.partner
    help='Operator for this specific channel' string='Operator' args: 'res.partner'
Public methods (4)
  • channel_fetch_message(self, last_id=False, limit=20)
    Override to add the context of the livechat username.
  • channel_fetch_slot(self)
    @api.model
  • channel_info(self, extra_info=False)
    Extends the channel header by adding the livechat operator and the 'anonymous' profile :rtype : list(dict)
  • remove_empty_livechat_sessions(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • unpin_old_livechat_sessions(self)
    @api.model
    Unpin livechat sessions with no activity for at least one day to clean the operator's interface

New fields (0)

No new fields.

Public methods (1)
  • action_open_rated_object(self)

New fields (0)

No new fields.

Public methods (1)
  • name_get(self)

New fields (1)
  • 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.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, GitHub, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Adrien Dieudonne, RomainLibert, len-odoo, Alexandre Kühn, XavierDo, Xavier-Do, Sébastien Theys, Nasreddin (bon), Quentin Smetz (qsm), David Beguin
WEBSITE
WEBSITEhttps://www.odoo.com/page/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (22)
XML IDNameModelTypeStatus
assets_backend im_livechat assets backend ir.ui.view qweb Inherits web.assets_backend
external_lib Livechat : External Librairies of the Livechat, required to make it work ir.ui.view qweb New
external_loader Livechat : external_script field of livechat channel ir.ui.view qweb New
im_livechat_canned_response_view_tree im_livechat.canned_response.tree mail.shortcode tree 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.tree im_livechat.channel.rule tree 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator search New
loader Livechat : Javascript appending the livechat button ir.ui.view qweb New
mail_channel_view_form mail.channel.form mail.channel form New
mail_channel_view_search mail.channel.search mail.channel search New
mail_channel_view_tree mail.channel.tree mail.channel tree New
qunit_suite livechat_tests ir.ui.view qweb Inherits web.qunit_suite
rating_rating_view_search_livechat rating.rating.search.livechat rating.rating xpath Inherits rating.rating_rating_view_search
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (8)

New fields (15)
  • are_you_inside Boolean
    compute='_are_you_inside' readonly=True store=False string='Are you inside the matrix?'
  • button_text Char
    default='Have a Question? Chat with us.' help='Default text displayed on the Livechat Support Button' args: 'Text of the Button'
  • channel_ids One2many → mail.channel
    args: 'mail.channel', 'livechat_channel_id', 'Sessions'
  • default_message Char
    default='How may I help you?' help="This is an automated 'welcome' message that your visitor will see when they initiate a new conversation." args: 'Welcome Message'
  • image Binary
    attachment=True default=_default_image help='This field holds the image used as photo for the group, limited to 1024x1024px.' args: 'Image'
  • image_medium Binary
    attachment=True help='Medium-sized photo of the group. It is automatically resized as a 128x128px image, with aspect ratio preserved. Use this field in form views or some kanban views.' args: 'Medium'
  • image_small Binary
    attachment=True help='Small-sized photo of the group. It is automatically resized as a 64x64px image, with aspect ratio preserved. Use this field anywhere a small image is required.' args: 'Thumbnail'
  • input_placeholder Char
    help='Text that prompts the user to initiate the chat.' args: 'Chat Input Placeholder'
  • name Char
    help='The name of the channel' required=True args: 'Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • rating_percentage_satisfaction Integer
    compute='_compute_percentage_satisfaction' default=-1 help='Percentage of happy ratings over the past 7 days' store=False args: '% Happy'
  • rule_ids One2many → im_livechat.channel.rule
    args: 'im_livechat.channel.rule', 'channel_id', 'Rules'
  • script_external Text
    compute='_compute_script_external' readonly=True store=False args: 'Script (external)'
  • user_ids Many2many → res.users
    default=_default_user_ids string='Operators' 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 (9)
  • action_join(self)
    @api.multi
  • action_quit(self)
    @api.multi
  • action_view_rating(self)
    @api.multi
    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 domain
  • create(self, vals)
    @api.model
  • get_available_users(self)
    @api.multi
    get available user of a given channel :retuns : return the res.users having their im_status online
  • get_channel_infos(self, channel_id)
    @api.model
  • get_livechat_info(self, channel_id, username='Visitor')
    @api.model
  • get_mail_channel(self, livechat_channel_id, anonymous_name)
    @api.model
    Return a mail.channel given a livechat channel. It creates one with a connected operator, or return false otherwise :param livechat_channel_id : the identifier if the im_livechat.channel :param anonymous_name : the name of the anonymous person of the channel :type livechat_channel_id : int :type anonymous_name : str :return : channel header :rtype : dict
  • write(self, vals)
    @api.multi

New fields (6)
  • action Selection
    default='display_button' help="* 'Display the button' displays the chat button on the pages.\n* 'Auto popup' displays the button and automatically open the conversation pane.\n* 'Hide the button' hides the chat button on the pages." required=True string='Action' args: [('display_button', 'Display the button'), ('auto_popup', 'Auto popup'), ('hide_button', 'Hide the button')]
  • auto_popup_timer Integer
    default=0 help="Delay (in seconds) to automatically open the conversation window. Note: the selected action must be 'Auto popup' otherwise this parameter will not be taken into account." args: 'Auto popup timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • 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 Button', 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', 'Country'
  • 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 (11)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    group_operator='avg' help='Number of message in the conversation' readonly=True args: 'Average message'
  • nbr_speaker Integer
    group_operator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • technical_name Char
    readonly=True args: 'Code'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (7)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    group_operator='sum' help='Number of conversation' readonly=True args: '# of Sessions'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (0)

No new fields.

Public methods (1)
  • power_on(self, *args, **kwargs)
    @api.model

New fields (3)
  • anonymous_name Char
    args: 'Anonymous Name'
  • channel_type Selection
    selection_add=[('livechat', 'Livechat Conversation')]
  • livechat_channel_id Many2one → im_livechat.channel
    args: 'im_livechat.channel', 'Channel'
Public methods (4)
  • channel_fetch_slot(self)
    @api.model
  • channel_info(self, extra_info=False)
    @api.multi
    Extends the channel header by adding the livechat operator and the 'anonymous' profile :rtype : list(dict)
  • rating_get_parent(self)
  • remove_empty_livechat_sessions(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • unpin_old_livechat_sessions(self)
    @api.model
    Unpin livechat sessions with no activity for at least one day to clean the operator's interface

New fields (0)

No new fields.

Public methods (1)
  • action_open_rated_object(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Christophe Simonis, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Aaron Bohy, Jeremy Kersten, GitHub, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, fwi-odoo, Alexandre Kühn, Sébastien Theys
WEBSITE
WEBSITEhttps://www.odoo.com/page/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (21)
XML IDNameModelTypeStatus
assets_backend im_livechat assets backend ir.ui.view qweb Inherits web.assets_backend
external_lib Livechat : External Librairies of the Livechat, required to make it work ir.ui.view qweb New
external_loader Livechat : external_script field of livechat channel ir.ui.view qweb New
im_livechat_canned_response_view_tree im_livechat.canned_response.tree mail.shortcode tree New
im_livechat_channel_rule_view_form im_livechat.channel.rule.form im_livechat.channel.rule form New
im_livechat_channel_rule_view_tree im.livechat.channel.rule.tree im_livechat.channel.rule tree 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator search New
loader Livechat : Javascript appending the livechat button ir.ui.view qweb New
mail_channel_view_form mail.channel.form mail.channel form New
mail_channel_view_search mail.channel.search mail.channel search New
mail_channel_view_tree mail.channel.tree mail.channel tree New
qunit_suite im_livechat tests ir.ui.view qweb Inherits web.qunit_suite
rating_rating_view_search_livechat rating.rating.search.livechat rating.rating xpath Inherits rating.rating_rating_view_search
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (8)

New fields (15)
  • are_you_inside Boolean
    compute='_are_you_inside' readonly=True store=False string='Are you inside the matrix?'
  • button_text Char
    default='Have a Question? Chat with us.' help='Default text displayed on the Livechat Support Button' args: 'Text of the Button'
  • channel_ids One2many → mail.channel
    args: 'mail.channel', 'livechat_channel_id', 'Sessions'
  • default_message Char
    default='How may I help you?' help="This is an automated 'welcome' message that your visitor will see when they initiate a new conversation." args: 'Welcome Message'
  • image Binary
    attachment=True default=_default_image help='This field holds the image used as photo for the group, limited to 1024x1024px.' args: 'Image'
  • image_medium Binary
    attachment=True help='Medium-sized photo of the group. It is automatically resized as a 128x128px image, with aspect ratio preserved. Use this field in form views or some kanban views.' args: 'Medium'
  • image_small Binary
    attachment=True help='Small-sized photo of the group. It is automatically resized as a 64x64px image, with aspect ratio preserved. Use this field anywhere a small image is required.' args: 'Thumbnail'
  • input_placeholder Char
    args: 'Chat Input Placeholder'
  • name Char
    help='The name of the channel' required=True args: 'Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • rating_percentage_satisfaction Integer
    compute='_compute_percentage_satisfaction' default=-1 help='Percentage of happy ratings over the past 7 days' store=False args: '% Happy'
  • rule_ids One2many → im_livechat.channel.rule
    args: 'im_livechat.channel.rule', 'channel_id', 'Rules'
  • script_external Text
    compute='_compute_script_external' readonly=True store=False args: 'Script (external)'
  • user_ids Many2many → res.users
    default=_default_user_ids string='Operators' 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 (9)
  • action_join(self)
    @api.multi
  • action_quit(self)
    @api.multi
  • action_view_rating(self)
    @api.multi
    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 domain
  • create(self, vals)
    @api.model
  • get_available_users(self)
    @api.multi
    get available user of a given channel :retuns : return the res.users having their im_status online
  • get_channel_infos(self, channel_id)
    @api.model
  • get_livechat_info(self, channel_id, username='Visitor')
    @api.model
  • get_mail_channel(self, livechat_channel_id, anonymous_name)
    @api.model
    Return a mail.channel given a livechat channel. It creates one with a connected operator, or return false otherwise :param livechat_channel_id : the identifier if the im_livechat.channel :param anonymous_name : the name of the anonymous person of the channel :type livechat_channel_id : int :type anonymous_name : str :return : channel header :rtype : dict
  • write(self, vals)
    @api.multi

New fields (6)
  • action Selection
    default='display_button' help="* 'Display the button' displays the chat button on the pages.\n* 'Auto popup' displays the button and automatically open the conversation pane.\n* 'Hide the button' hides the chat button on the pages." required=True string='Action' args: [('display_button', 'Display the button'), ('auto_popup', 'Auto popup'), ('hide_button', 'Hide the button')]
  • auto_popup_timer Integer
    default=0 help="Delay (in seconds) to automatically open the conversation window. Note: the selected action must be 'Auto popup' otherwise this parameter will not be taken into account." args: 'Auto popup timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • 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 Button', 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', 'Country'
  • 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 (11)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    group_operator='avg' help='Number of message in the conversation' readonly=True args: 'Average message'
  • nbr_speaker Integer
    group_operator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • technical_name Char
    readonly=True args: 'Code'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (7)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    group_operator='sum' help='Number of conversation' readonly=True args: '# of Sessions'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (0)

No new fields.

Public methods (1)
  • power_on(self, *args, **kwargs)
    @api.model

New fields (4)
  • anonymous_name Char
    args: 'Anonymous Name'
  • channel_type Selection
    selection_add=[('livechat', 'Livechat Conversation')]
  • create_date Datetime
    required=True args: 'Create Date'
  • livechat_channel_id Many2one → im_livechat.channel
    args: 'im_livechat.channel', 'Channel'
Public methods (6)
  • channel_fetch_slot(self)
    @api.model
  • channel_info(self, extra_info=False)
    @api.multi
    Extends the channel header by adding the livechat operator and the 'anonymous' profile :rtype : list(dict)
  • get_empty_list_help(self, help)
    @api.model
  • rating_get_parent_id(self)
  • rating_get_parent_model_name(self, values)
  • remove_empty_livechat_sessions(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • unpin_old_livechat_sessions(self)
    @api.model
    Unpin livechat sessions with no activity for at least one day to clean the operator's interface

New fields (0)

No new fields.

Public methods (1)
  • action_open_rated_object(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Julien Legros, qdp-odoo, Géry Debongnie, Aaron Bohy, Yannick Tivisse, qsm-odoo, Denis Vermylen (dve)
WEBSITE
WEBSITEhttps://www.odoo.com/page/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Website 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 (19)
XML IDNameModelTypeStatus
assets_backend im_livechat assets backend ir.ui.view qweb Inherits web.assets_backend
external_lib Livechat : External Librairies of the Livechat, required to make it work ir.ui.view qweb New
external_loader Livechat : external_script field of livechat channel ir.ui.view qweb New
im_livechat_canned_response_view_tree im_livechat.canned_response.tree mail.shortcode tree New
im_livechat_channel_rule_view_form im_livechat.channel.rule.form im_livechat.channel.rule form New
im_livechat_channel_rule_view_tree im.livechat.channel.rule.tree im_livechat.channel.rule tree 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator search New
loader Livechat : Javascript appending the livechat button ir.ui.view qweb New
mail_channel_view_form mail.channel.form mail.channel form New
mail_channel_view_search mail.channel.search mail.channel search New
mail_channel_view_tree mail.channel.tree mail.channel tree New
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (8)

New fields (15)
  • are_you_inside Boolean
    compute='_are_you_inside' readonly=True store=False string='Are you inside the matrix?'
  • button_text Char
    default='Have a Question? Chat with us.' help='Default text displayed on the Livechat Support Button' args: 'Text of the Button'
  • channel_ids One2many → mail.channel
    args: 'mail.channel', 'livechat_channel_id', 'Sessions'
  • default_message Char
    default='How may I help you?' help="This is an automated 'welcome' message that your visitor will see when they initiate a new conversation." args: 'Welcome Message'
  • image Binary
    attachment=True default=_default_image help='This field holds the image used as photo for the group, limited to 1024x1024px.' args: 'Image'
  • image_medium Binary
    attachment=True help='Medium-sized photo of the group. It is automatically resized as a 128x128px image, with aspect ratio preserved. Use this field in form views or some kanban views.' args: 'Medium'
  • image_small Binary
    attachment=True help='Small-sized photo of the group. It is automatically resized as a 64x64px image, with aspect ratio preserved. Use this field anywhere a small image is required.' args: 'Thumbnail'
  • input_placeholder Char
    args: 'Chat Input Placeholder'
  • name Char
    help='The name of the channel' required=True args: 'Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • rating_percentage_satisfaction Integer
    compute='_compute_percentage_satisfaction' default=-1 help='Percentage of happy ratings over the past 7 days' store=False args: '% Happy'
  • rule_ids One2many → im_livechat.channel.rule
    args: 'im_livechat.channel.rule', 'channel_id', 'Rules'
  • script_external Text
    compute='_compute_script_external' readonly=True store=False args: 'Script (external)'
  • user_ids Many2many → res.users
    default=_default_user_ids string='Operators' 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 (9)
  • action_join(self)
    @api.multi
  • action_quit(self)
    @api.multi
  • action_view_rating(self)
    @api.multi
    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 domain
  • create(self, vals)
    @api.model
  • get_available_users(self)
    @api.multi
    get available user of a given channel :retuns : return the res.users having their im_status online
  • get_channel_infos(self, channel_id)
    @api.model
  • get_livechat_info(self, channel_id, username='Visitor')
    @api.model
  • get_mail_channel(self, livechat_channel_id, anonymous_name)
    @api.model
    Return a mail.channel given a livechat channel. It creates one with a connected operator, or return false otherwise :param livechat_channel_id : the identifier if the im_livechat.channel :param anonymous_name : the name of the anonymous person of the channel :type livechat_channel_id : int :type anonymous_name : str :return : channel header :rtype : dict
  • write(self, vals)
    @api.multi

New fields (6)
  • action Selection
    default='display_button' help="* 'Display the button' displays the chat button on the pages.\n* 'Auto popup' displays the button and automatically open the conversation pane.\n* 'Hide the button' hides the chat button on the pages." required=True string='Action' args: [('display_button', 'Display the button'), ('auto_popup', 'Auto popup'), ('hide_button', 'Hide the button')]
  • auto_popup_timer Integer
    default=0 help="Delay (in seconds) to automatically open the conversation window. Note: the selected action must be 'Auto popup' otherwise this parameter will not be taken into account." args: 'Auto popup timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • 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 Button', 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', 'Country'
  • 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 (11)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    group_operator='avg' help='Number of message in the conversation' readonly=True args: 'Average message'
  • nbr_speaker Integer
    group_operator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • technical_name Char
    readonly=True args: 'Code'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (7)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    group_operator='sum' help='Number of conversation' readonly=True args: '# of Sessions'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (0)

No new fields.

Public methods (1)
  • power_on(self, *args, **kwargs)
    @api.model

New fields (4)
  • anonymous_name Char
    args: 'Anonymous Name'
  • channel_type Selection
    selection_add=[('livechat', 'Livechat Conversation')]
  • create_date Datetime
    required=True args: 'Create Date'
  • livechat_channel_id Many2one → im_livechat.channel
    args: 'im_livechat.channel', 'Channel'
Public methods (4)
  • channel_fetch_slot(self)
    @api.model
  • channel_info(self, extra_info=False)
    @api.multi
    Extends the channel header by adding the livechat operator and the 'anonymous' profile :rtype : list(dict)
  • get_empty_list_help(self, help)
    @api.model
  • remove_empty_livechat_sessions(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • unpin_old_livechat_sessions(self)
    @api.model
    Unpin livechat sessions with no activity for at least one day to clean the operator's interface

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Christophe Simonis, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Richard Mathot, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Martin Geubelle
WEBSITE
WEBSITEhttps://www.odoo.com/page/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web_kanban
    - web
    - bus
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Website 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 (18)
XML IDNameModelTypeStatus
assets_backend im_livechat assets backend ir.ui.view qweb Inherits web.assets_backend
external_lib Livechat : External Librairies of the Livechat, required to make it work ir.ui.view qweb New
external_loader Livechat : external_script field of livechat channel ir.ui.view qweb New
im_livechat_channel_rule_view_form im_livechat.channel.rule.form im_livechat.channel.rule form New
im_livechat_channel_rule_view_tree im.livechat.channel.rule.tree im_livechat.channel.rule tree 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_report_channel_view_graph im_livechat.report.channel.graph im_livechat.report.channel graph 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
im_livechat_report_operator_view_graph im_livechat.report.operator.graph im_livechat.report.operator graph New
im_livechat_report_operator_view_pivot im_livechat.report.operator.pivot im_livechat.report.operator pivot New
im_livechat_report_operator_view_search im_livechat.report.operator.search im_livechat.report.operator search New
loader Livechat : Javascript appending the livechat button ir.ui.view qweb New
mail_channel_view_form mail.channel.form mail.channel form New
mail_channel_view_search mail.channel.search mail.channel search New
mail_channel_view_tree mail.channel.tree mail.channel tree New
support_page Livechat : Support Page ir.ui.view qweb New
Models touched (6)

New fields (15)
  • are_you_inside Boolean
    compute='_are_you_inside' readonly=True store=False string='Are you inside the matrix?'
  • button_text Char
    default='Have a Question? Chat with us.' help='Default text displayed on the Livechat Support Button' args: 'Text of the Button'
  • channel_ids One2many → mail.channel
    args: 'mail.channel', 'livechat_channel_id', 'Sessions'
  • default_message Char
    default='How may I help you?' help="This is an automated 'welcome' message that your visitor will see when they initiate a new conversation." args: 'Welcome Message'
  • image Binary
    attachment=True default=_default_image help='This field holds the image used as photo for the group, limited to 1024x1024px.' args: 'Image'
  • image_medium Binary
    attachment=True help='Medium-sized photo of the group. It is automatically resized as a 128x128px image, with aspect ratio preserved. Use this field in form views or some kanban views.' args: 'Medium'
  • image_small Binary
    attachment=True help='Small-sized photo of the group. It is automatically resized as a 64x64px image, with aspect ratio preserved. Use this field anywhere a small image is required.' args: 'Thumbnail'
  • input_placeholder Char
    args: 'Chat Input Placeholder'
  • name Char
    help='The name of the channel' required=True args: 'Name'
  • nbr_channel Integer
    compute='_compute_nbr_channel' readonly=True store=False args: 'Number of conversation'
  • rating_percentage_satisfaction Integer
    compute='_compute_percentage_satisfaction' default=-1 help='Percentage of happy ratings over the past 7 days' store=False args: '% Happy'
  • rule_ids One2many → im_livechat.channel.rule
    args: 'im_livechat.channel.rule', 'channel_id', 'Rules'
  • script_external Text
    compute='_compute_script_external' readonly=True store=False args: 'Script (external)'
  • user_ids Many2many → res.users
    default=_default_user_ids string='Operators' 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 (10)
  • action_join(self)
    @api.multi
  • action_quit(self)
    @api.multi
  • action_view_rating(self)
    @api.multi
    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 domain
  • create(self, vals)
    @api.model
  • get_available_users(self)
    @api.multi
    get available user of a given channel :retuns : return the res.users having their im_status online
  • get_channel_infos(self, channel_id)
    @api.model
  • get_livechat_info(self, channel_id, username='Visitor')
    @api.model
  • get_mail_channel(self, livechat_channel_id, anonymous_name)
    @api.model
    Return a mail.channel given a livechat channel. It creates one with a connected operator, or return false otherwise :param livechat_channel_id : the identifier if the im_livechat.channel :param anonymous_name : the name of the anonymous person of the channel :type livechat_channel_id : int :type anonymous_name : str :return : channel header :rtype : dict
  • match_rules(self, request, channel_id, username='Visitor')
    @api.model
  • write(self, vals)
    @api.multi

New fields (6)
  • action Selection
    default='display_button' help="* Select 'Display the button' to simply display the chat button on the pages.\n* Select 'Auto popup' for to display the button, and automatically open the conversation window.\n* Select 'Hide the button' to hide the chat button on the pages." required=True string='Action' args: [('display_button', 'Display the button'), ('auto_popup', 'Auto popup'), ('hide_button', 'Hide the button')]
  • auto_popup_timer Integer
    default=0 help="Delay (in seconds) to automatically open the converssation window. Note : the selected action must be 'Auto popup', otherwise this parameter will not be take into account." args: 'Auto popup timer'
  • channel_id Many2one → im_livechat.channel
    help='The channel of the rule' args: 'im_livechat.channel', 'Channel'
  • country_ids Many2many → res.country
    help="The actual rule will match only for this country. So if you set select 'Belgium' and 'France' and you set the action to 'Hide Buttun', this 2 country will not be see the support button for the specified URL. This feature requires GeoIP installed on your server." args: 'res.country', 'im_livechat_channel_country_rel', 'channel_id', 'country_id', 'Country'
  • regex_url Char
    help='Regular expression identifying the web page on which the rules will be applied.' 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 match 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 match the given condition. False otherwise. :rtype : im_livechat.channel.rule

New fields (11)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • channel_name Char
    readonly=True args: 'Channel Name'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_message Integer
    group_operator='avg' help='Number of message in the conversation' readonly=True args: 'Average message'
  • nbr_speaker Integer
    group_operator='avg' help='Number of different speakers' readonly=True args: '# of speakers'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Opertor'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • start_date_hour Char
    readonly=True args: 'Hour of start Date of session'
  • technical_name Char
    readonly=True args: 'Code'
  • uuid Char
    readonly=True args: 'UUID'
Public methods (1)
  • init(self, cr)

New fields (7)
  • channel_id Many2one → mail.channel
    readonly=True args: 'mail.channel', 'Conversation'
  • duration Float
    digits=(16, 2) group_operator='avg' help='Duration of the conversation (in seconds)' readonly=True args: 'Average duration'
  • livechat_channel_id Many2one → im_livechat.channel
    readonly=True args: 'im_livechat.channel', 'Channel'
  • nbr_channel Integer
    group_operator='sum' help='Number of conversation' readonly=True args: '# of channel'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Operator'
  • start_date Datetime
    help='Start date of the conversation' readonly=True args: 'Start Date of session'
  • time_to_answer Float
    digits=(16, 2) group_operator='avg' help='Average time to give the first answer to the visitor' readonly=True args: 'Time to answer'
Public methods (1)
  • init(self, cr)

New fields (4)
  • anonymous_name Char
    args: 'Anonymous Name'
  • channel_type Selection
    selection_add=[('livechat', 'Livechat Conversation')]
  • create_date Datetime
    required=True args: 'Create Date'
  • livechat_channel_id Many2one → im_livechat.channel
    args: 'im_livechat.channel', 'Channel'
Public methods (3)
  • channel_fetch_slot(self)
    @api.model
  • channel_info(self, extra_info=False)
    @api.multi
    Extends the channel header by adding the livechat operator and the 'anonymous' profile :rtype : list(dict)
  • cron_remove_empty_session(self)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/im_livechat
VERSION
VERSION 1.0
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSOdoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, niv-openerp, Christophe Simonis, Goffin Simon, Nicolas Lempereur, Jérome Maes, Richard Mathot, Géry Debongnie, jke-openerp, ged-odoo, Jeremy Kersten
WEBSITE
WEBSITEhttps://www.odoo.com/page/live-chat
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:39
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web_kanban
    - web
    - im_chat
    - bus
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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.

        

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
external_lib External Librairies of the Livechat, required to make it work ir.ui.view qweb New
external_loader All the scripts to launch the LiveSupport from an external Web Page ir.ui.view qweb New
im_message_form im.chat.message.tree im_chat.message tree New
im_message_search im.chat.message.search im_chat.message search New
internal_lib Librairies of the Livechat ir.ui.view qweb New
internal_loader All the scripts to launch the LiveSupport from an internal Web Page ir.ui.view qweb New
loader Javascript initializing the LiveSupport ir.ui.view qweb New
support_channel_form support_channel.form im_livechat.channel form New
support_channel_kanban support_channel.kanban im_livechat.channel kanban New
support_page Livechat Support Page ir.ui.view qweb New
Models touched (2)

New fields (0)

No new fields.

Public methods (2)
  • is_in_session(self, cr, uid, uuid, user_id, context=None)
    return if the given user_id is in the session
  • users_infos(self, cr, uid, ids, context=None)
    add the anonymous user in the user of the session

New fields (0)

No new fields.

Public methods (6)
  • get_available_users(self, cr, uid, channel_id, context=None)
    get available user of a given channel
  • get_channel_session(self, cr, uid, channel_id, anonymous_name, context=None)
    return a session given a channel : create on with a registered user, or return false otherwise
  • get_info_for_chat_src(self, cr, uid, channel, context=None)
  • join(self, cr, uid, ids, context=None)
  • quit(self, cr, uid, ids, context=None)
  • test_channel(self, cr, uid, channel, context=None)