TIP: You can type at any time to perform a new search.
Live Chat
im_livechat · odoo/odoo
Security findings
- Repository
- odoo/odoo · module folder
- Module version
- 0.1.0
- Category
- Website/Live Chat
- Folder size
- 8.0 MB
- License
- LGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- https://www.odoo.com/app/live-chat
- Last tracking update
- 2026-10-05 12:14:54
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Thibault Delavallée, odoo, Odoo Translation Bot, Christophe Matthieu, Aaron Bohy, Géry Debongnie, qsm-odoo, Odoo Online, Julien Castiaux, Aurélien Warnon, Victor Feyens, Adrien Dieudonné, Sébastien Theys, Julien Mougenot, std-odoo, David Beguin, Prakash Prajapati, Tiffany Chang (tic), Gorash, Pierre Paridans, Romain Estievenart, Miquel Raïch, Didier (did), Nicolas Bayet, luvi, Renaud Thiry, tsm-odoo, Louis Wicket (wil), Pierre-Yves Dufays, Dylan Kiss (dyki), Rahul Prajapati, Chong Wang (cwg), Zelong Lin, Andrzej(pian), maad-odoo, Maryam Kia, reka-odoo, Alex Kühn, Chrysanthe (chgo), sami odoo, Pierre Pulinckx, Bastien PIERRE, Michaël Mattiello, Mahdi Alijani (malj), Krzysztof Magusiak (krma), nees-odoo, utma-odoo, bhna-odoo, defl, bikh-odoo, Ayush Chauhan (aych), Giorgio Tocco (gito), jayp-odoo, Julien Launois (jula), ramh, assh-odoo, Kevin Gerard (kege), Akash Parmar, Louis, pmah-odoo, nmak-odoo, Serge Bayet, Atovange, Tina, akth-odoo, akus-odoo, ELCO, Haja Ram, chpa-odoo, shmn-odoo, mear-odoo, niyp-odoo, pvag-odoo, Louis Wicket, Julien Coppin (jucop), Alex Kühn, Julien Piron, Jean Schoenlaub, pusu-odoo, Elisabeth Dickinson (edi), radet-odoo, jayyypatel, Alex Kuhn
- 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 (44)
| 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_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_config_view_kanban |
im_livechat.channel.kanban | im_livechat.channel | kanban | Inherits im_livechat.im_livechat_channel_view_kanban |
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_list |
im_livechat.channel.list | im_livechat.channel | list | 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 (38)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/chatbot/cors/restart |
CorsLivechatChatbotScriptController.cors_chatbot_restart |
force_guest | jsonrpc | ALL | |
/chatbot/cors/answer/save |
CorsLivechatChatbotScriptController.cors_chatbot_save_answer |
force_guest | jsonrpc | ALL | |
/chatbot/cors/step/trigger |
CorsLivechatChatbotScriptController.cors_chatbot_trigger_step |
force_guest | jsonrpc | ALL | |
/chatbot/cors/step/validate_contact_info |
CorsLivechatChatbotScriptController.cors_chatbot_validate_contact_info |
force_guest | jsonrpc | ALL | |
/im_livechat/cors/download_transcript/<int:channel_id> |
CorsLivechatController.cors_download_livechat_transcript |
force_guest | http | ALL | |
/im_livechat/cors/feedback |
CorsLivechatController.cors_feedback |
force_guest | jsonrpc | ALL | |
/im_livechat/cors/get_session |
CorsLivechatController.cors_get_session |
force_guest_optional | jsonrpc | POST | |
/im_livechat/cors/history |
CorsLivechatController.cors_history_pages |
force_guest | jsonrpc | ALL | |
/im_livechat/cors/init |
CorsLivechatController.cors_livechat_init |
force_guest_optional | jsonrpc | ALL | |
/im_livechat/cors/visitor_leave_session |
CorsLivechatController.cors_visitor_leave_session |
force_guest | jsonrpc | ALL | |
/im_livechat/cors/message/translate |
GoogleTranslateCorsController.livechat_message_translate |
force_guest | jsonrpc | POST | |
/im_livechat/cors/attachment/delete |
LivechatAttachmentController.im_livechat_attachment_delete |
force_guest | jsonrpc | POST | |
/im_livechat/cors/attachment/upload |
LivechatAttachmentController.im_livechat_attachment_upload |
force_guest | http | ALL | csrf off |
/im_livechat/cors/channel/mark_as_read |
LivechatChannelController.livechat_channel_mark_as_read |
force_guest | jsonrpc | POST | |
/im_livechat/cors/channel/notify_typing |
LivechatChannelController.livechat_channel_notify_typing |
force_guest | jsonrpc | POST | |
/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/emoji_bundle |
LivechatController.get_emoji_bundle |
public | http | ALL | |
/im_livechat/history |
LivechatController.history_pages |
public | jsonrpc | ALL | sudo |
/im_livechat/loader/<int:channel_id> |
LivechatController.loader |
public | http | ALL | sudo |
/im_livechat/material_symbols_outlined |
LivechatController.material_symbols |
none | http | ALL | |
/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/cors/link_preview |
LivechatLinkPreviewController.livechat_link_preview |
force_guest | jsonrpc | POST | |
/im_livechat/cors/link_preview/hide |
LivechatLinkPreviewController.livechat_link_preview_hide |
force_guest | jsonrpc | POST | |
/im_livechat/cors/message/reaction |
LivechatMessageReactionController.livechat_message_reaction |
force_guest | jsonrpc | POST | |
/im_livechat/cors/rtc/channel/join_call |
LivechatRtcController.livechat_channel_call_join |
force_guest | jsonrpc | POST | |
/im_livechat/cors/rtc/channel/leave_call |
LivechatRtcController.livechat_channel_call_leave |
force_guest | jsonrpc | POST | |
/im_livechat/cors/channel/ping |
LivechatRtcController.livechat_channel_ping |
force_guest | jsonrpc | POST | |
/im_livechat/cors/rtc/session/notify_call_members |
LivechatRtcController.livechat_session_call_notify |
force_guest | jsonrpc | POST | |
/im_livechat/cors/rtc/session/update_and_broadcast |
LivechatRtcController.livechat_session_update_and_broadcast |
force_guest | jsonrpc | POST | |
/im_livechat/cors/message/post |
LivechatThreadController.livechat_message_post |
force_guest | jsonrpc | POST | |
/im_livechat/cors/message/update_content |
LivechatThreadController.livechat_message_update_content |
force_guest | jsonrpc | POST | |
| (inherited route override) | ThreadController.mail_message_post |
inherited | http | ALL | |
/im_livechat/cors/store |
WebClient.livechat_store |
force_guest_optional | 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.messageindex=Truestring='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' -
titleCharcopy=mark_as_copy('title')default='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. -
create(self, vals_list)@api.model_create_multi -
write(self, vals)
New fields (5)
-
chatbot_script_idMany2onerelated='script_step_id.chatbot_script_id' -
nameCharcopy=Truerequired=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 (9)
-
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_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', 'Live Chat')] -
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_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_looking_for_help_since_dtDatetimecompute='_compute_livechat_looking_for_help_since_dt'help="Datetime when the chat entered the 'Looking for help' status."store=Truestring='Requested At' -
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_outcomeSelectioncompute='_compute_livechat_outcome'store=True args: [('no_answer', 'Never Answered'), ('no_agent', 'No one Available'), ('no_failure', 'Success'), ('escalated', 'Escalated')] -
livechat_ratingSelectionfalsy_value_label='Not Rated Yet'selection=[('1', 'Unhappy'), ('3', 'Neutral'), ('5', 'Happy')]string='Livechat Rating Text' -
livechat_rating_percentageFloataggregator='avg'compute='_compute_livechat_rating_percentage'compute_sql='_compute_sql_livechat_rating_percentage'compute_sudo=Truestring='Rating (%)' -
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'), ('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')]
-
channel_change_description(self, description) -
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_sql='_compute_sql_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 (26)
-
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' -
available_operator_ids_countIntegercompute='_compute_available_operator_ids' args: 'Agents Connected' -
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 conversations in the past 30 days' -
ongoing_session_countIntegercompute='_compute_ongoing_sessions_count' args: 'Number of Ongoing Sessions' -
rating_countIntegercompute='_compute_rating_percentage_satisfaction'string='# Ratings' -
rating_percentage_satisfactionFloatcompute='_compute_rating_percentage_satisfaction' args: 'Rating Satisfaction' -
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)' -
script_external_textCharcompute='_compute_script_external' args: 'Script (external) Text' -
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 (24)
-
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' -
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' -
ratingSelectioncompute='_compute_rating'falsy_value_label='Not Rated Yet'store=True args: [('1', 'Unhappy'), ('3', 'Neutral'), ('5', 'Happy')] -
rating_percentageFloataggregator='avg'compute='_compute_rating_percentage'compute_sql='_compute_sql_rating_percentage'compute_sudo=Truestring='Rating (%)' -
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 on larger screens. On small screens, this behaves like 'Show'.\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)
-
colorIntegerargs: 'Color' -
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 (32)
-
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' -
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 (%)' -
ratingSelectionfalsy_value_label='Not Rated Yet'readonly=Trueselection=[('1', 'Unhappy'), ('3', 'Neutral'), ('5', 'Happy')]string='Satisfaction Rate' -
rating_percentageFloataggregator='avg'readonly=True args: 'Rating (%)' -
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 (1)
-
chatbot_message_idsOne2many → chatbot.messageargs: 'chatbot.message', 'mail_message_id'
No public methods.
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'help='When forwarding live chat conversations, the chatbot will prioritize users with matching expertise.'inverse='_inverse_livechat_expertise_ids'store=Falsestring='Live Chat Expertise'user_writeable=True 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'inverse='_inverse_livechat_lang_ids'store=Falsestring='Livechat Languages'user_writeable=True 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'inverse='_inverse_livechat_username'store=Falsestring='Livechat Username'user_writeable=True
-
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.
New fields (0)
No new fields.
Public methods (1)-
SELF_REQUIRED_UTM_REF(self)@property
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…