From 4b8b2e8dfe3147beb5ab7c333269c2874eda5267 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Maes?= <jem@openerp.com>
Date: Fri, 26 Sep 2014 11:43:12 +0200
Subject: [PATCH] [ADD] im_odoo_support : add the module for the live odoo
 support from all instances. This sets the bus and im_chat module auto
 installable.

---
 addons/im_odoo_support/__init__.py            |   0
 addons/im_odoo_support/__openerp__.py         |  27 ++++
 .../static/img/odoo_o_small.png               | Bin 0 -> 4433 bytes
 .../static/src/js/im_odoo_support.js          | 134 ++++++++++++++++++
 .../static/src/xml/im_odoo_support.xml        |  11 ++
 .../im_odoo_support/views/im_odoo_support.xml |  20 +++
 6 files changed, 192 insertions(+)
 create mode 100644 addons/im_odoo_support/__init__.py
 create mode 100644 addons/im_odoo_support/__openerp__.py
 create mode 100644 addons/im_odoo_support/static/img/odoo_o_small.png
 create mode 100644 addons/im_odoo_support/static/src/js/im_odoo_support.js
 create mode 100644 addons/im_odoo_support/static/src/xml/im_odoo_support.xml
 create mode 100644 addons/im_odoo_support/views/im_odoo_support.xml

diff --git a/addons/im_odoo_support/__init__.py b/addons/im_odoo_support/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/addons/im_odoo_support/__openerp__.py b/addons/im_odoo_support/__openerp__.py
new file mode 100644
index 000000000000..2e90ddc7d875
--- /dev/null
+++ b/addons/im_odoo_support/__openerp__.py
@@ -0,0 +1,27 @@
+{
+    'name' : 'Odoo Live Support',
+    'author': 'OpenERP SA',
+    'version': '1.0',
+    'summary': 'Chat with the Odoo collaborators',
+    'category': 'Tools',
+    'complexity': 'medium',
+    'website': 'https://www.odoo.com/',
+    'description':
+        """
+Odoo Live Support
+=================
+
+Ask your functionnal question directly to the Odoo Operators with the livechat support.
+
+        """,
+    'data': [
+        "views/im_odoo_support.xml"
+    ],
+    'depends' : ["web", "im_chat"],
+    'qweb': [
+        'static/src/xml/im_odoo_support.xml'
+    ],
+    'installable': True,
+    'auto_install': True,
+    'application': True,
+}
diff --git a/addons/im_odoo_support/static/img/odoo_o_small.png b/addons/im_odoo_support/static/img/odoo_o_small.png
new file mode 100644
index 0000000000000000000000000000000000000000..6973242afa6d1cee00304f33e97ffd082c79883a
GIT binary patch
literal 4433
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
XqvGokm%!`@00000NkvXXu0mjf!j`s7

literal 0
HcmV?d00001

diff --git a/addons/im_odoo_support/static/src/js/im_odoo_support.js b/addons/im_odoo_support/static/src/js/im_odoo_support.js
new file mode 100644
index 000000000000..1a6cf4b51e8d
--- /dev/null
+++ b/addons/im_odoo_support/static/src/js/im_odoo_support.js
@@ -0,0 +1,134 @@
+(function(){
+
+    "use strict";
+
+    var _t = openerp._t;
+    openerp.im_odoo_support = {};
+    var COOKIE_NAME = 'livechat_conversation';
+    var SERVICE_URL = 'https://services.odoo.com/';
+
+    openerp.im_odoo_support.OdooSupport = openerp.Widget.extend({
+        init: function(login, uuid, params, options){
+            var self = this;
+            this._super();
+            this.login = login;
+            this.uuid = uuid;
+
+            this.options = _.extend(options || {}, {'defaultUsername' : login});
+            this.params = _.extend(params || {}, {'database_uuid' : uuid});
+
+            this.assets_loaded = false;
+            this.session = false;
+            // bind event
+            $(window).on("odoo_support_ready_to_bind", this, _.bind(this.bind_actions, this));
+        },
+        bind_actions: function(event, button){
+            if(button === 'usermenu'){
+                openerp.client.$('.oe_user_menu_placeholder .odoo_support_contact').on('click', this, _.bind(this.click_action, this));
+                // check auto start if cookie
+                var session = openerp.get_cookie(COOKIE_NAME);
+                if(session){
+                    this.start_support();
+                }
+            }
+            if(button === 'im_contact'){
+                if(openerp.im_chat && openerp.im_chat.single){
+                    openerp.im_chat.single.$('.odoo_support_contact').on('click',this, _.bind(this.click_action, this));
+                }
+            }
+        },
+        click_action: function(){
+            var session = openerp.get_cookie(COOKIE_NAME);
+            if(!session){
+                this.start_support();
+            }
+        },
+        start_support: function(){
+            var self = this;
+            if(!this.assets_loaded){
+                this.load_assets().then(function(){
+                    try{
+                        odoo_support.im_livechat.support = new odoo_support.im_livechat.LiveSupport(self.options, self.params);
+                        // bind event change status
+                        odoo_support.im_livechat.support.on('im_odoo_support_status', this, function(is_online){
+                            if(openerp.im_chat && openerp.im_chat.single){
+                                openerp.im_chat.single.support_user.$(".oe_im_user_online").toggle(is_online);
+                            }
+                        });
+                    }catch(e){
+                        self.error_on_start(e);
+                    }
+                }).fail(function(e){
+                   self.error_on_start(e);
+                });
+            }else{
+                odoo_support.im_livechat.support.start();
+            }
+        },
+        error_on_start: function(e){
+            self.assets_loaded = false;
+            openerp.client.do_warn(_t("Error"), _t("The connection with the Odoo Support Server failed. Please retry in a few minutes, or send an email to support@odoo.com ."));
+        },
+        load_assets: function(){
+            var self = this;
+            var add_asset = function(file_url, type) {
+                var def = $.Deferred();
+                if(type === 'js'){
+                    $.getScript( file_url, function( data, textStatus, jqxhr ) {
+                        def.resolve();
+                    }).fail(function(){
+                        def.reject();
+                    });
+                    return def;
+                }else{
+                    $('<link rel="stylesheet" href="' + file_url + '"></link>').appendTo($("head")).ready(function() {
+                        def.resolve();
+                    });
+                    return def;
+                }
+            };
+            var defs = [];
+            defs.push(add_asset(SERVICE_URL+"odoo-livechat/assets/js", 'js'));
+            defs.push(add_asset(SERVICE_URL+"odoo-livechat/assets/css", 'css'));
+            return $.when.apply($, defs).then(function(res){
+                self.assets_loaded = true;
+                return res;
+            }, function(){
+                self.error_on_start();
+            });
+        },
+    });
+
+    // display support contact button (in chat user list, if installed) and in dropdown user menu.
+    if(openerp.im_chat){
+        openerp.im_chat.InstantMessaging.include({
+            start: function(){
+                this._super.apply(this, arguments);
+                var user = {
+                    "id" : -1,
+                    "name": _t('Odoo Support'),
+                    "im_status": 'online',
+                    "image_url": "/im_odoo_support/static/img/odoo_o_small.png"
+                };
+                var widget = new openerp.im_chat.UserWidget(self, user);
+                widget.prependTo(self.$(".oe_im_users"));
+                widget.$el.addClass('odoo_support_contact');
+                this.support_user = widget;
+
+                $(window).trigger('odoo_support_ready_to_bind','im_contact');
+            },
+            search_users_status: function(e){
+                var self = this;
+                this._super.apply(this, arguments).then(function(res){
+                    if(self.$('.oe_im_searchbox').val().length === 0 || _t("Odoo Support").toLowerCase().indexOf(self.$('.oe_im_searchbox').val().toLowerCase()) != -1){
+                        self.support_user.$el.show();
+                    }else{
+                        self.support_user.$el.hide();
+                    }
+                    return res;
+                });
+            }
+        });
+    }
+
+})();
diff --git a/addons/im_odoo_support/static/src/xml/im_odoo_support.xml b/addons/im_odoo_support/static/src/xml/im_odoo_support.xml
new file mode 100644
index 000000000000..f7154797c37b
--- /dev/null
+++ b/addons/im_odoo_support/static/src/xml/im_odoo_support.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates xml:space="preserve">
+    <t t-extend="UserMenu">
+        <t t-jquery=".dropdown-menu li:eq(3)" t-operation="after">
+            <li class="odoo_support_contact">
+                <a data-menu="odoo_support" href="#">Odoo Support</a>
+            </li>
+        </t>
+    </t>
+</templates>
diff --git a/addons/im_odoo_support/views/im_odoo_support.xml b/addons/im_odoo_support/views/im_odoo_support.xml
new file mode 100644
index 000000000000..e8e5ecf77f46
--- /dev/null
+++ b/addons/im_odoo_support/views/im_odoo_support.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+        <template id="assets_backend" name="im_odoo_support assets" inherit_id="web.assets_backend">
+            <xpath expr="." position="inside">
+               <script type="text/javascript" src="/im_odoo_support/static/src/js/im_odoo_support.js"></script>
+                <script type="text/javascript">
+                    (function() {
+                        openerp.im_odoo_support.support = new openerp.im_odoo_support.OdooSupport(
+                            "<t t-esc="request.session.login"/>",
+                            "<t t-esc="request.registry['ir.config_parameter'].get_param(request.cr, request.uid, 'database.uuid')"/>"
+                        );
+                    })();
+                </script>
+            </xpath>
+        </template>
+
+    </data>
+</openerp>
-- 
GitLab