TIP: You can type at any time to perform a new search.
Live Chat
im_livechat · odoo/odoo
- Repository
- odoo/odoo · module folder
- Module version
- 1.0
- Category
- Website/Live Chat
- Folder size
- 8.43 MB
- License
- LGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- https://www.odoo.com/app/live-chat
- Last tracking update
- 2026-08-15 22:44:17
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Olivier Dony, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Lucas Perais (lpe), Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Romeo Fragomeli, Sébastien Theys, Julien Mougenot, Rémy Voet (ryv), Tiffany Chang (tic), ThanhDodeurOdoo, Gorash, Pierre Paridans, William Braeckman, Romain Estievenart, Miquel Raïch, yhu-odoo, Didier (did), Julien Banken, tsm-odoo, Louis Wicket (wil), Maximilien (malb), Victor Piryns (pivi), Dylan Kiss (dyki), Rahul Prajapati, omra-odoo, Zelong Lin, maad-odoo, bary, Maryam Kia, reka-odoo, Alex Kühn, Chrysanthe (chgo), Junqi Wu, mano-odoo, Pierre Pulinckx (PIPU), aych-odoo, Pierre Pulinckx, Bastien PIERRE, Mahdi Alijani (malj), Krzysztof Magusiak (krma), nees-odoo, utma-odoo, Ayush Chauhan (aych), Giorgio Tocco (gito), akha, jayp-odoo, Laetitia (ldau), ramh, Kevin Gerard (kege), Akash Parmar, pmah-odoo, nmak-odoo, saurabh, ibo-odoo, akth-odoo, akus-odoo, Haja Ram, chpa-odoo, shmn-odoo, mear-odoo, niyp-odoo, Louis Wicket, ypat-odoo
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- crm_livechat, hr_livechat, spreadsheet_dashboard_im_livechat, test_discuss_full, website_hr_recruitment_livechat, website_livechat
- Description
Live Chat Support ========================== Allow to drop instant messaging widgets on any web page that will communicate with the current server and dispatch visitors request amongst several live chat operators. Help your customers with this chat, and analyse their feedback.
Code Analysis ⓘ
Views touched (47)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
chatbot_script_answer_view_form |
chatbot.script.answer.view.form | chatbot.script.answer | form | New |
chatbot_script_answer_view_tree |
chatbot.script.answer.view.list | chatbot.script.answer | list | New |
chatbot_script_step_view_form |
chatbot.script.step.view.form | chatbot.script.step | form | New |
chatbot_script_step_view_tree |
chatbot.script.step.view.list | chatbot.script.step | list | New |
chatbot_script_view_form |
chatbot.script.view.form | chatbot.script | form | New |
chatbot_script_view_search |
chatbot.script.view.search | chatbot.script | search | New |
chatbot_script_view_tree |
chatbot.script.view.list | chatbot.script | list | New |
chatbot_test_script_page |
chatbot_test_script_page | ir.ui.view | qweb | New |
discuss_channel_looking_for_help_view_kanban |
discuss.channel.kanban | discuss.channel | kanban | New |
discuss_channel_looking_for_help_view_list |
discuss.channel.looking.for.help.list | discuss.channel | list | New |
discuss_channel_looking_for_help_view_search |
discuss.channel.looking.for.help.view.search | discuss.channel | search | New |
discuss_channel_view_form |
discuss.channel.form | discuss.channel | form | New |
discuss_channel_view_graph |
discuss.channel.graph | discuss.channel | graph | New |
discuss_channel_view_kanban |
discuss.channel.kanban | discuss.channel | kanban | New |
discuss_channel_view_pivot |
discuss.channel.pivot | discuss.channel | pivot | New |
discuss_channel_view_search |
discuss.channel.search | discuss.channel | search | New |
discuss_channel_view_tree |
discuss.channel.list | discuss.channel | list | New |
external_loader |
Livechat : external_script field of livechat channel | ir.ui.view | qweb | New |
im_livechat.digest_digest_view_form_inherit |
im.livechat.digest.digest.view.form.inherit | digest.digest | form | Inherits digest.digest_digest_view_form |
im_livechat.unit_embed_suite |
im_livechat.unit_embed_suite | ir.ui.view | qweb | New |
im_livechat_agent_history_view_graph |
im_livechat.agent.history.graph | im_livechat.channel.member.history | graph | New |
im_livechat_agent_history_view_pivot |
im_livechat.agent.history.pivot | im_livechat.channel.member.history | pivot | New |
im_livechat_agent_history_view_search |
im_livechat.agent.history.search | im_livechat.channel.member.history | search | New |
im_livechat_channel_conversation_tag_view_form |
im.livechat.channel.conversation.tag.form | im_livechat.conversation.tag | form | New |
im_livechat_channel_conversation_tag_view_list |
im.livechat.channel.conversation.tag.list | im_livechat.conversation.tag | list | New |
im_livechat_channel_member_history_view_search |
im_livechat.channel.member.history.view.search | im_livechat.channel.member.history | search | New |
im_livechat_channel_member_history_view_tree |
im_livechat.channel.member.history.view.list | im_livechat.channel.member.history | list | New |
im_livechat_channel_rule_view_form |
im_livechat.channel.rule.form | im_livechat.channel.rule | form | New |
im_livechat_channel_rule_view_kanban |
im_livechat.channel.rule.kanban | im_livechat.channel.rule | kanban | New |
im_livechat_channel_rule_view_tree |
im.livechat.channel.rule.list | im_livechat.channel.rule | list | New |
im_livechat_channel_view_form |
im_livechat.channel.form | im_livechat.channel | form | New |
im_livechat_channel_view_kanban |
im_livechat.channel.kanban | im_livechat.channel | kanban | New |
im_livechat_channel_view_search |
im.livechat.channel.view.search | im_livechat.channel | search | New |
im_livechat_expertise_view_form |
im.livechat.expertise.form | im_livechat.expertise | form | New |
im_livechat_expertise_view_list |
im.livechat.expertise.list | im_livechat.expertise | list | New |
im_livechat_report_channel_view_form |
im_livechat.report.channel.form | im_livechat.report.channel | form | New |
im_livechat_report_channel_view_graph |
im_livechat.report.channel.graph | im_livechat.report.channel | graph | New |
im_livechat_report_channel_view_list |
im_livechat.report.channel.list | im_livechat.report.channel | list | New |
im_livechat_report_channel_view_pivot |
im_livechat.report.channel.pivot | im_livechat.report.channel | pivot | New |
im_livechat_report_channel_view_search |
im_livechat.report.channel.search | im_livechat.report.channel | search | New |
livechat_email_template |
livechat_email_template | ir.ui.view | qweb | New |
loader |
Livechat : Javascript appending the livechat button | ir.ui.view | qweb | New |
report_livechat_conversation |
report_livechat_conversation | ir.ui.view | qweb | New |
res_users_form_view |
res.users.form.im_livechat | res.users | form | Inherits base.view_users_form |
res_users_form_view_simple_modif |
res.users.preferences.form.im_livechat | res.users | form | Inherits base.view_users_form_simple_modif |
support_page |
Livechat : Support Page | ir.ui.view | qweb | New |
view_partner_form |
res.partner.view.buttons | res.partner | form | Inherits base.view_partner_form |
HTTP endpoints (53)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/chatbot/cors/restart |
CorsLivechatChatbotScriptController.cors_chatbot_restart |
public | jsonrpc | ALL | |
/chatbot/cors/answer/save |
CorsLivechatChatbotScriptController.cors_chatbot_save_answer |
public | jsonrpc | ALL | |
/chatbot/cors/step/trigger |
CorsLivechatChatbotScriptController.cors_chatbot_trigger_step |
public | jsonrpc | ALL | |
/chatbot/cors/step/validate_email |
CorsLivechatChatbotScriptController.cors_chatbot_validate_email |
public | jsonrpc | ALL | |
/im_livechat/cors/download_transcript/<int:channel_id> |
CorsLivechatController.cors_download_livechat_transcript |
public | http | ALL | |
/im_livechat/cors/feedback |
CorsLivechatController.cors_feedback |
public | jsonrpc | ALL | |
/im_livechat/cors/get_session |
CorsLivechatController.cors_get_session |
public | jsonrpc | POST | |
/im_livechat/cors/history |
CorsLivechatController.cors_history_pages |
public | jsonrpc | ALL | |
/im_livechat/cors/init |
CorsLivechatController.cors_livechat_init |
public | jsonrpc | ALL | |
/im_livechat/cors/visitor_leave_session |
CorsLivechatController.cors_visitor_leave_session |
public | jsonrpc | ALL | |
/im_livechat/cors/attachment/delete |
LivechatAttachmentController.im_livechat_attachment_delete |
public | jsonrpc | POST | |
/im_livechat/cors/attachment/upload |
LivechatAttachmentController.im_livechat_attachment_upload |
public | http | ALL | csrf off |
| (inherited route override) | LivechatAttachmentController.mail_attachment_upload |
inherited | http | ALL | |
/im_livechat/cors/channel/mark_as_read |
LivechatChannelController.livechat_channel_mark_as_read |
public | jsonrpc | POST | |
/im_livechat/cors/channel/messages |
LivechatChannelController.livechat_channel_messages |
public | jsonrpc | POST | |
/im_livechat/cors/channel/notify_typing |
LivechatChannelController.livechat_channel_notify_typing |
public | jsonrpc | POST | |
/im_livechat/conversation/create_and_link_expertise |
LivechatChannelController.livechat_conversation_create_and_link_expertise |
user | jsonrpc | POST | |
/im_livechat/conversation/update_tags |
LivechatChannelController.livechat_conversation_update_tags |
user | jsonrpc | POST | sudo |
/im_livechat/conversation/write_expertises |
LivechatChannelController.livechat_conversation_write_expertises |
user | jsonrpc | POST | sudo |
/im_livechat/session/update_note |
LivechatChannelController.livechat_session_update_note |
user | jsonrpc | POST | sudo |
/im_livechat/session/update_status |
LivechatChannelController.livechat_session_update_status |
user | jsonrpc | POST | sudo |
/chatbot/restart |
LivechatChatbotScriptController.chatbot_restart |
public | jsonrpc | ALL | |
/chatbot/answer/save |
LivechatChatbotScriptController.chatbot_save_answer |
public | jsonrpc | ALL | sudo |
/chatbot/step/trigger |
LivechatChatbotScriptController.chatbot_trigger_step |
public | jsonrpc | ALL | sudo |
/chatbot/step/validate_email |
LivechatChatbotScriptController.chatbot_validate_email |
public | jsonrpc | ALL | sudo |
/im_livechat/assets_embed.<any(css, js):ext> |
LivechatController.assets_embed |
public | http | ALL | |
/im_livechat/download_transcript/<int:channel_id> |
LivechatController.download_livechat_transcript |
public | http | ALL | sudo |
/im_livechat/email_livechat_transcript |
LivechatController.email_livechat_transcript |
user | jsonrpc | ALL | |
/im_livechat/external_lib.<any(css,js):ext> |
LivechatController.external_lib |
public | http | ALL | |
/im_livechat/feedback |
LivechatController.feedback |
public | jsonrpc | ALL | sudo |
/im_livechat/font-awesome |
LivechatController.fontawesome |
none | http | ALL | |
/im_livechat/emoji_bundle |
LivechatController.get_emoji_bundle |
public | http | ALL | |
/im_livechat/get_session |
LivechatController.get_session |
public | jsonrpc | POST | sudo |
/im_livechat/history |
LivechatController.history_pages |
public | jsonrpc | ALL | sudo |
/im_livechat/loader/<int:channel_id> |
LivechatController.loader |
public | http | ALL | sudo |
/im_livechat/odoo_ui_icons |
LivechatController.odoo_ui_icons |
none | http | ALL | |
/im_livechat/support/<int:channel_id> |
LivechatController.support_page |
public | http | ALL | sudo |
/im_livechat/visitor_leave_session |
LivechatController.visitor_leave_session |
public | jsonrpc | ALL | |
/im_livechat/cors/link_preview |
LivechatLinkPreviewController.livechat_link_preview |
public | jsonrpc | POST | |
/im_livechat/cors/link_preview/hide |
LivechatLinkPreviewController.livechat_link_preview_hide |
public | jsonrpc | POST | |
/im_livechat/cors/message/reaction |
LivechatMessageReactionController.livechat_message_reaction |
public | jsonrpc | POST | |
| (inherited route override) | LivechatRtcController.channel_call_join |
inherited | http | ALL | sudo |
/im_livechat/cors/rtc/channel/join_call |
LivechatRtcController.livechat_channel_call_join |
public | jsonrpc | POST | |
/im_livechat/cors/rtc/channel/leave_call |
LivechatRtcController.livechat_channel_call_leave |
public | jsonrpc | POST | |
/im_livechat/cors/channel/ping |
LivechatRtcController.livechat_channel_ping |
public | jsonrpc | POST | |
/im_livechat/cors/rtc/session/notify_call_members |
LivechatRtcController.livechat_session_call_notify |
public | jsonrpc | POST | |
/im_livechat/cors/rtc/session/update_and_broadcast |
LivechatRtcController.livechat_session_update_and_broadcast |
public | jsonrpc | POST | |
/im_livechat/cors/message/post |
LivechatThreadController.livechat_message_post |
public | jsonrpc | POST | |
/im_livechat/cors/message/update_content |
LivechatThreadController.livechat_message_update_content |
public | jsonrpc | POST | |
| (inherited route override) | ThreadController.mail_message_post |
inherited | http | ALL | |
/im_livechat/cors/action |
WebClient.livechat_action |
public | jsonrpc | POST | |
/im_livechat/cors/data |
WebClient.livechat_data |
public | jsonrpc | POST | |
/web/tests/livechat |
WebClient.test_external_livechat |
user | http | ALL |
Models touched (23)
New fields (6)
-
discuss_channel_idMany2one → discuss.channelindex=Trueondelete='cascade'required=Truestring='Discussion Channel' args: 'discuss.channel' -
mail_message_idMany2one → mail.messagestring='Related Mail Message' args: 'mail.message' -
script_step_idMany2one → chatbot.script.stepindex='btree_not_null'string='Chatbot Step' args: 'chatbot.script.step' -
user_raw_answerHtmlstring="User's raw answer" -
user_raw_script_answer_idIntegerhelp='Id of the script answer. Useful for statistics when answer is deleted.' -
user_script_answer_idMany2one → chatbot.script.answerondelete='set null'string="User's answer" args: 'chatbot.script.answer'
No public methods.
New fields (7)
-
activeBooleandefault=True -
first_step_warningSelectioncompute='_compute_first_step_warning' args: [('first_step_operator', 'First Step Operator'), ('first_step_invalid', 'First Step Invalid')] -
image_1920Imagereadonly=Falserelated='operator_partner_id.image_1920' -
livechat_channel_countIntegercompute='_compute_livechat_channel_count'string='Livechat Channel Count' -
operator_partner_idMany2one → res.partnercopy=Falseindex=Trueondelete='restrict'required=Truestring='Bot Operator' args: 'res.partner' -
script_step_idsOne2many → chatbot.script.stepcopy=Truestring='Script Steps' args: 'chatbot.script.step', 'chatbot_script_id' -
titleChardefault='Chatbot'required=Truetranslate=True args: 'Title'
-
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_idMany2onerelated='script_step_id.chatbot_script_id' -
nameCharrequired=Truestring='Answer'translate=True -
redirect_linkCharhelp='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_idMany2one → chatbot.script.stepindex=Trueondelete='cascade'required=Truestring='Script Step' args: 'chatbot.script.step' -
sequenceIntegerdefault=1string='Sequence'
No public methods.
New fields (10)
-
answer_idsOne2many → chatbot.script.answercopy=Truestring='Answers' args: 'chatbot.script.answer', 'script_step_id' -
chatbot_script_idMany2one → chatbot.scriptindex=Trueondelete='cascade'required=Truestring='Chatbot' args: 'chatbot.script' -
is_forward_operatorBooleancompute='_compute_is_forward_operator' -
is_forward_operator_childBooleancompute='_compute_is_forward_operator_child' -
messageHtmlstring='Message'translate=True -
nameCharcompute='_compute_name'string='Name' -
operator_expertise_idsMany2many → im_livechat.expertisehelp='When forwarding live chat conversations, the chatbot will prioritize users with matching expertise.'string='Operator Expertise' args: 'im_livechat.expertise' -
sequenceIntegerstring='Sequence' -
step_typeSelectiondefault='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_idsMany2many → chatbot.script.answercompute='_compute_triggering_answer_ids'copy=Falsedomain="[('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=Falsestore=Truestring='Only If' args: 'chatbot.script.answer'
-
create(self, vals_list)@api.model_create_multiEnsure 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_conversationsBooleanargs: 'Conversations handled' -
kpi_livechat_conversations_valueIntegercompute='_compute_kpi_livechat_conversations_value' -
kpi_livechat_ratingBooleanargs: '% of Happiness' -
kpi_livechat_rating_valueFloatcompute='_compute_kpi_livechat_rating_value'digits=(16, 2) -
kpi_livechat_responseBooleanargs: 'Time to answer (sec)' -
kpi_livechat_response_valueFloatcompute='_compute_kpi_livechat_response_value'digits=(16, 2)
No public methods.
New fields (1)
-
livechat_participant_history_idsMany2many → im_livechat.channel.member.historyargs: 'im_livechat.channel.member.history'
No public methods.
New fields (31)
-
channel_typeSelectionondelete={'livechat': 'cascade'}selection_add=[('livechat', 'Livechat Conversation')] -
chatbot_current_step_idMany2one → chatbot.script.stepstring='Chatbot Current Step' args: 'chatbot.script.step' -
chatbot_message_idsOne2many → chatbot.messagegroups='im_livechat.im_livechat_group_manager'string='Chatbot Messages' args: 'chatbot.message', 'discuss_channel_id' -
country_idMany2one → res.countryhelp='Country of the visitor of the channel'string='Country' args: 'res.country' -
durationFloatcompute='_compute_duration'help='Duration of the session in hours' args: 'Duration' -
livechat_agent_history_idsOne2many → im_livechat.channel.member.historycompute='_compute_livechat_agent_history_ids'search='_search_livechat_agent_history_ids'string='Agents (History)' args: 'im_livechat.channel.member.history' -
livechat_agent_partner_idsMany2many → res.partnercompute='_compute_livechat_agent_partner_ids'store=Truestring='Agents' args: 'res.partner', 'im_livechat_channel_member_history_discuss_channel_agent_rel' -
livechat_agent_providing_help_historyMany2one → im_livechat.channel.member.historycompute='_compute_livechat_agent_providing_help_history'store=Truestring='Help Provided (Agent)' args: 'im_livechat.channel.member.history' -
livechat_agent_requesting_help_historyMany2one → im_livechat.channel.member.historycompute='_compute_livechat_agent_requesting_help_history'store=Truestring='Help Requested (Agent)' args: 'im_livechat.channel.member.history' -
livechat_bot_history_idsOne2many → im_livechat.channel.member.historycompute='_compute_livechat_bot_history_ids'search='_search_livechat_bot_history_ids'string='Bots (History)' args: 'im_livechat.channel.member.history' -
livechat_bot_partner_idsMany2many → res.partnercompute='_compute_livechat_bot_partner_ids'context={'active_test': False}store=Truestring='Bots' args: 'res.partner', 'im_livechat_channel_member_history_discuss_channel_bot_rel' -
livechat_channel_idMany2one → im_livechat.channelindex='btree_not_null' args: 'im_livechat.channel', 'Channel' -
livechat_channel_member_history_idsOne2many → im_livechat.channel.member.historyargs: 'im_livechat.channel.member.history', 'channel_id' -
livechat_conversation_tag_idsMany2many → im_livechat.conversation.taggroups='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_idsMany2many → mail.guestcompute='_compute_livechat_customer_guest_ids'string='Customers (Guests)' args: 'mail.guest' -
livechat_customer_history_idsOne2many → im_livechat.channel.member.historycompute='_compute_livechat_customer_history_ids'search='_search_livechat_customer_history_ids'string='Customers (History)' args: 'im_livechat.channel.member.history' -
livechat_customer_partner_idsMany2many → res.partnercompute='_compute_livechat_customer_partner_ids'store=Truestring='Customers (Partners)' args: 'res.partner', 'im_livechat_channel_member_history_discuss_channel_customer_rel' -
livechat_end_dtDatetimehelp='Session is closed when either the visitor or the last agent leaves the conversation.' args: 'Session end date' -
livechat_expertise_idsMany2many → im_livechat.expertisestore=True args: 'im_livechat.expertise', 'discuss_channel_im_livechat_expertise_rel', 'discuss_channel_id', 'im_livechat_expertise_id' -
livechat_failureSelectionselection=[('no_answer', 'Never Answered'), ('no_agent', 'No one Available'), ('no_failure', 'No Failure')]string='Live Chat Session Failure' -
livechat_is_escalatedBooleancompute='_compute_livechat_is_escalated'store=True args: 'Is session escalated' -
livechat_lang_idMany2one → res.langhelp='Lang of the visitor of the channel.'string='Language' args: 'res.lang' -
livechat_matches_self_expertiseBooleancompute='_compute_livechat_matches_self_expertise'search='_search_livechat_matches_self_expertise' -
livechat_matches_self_langBooleancompute='_compute_livechat_matches_self_lang'search='_search_livechat_matches_self_lang' -
livechat_noteHtmlgroups='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_idMany2one → res.partnerindex='btree_not_null'string='Operator' args: 'res.partner' -
livechat_outcomeSelectioncompute='_compute_livechat_outcome'store=True args: [('no_answer', 'Never Answered'), ('no_agent', 'No one Available'), ('no_failure', 'Success'), ('escalated', 'Escalated')] -
livechat_start_hourFloatcompute='_compute_livechat_start_hour'store=True args: 'Session Start Hour' -
livechat_statusSelectioncompute='_compute_livechat_status'groups='base.group_user'readonly=Falseselection=[('in_progress', 'In progress'), ('waiting', 'Waiting for customer'), ('need_help', 'Looking for help')]store=True -
livechat_week_daySelectioncompute='_compute_livechat_week_day'store=Truestring='Day of the Week' args: [('0', 'Monday'), ('1', 'Tuesday'), ('2', 'Wednesday'), ('3', 'Thursday'), ('4', 'Friday'), ('5', 'Saturday'), ('6', 'Sunday')] -
rating_last_textSelectionstore=True
-
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_idsMany2many → im_livechat.expertisecompute='_compute_agent_expertise_ids'compute_sudo=Trueinverse='_inverse_agent_expertise_ids' args: 'im_livechat.expertise' -
chatbot_script_idMany2one → chatbot.scriptcompute='_compute_chatbot_script_id'compute_sudo=Trueinverse='_inverse_chatbot_script_id' args: 'chatbot.script' -
livechat_member_history_idsOne2many → im_livechat.channel.member.historyargs: 'im_livechat.channel.member.history', 'member_id' -
livechat_member_typeSelectioncompute='_compute_livechat_member_type'compute_sudo=Trueinverse='_inverse_livechat_member_type' args: [('agent', 'Agent'), ('visitor', 'Visitor'), ('bot', 'Chatbot')]
-
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_insideBooleancompute='_are_you_inside'readonly=Truestore=Falsestring='Are you inside the matrix?' -
available_operator_idsMany2many → res.userscompute='_compute_available_operator_ids' args: 'res.users' -
block_assignment_during_callBooleanhelp='While on a call, agents will not receive new conversations.' args: 'No Chats During Call' -
button_background_colorChardefault='#875A7B'help='Default background color of the Livechat button' -
button_textChardefault=_default_button_texttranslate=True args: 'Text of the Button' -
button_text_colorChardefault='#FFFFFF'help='Default text color of the Livechat button' -
channel_idsOne2many → discuss.channelargs: 'discuss.channel', 'livechat_channel_id', 'Sessions' -
chatbot_script_countIntegercompute='_compute_chatbot_script_count'string='Number of Chatbot' -
default_messageChardefault=_default_default_messagehelp="This is an automated 'welcome' message that your visitor will see when they initiate a new conversation."translate=True args: 'Welcome Message' -
header_background_colorChardefault='#875A7B'help='Default background color of the channel header once open' -
max_sessionsIntegerdefault=10help='Maximum number of concurrent sessions per operator.'string='Maximum Sessions' -
max_sessions_modeSelectiondefault='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')] -
nameCharrequired=True args: 'Channel Name' -
nbr_channelIntegercompute='_compute_nbr_channel'readonly=Truestore=False args: 'Number of conversation' -
ongoing_session_countIntegercompute='_compute_ongoing_sessions_count' args: 'Number of Ongoing Sessions' -
remaining_session_capacityIntegercompute='_compute_remaining_session_capacity' args: 'Remaining Session Capacity' -
review_linkCharhelp='Visitors who leave a positive review will be redirected to this optional link.' args: 'Review Link' -
rule_idsOne2many → im_livechat.channel.ruleargs: 'im_livechat.channel.rule', 'channel_id', 'Rules' -
script_externalHtmlcompute='_compute_script_external'readonly=Truesanitize=Falsestore=False args: 'Script (external)' -
title_colorChardefault='#FFFFFF'help='Default title color of the channel once open' -
user_idsMany2many → res.usersdefault=_default_user_idsstring='Agents' args: 'res.users', 'im_livechat_channel_im_user', 'channel_id', 'user_id' -
web_pageCharcompute='_compute_web_page_link'help='URL to a static page where you client can discuss with the operator of the channel.'readonly=Truestore=False args: 'Web Page'
-
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_idsMany2many → im_livechat.expertisecompute='_compute_member_fields'store=True args: 'im_livechat.expertise' -
avatar_128Binarycompute='_compute_avatar_128' -
call_countFloataggregator='sum'related='has_call' args: '# of Sessions with Calls' -
call_duration_hourFloataggregator='sum'compute='_compute_call_duration_hour'store=True args: 'Call Duration' -
call_history_idsMany2many → discuss.call.historyargs: 'discuss.call.history' -
call_percentageFloataggregator='avg'related='has_call' args: 'Session with Calls (%)' -
channel_idMany2one → discuss.channelcompute='_compute_member_fields'index=Trueondelete='cascade'store=True args: 'discuss.channel' -
chatbot_script_idMany2one → chatbot.scriptcompute='_compute_member_fields'index='btree_not_null'store=True args: 'chatbot.script' -
conversation_tag_idsMany2many → im_livechat.conversation.tagrelated='channel_id.livechat_conversation_tag_ids' args: 'im_livechat.conversation.tag', 'im_livechat_channel_member_history_conversation_tag_rel' -
guest_idMany2one → mail.guestcompute='_compute_member_fields'index='btree_not_null'store=True args: 'mail.guest' -
has_callFloatcompute='_compute_has_call'store=True -
help_statusSelectioncompute='_compute_help_status'selection=[('requested', 'Help Requested'), ('provided', 'Help Provided')]store=True -
livechat_member_typeSelectioncompute='_compute_member_fields'store=True args: [('agent', 'Agent'), ('visitor', 'Visitor'), ('bot', 'Chatbot')] -
member_idMany2one → discuss.channel.memberindex='btree_not_null' args: 'discuss.channel.member' -
message_countIntegeraggregator='avg' args: '# of Messages per Session' -
partner_idMany2one → res.partnercompute='_compute_member_fields'index='btree_not_null'store=True args: 'res.partner' -
ratingFloatrelated='rating_id.rating' -
rating_idMany2one → rating.ratingcompute='_compute_rating_id'store=True args: 'rating.rating' -
rating_textSelectionrelated='rating_id.rating_text'string='Rating text' -
response_time_hourFloataggregator='avg' args: 'Response Time' -
session_country_idMany2one → res.countryrelated='channel_id.country_id' args: 'res.country' -
session_duration_hourFloataggregator='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_idMany2one → im_livechat.channelrelated='channel_id.livechat_channel_id' args: 'im_livechat.channel', 'Live chat channel' -
session_outcomeSelectionrelated='channel_id.livechat_outcome' -
session_start_hourFloatrelated='channel_id.livechat_start_hour' -
session_week_daySelectionrelated='channel_id.livechat_week_day'
-
action_open_discuss_channel_view(self, domain=())@api.model
New fields (8)
-
actionSelectiondefault='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=Truestring='Live Chat Button' args: [('display_button', 'Show'), ('display_button_and_text', 'Show with notification'), ('auto_popup', 'Open automatically'), ('hide_button', 'Hide')] -
auto_popup_timerIntegerdefault=0help="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_idMany2one → im_livechat.channelhelp='The channel of the rule'index='btree_not_null' args: 'im_livechat.channel', 'Channel' -
chatbot_enabled_conditionSelectiondefault='always'required=Trueselection=[('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_idMany2one → chatbot.scriptstring='Chatbot' args: 'chatbot.script' -
country_idsMany2many → res.countryhelp="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_urlCharhelp='Regular expression specifying the web pages this rule will be applied on.' args: 'URL Regex' -
sequenceIntegerdefault=10help='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'
-
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)
-
colorIntegerdefault=_get_default_color args: 'Color' -
conversation_idsMany2many → discuss.channelstring='Discuss Channels' args: 'discuss.channel', 'livechat_conversation_tag_rel' -
nameCharrequired=True args: 'Name'
No public methods.
New fields (2)
-
nameCharrequired=Truetranslate=True args: 'Name' -
user_idsMany2many → res.userscompute='_compute_user_ids'inverse='_inverse_user_ids'store=Falsestring='Operators' args: 'res.users'
No public methods.
New fields (33)
-
agent_providing_help_historyMany2one → im_livechat.channel.member.historyreadonly=Truerelated='channel_id.livechat_agent_providing_help_history' args: 'im_livechat.channel.member.history' -
agent_requesting_help_historyMany2one → im_livechat.channel.member.historyreadonly=Truerelated='channel_id.livechat_agent_requesting_help_history' args: 'im_livechat.channel.member.history' -
call_duration_hourFloataggregator='avg'digits=(16, 2)readonly=True args: 'Call Duration' -
channel_idMany2one → discuss.channelreadonly=True args: 'discuss.channel', 'Conversation' -
channel_nameCharreadonly=True args: 'Channel Name' -
chatbot_answers_pathCharreadonly=True args: 'Chatbot Answers' -
chatbot_answers_path_strCharreadonly=True args: 'Chatbot Answers (String)' -
chatbot_script_idMany2one → chatbot.scriptreadonly=True args: 'chatbot.script', 'Chatbot' -
conversation_tag_idsMany2many → im_livechat.conversation.tagreadonly=Truerelated='channel_id.livechat_conversation_tag_ids'string='Tags used in this conversation' args: 'im_livechat.conversation.tag' -
country_idMany2one → res.countryreadonly=True args: 'res.country', 'Country of the visitor' -
day_numberSelectionreadonly=Trueselection=[('0', 'Sunday'), ('1', 'Monday'), ('2', 'Tuesday'), ('3', 'Wednesday'), ('4', 'Thursday'), ('5', 'Friday'), ('6', 'Saturday')]string='Day of the Week' -
durationFloataggregator='avg'digits=(16, 2)help='Duration of the conversation (in minutes)'readonly=True args: 'Duration (min)' -
handled_by_agentIntegeraggregator='sum'readonly=True args: 'Handled by Agent' -
handled_by_botIntegeraggregator='sum'readonly=True args: 'Handled by Bot' -
has_callFloatreadonly=True args: 'Whether the session had a call' -
lang_idMany2one → res.langreadonly=Truerelated='channel_id.livechat_lang_id'string='Language' args: 'res.lang' -
livechat_channel_idMany2one → im_livechat.channelreadonly=True args: 'im_livechat.channel', 'Channel' -
nbr_messageIntegeraggregator='avg'help='Number of message in the conversation'readonly=True args: 'Messages per Session' -
number_of_callsFloataggregator='sum'readonly=Truerelated='has_call' args: '# of Sessions with calls' -
partner_idMany2one → res.partnerreadonly=True args: 'res.partner', 'Agent' -
percentage_of_callsFloataggregator='avg'readonly=Truerelated='has_call' args: 'Session with Calls (%)' -
ratingIntegeraggregator='avg'readonly=True args: 'Rating' -
rating_textCharreadonly=True args: 'Satisfaction Rate' -
session_expertise_idsMany2many → im_livechat.expertisereadonly=Truerelated='channel_id.livechat_expertise_ids'string='Expertises used in this session' args: 'im_livechat.expertise' -
session_expertisesCharreadonly=True args: 'Expertises used in this session (String)' -
session_outcomeSelectionreadonly=Trueselection=[('no_answer', 'Never Answered'), ('no_agent', 'No one Available'), ('no_failure', 'Success'), ('escalated', 'Escalated')]string='Session Outcome' -
start_dateDatetimereadonly=True args: 'Start Date of session' -
start_date_hourCharreadonly=True args: 'Hour of start Date of session' -
start_date_minutesCharreadonly=True args: 'Start Date of session, truncated to minutes' -
start_hourCharreadonly=True args: 'Start Hour of session' -
time_to_answerFloataggregator='avg'digits=(16, 6)help='Average time in hours to give the first answer to the visitor'readonly=True args: 'Response Time' -
uuidCharreadonly=True args: 'UUID' -
visitor_partner_idMany2one → res.partnerreadonly=Truestring='Customer' args: 'res.partner'
-
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_idsOne2many → chatbot.scriptargs: 'chatbot.script', 'operator_partner_id' -
livechat_channel_countIntegercompute='_compute_livechat_channel_count' -
user_livechat_usernameCharcompute='_compute_user_livechat_username'
-
action_view_livechat_sessions(self)
New fields (7)
-
has_access_livechatBooleancompute='_compute_has_access_livechat'readonly=Truestore=Falsestring='Has access to Livechat' -
livechat_channel_idsMany2many → im_livechat.channelcopy=False args: 'im_livechat.channel', 'im_livechat_channel_im_user', 'user_id', 'channel_id' -
livechat_expertise_idsMany2many → im_livechat.expertisecompute='_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=Falsestring='Live Chat Expertise' args: 'im_livechat.expertise' -
livechat_is_in_callBooleancompute='_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_idsMany2many → res.langcompute='_compute_livechat_lang_ids'groups='im_livechat.im_livechat_group_user,base.group_erp_manager'inverse='_inverse_livechat_lang_ids'store=Falsestring='Livechat Languages' args: 'res.lang' -
livechat_ongoing_session_countIntegercompute='_compute_livechat_ongoing_session_count'groups='im_livechat.im_livechat_group_user' args: 'Number of Ongoing sessions' -
livechat_usernameCharcompute='_compute_livechat_username'groups='im_livechat.im_livechat_group_user,base.group_erp_manager'inverse='_inverse_livechat_username'store=Falsestring='Livechat Username'
-
SELF_READABLE_FIELDS(self)@property -
SELF_WRITEABLE_FIELDS(self)@property -
write(self, vals)
New fields (3)
-
livechat_expertise_idsMany2many → im_livechat.expertisehelp='When forwarding live chat conversations, the chatbot will prioritize users with matching expertise.'string='Live Chat Expertise' args: 'im_livechat.expertise' -
livechat_lang_idsMany2many → res.langcomodel_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_usernameCharhelp='This username will be used as your name in the livechat channels.' args: 'Livechat Username'
No public methods.
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…