diff --git a/addons/web_linkedin/static/src/js/linkedin.js b/addons/web_linkedin/static/src/js/linkedin.js index f39177d04c7..af5fd5fb6e4 100644 --- a/addons/web_linkedin/static/src/js/linkedin.js +++ b/addons/web_linkedin/static/src/js/linkedin.js @@ -193,15 +193,15 @@ openerp.web_linkedin = function(instance) { create_or_modify_company: function (entity) { var self = this; var to_change = {}; - var defs = []; + var image_def = null; to_change.is_company = true; to_change.name = entity.name; to_change.image = false; if (entity.logoUrl) { - defs.push(self.rpc('/web_linkedin/binary/url2binary', + image_def = self.rpc('/web_linkedin/binary/url2binary', {'url': entity.logoUrl}).then(function(data){ to_change.image = data; - })); + }); } to_change.website = entity.websiteUrl; to_change.phone = false; @@ -218,45 +218,48 @@ openerp.web_linkedin = function(instance) { to_change.child_ids = []; var children_def = $.Deferred(); - defs.push(children_def); IN.API.PeopleSearch().fields(commonPeopleFields).params({ "company-name" : entity.universalName, "current-company": true, "count": 50, }).result(function (result) { console.debug("Linkedin pepople in this company found :", result.numResults, "=>", result.people._count, result.people.values); - result = _.reject(result.people.values || [], function(el) { + var result = _.reject(result.people.values || [], function(el) { return ! el.formattedName; }); - var defs = []; - _.each(result, function (el) { - el.__type = "people"; - el.__company = entity.universalName; - el.parent_id = self.field_manager.datarecord.id || false; - defs.push(self.create_or_modify_partner(el, true).then(function (data) { + self.create_or_modify_company_partner(result).then(function (childs_to_change) { + _.each(childs_to_change, function (data) { // [0,0,data] if it's a new partner to_change.child_ids.push( data.id ? [1, data.id, data] : [0, 0, data] ); - })); - }); - $.when.apply($, defs).then(function () { + }); children_def.resolve(); }); }).error(function () { children_def.reject(); }); - return $.when.apply($, defs).then(function () { + return $.when(image_def, children_def).then(function () { return to_change; }); }, create_or_modify_partner: function (entity, rpc_search_similar_partner) { var self = this; + return this.create_or_modify_partner_change(entity).then(function (to_change) { + // find similar partners + _.each(to_change, function (val, key) { + if (self.field_manager.datarecord[key]) { + to_change[key] = self.field_manager.datarecord[key]; + } + }); + }); + }, + create_or_modify_partner_change: function (entity) { var to_change = {}; var defs = []; to_change.is_company = false; to_change.name = entity.formattedName; if (entity.pictureUrl) { - defs.push(self.rpc('/web_linkedin/binary/url2binary', + defs.push(this.rpc('/web_linkedin/binary/url2binary', {'url': entity.pictureUrl}).then(function(data){ to_change.image = data; })); @@ -273,7 +276,7 @@ openerp.web_linkedin = function(instance) { var position = positions[key]; if (position.isCurrent) { var company_name = position.company ? position.company.name : false; - if (!entity.parent_id && company_name) { + if (!entity.parent_id && entity.parent_id !== 0 && company_name) { defs.push(new instance.web.DataSetSearch(this, 'res.partner').call("search", [[["name", "=", company_name]]]).then(function (data) { if(data[0]) to_change.parent_id = data[0]; else position.title = position.title + ' (' + company_name + ') '; @@ -292,49 +295,40 @@ openerp.web_linkedin = function(instance) { to_change.linkedin_url = to_change.linkedin_public_url = entity.publicProfileUrl || false; to_change.linkedin_id = entity.id || false; - // find similar partners - if (rpc_search_similar_partner) { - defs.push(new instance.web.DataSetSearch(this, 'res.partner').call("search", [[ - "|", ["linkedin_id", "=", to_change.linkedin_id], "&", ["linkedin_id", "=", false], - "|", ["name", "ilike", entity.firstName +"%"+ entity.lastName], ["name", "ilike", entity.lastName +"%"+ entity.firstName] - ]]).then(function (data) { - to_change.id = data[0] || false; - if (to_change.id) { - // remove data if allready set - defs.push(new instance.web.DataSetSearch(this, 'res.partner').call("read", [[to_change.id], [ - "image", - "mobile", - "phone", - "parent_id", - "name", - "email", - "function", - "linkedin_id", - ]]).then(function (partners) { - if (partners[0].linkedin_id && partners[0].linkedin_id != to_change.linkedin_id) { - delete to_change.id; - } else { - _.each(partners[0], function (val, key) { - if (val) { - to_change[key] = typeof val == "object" && key.match(/_id$/) ? val[0] : val; - } - }); - } - })); - } - })); - } else { - _.each(to_change, function (val, key) { - if (self.field_manager.datarecord[key]) { - to_change[key] = self.field_manager.datarecord[key]; - } - }); - } - return $.when.apply($, defs).then(function () { return to_change; }); }, + create_or_modify_company_partner: function (entities) { + var self = this; + var deferrer = $.Deferred(); + var defs = []; + var childs_to_change = []; + + _.each(entities, function (entity, key) { + var entity = _.extend(entity, { + '__type': "people", + '__company': entity.universalName, + 'parent_id': self.field_manager.datarecord.id || 0 + }); + defs.push(self.create_or_modify_partner_change(entity).then(function (to_change) { + childs_to_change[key] = to_change; + })); + }); + $.when.apply($, defs).then(function () { + new instance.web.DataSetSearch(this, 'res.partner').call("linkedin_check_similar_partner", [entities]).then(function (partners) { + _.each(partners, function (partner, i) { + _.each(partner, function (val, key) { + if (val) { + childs_to_change[i][key] = val; + } + }); + }); + deferrer.resolve(childs_to_change); + }); + }); + return deferrer; + } }); instance.web.form.widgets.add('linkedin', 'instance.web_linkedin.Linkedin'); diff --git a/addons/web_linkedin/web_linkedin.py b/addons/web_linkedin/web_linkedin.py index 176b0cdfe20..92adb30d3dd 100644 --- a/addons/web_linkedin/web_linkedin.py +++ b/addons/web_linkedin/web_linkedin.py @@ -65,6 +65,27 @@ class web_linkedin_fields(osv.Model): res[partner.id] = partner.linkedin_url return res + def linkedin_check_similar_partner(self, cr, uid, linkedin_datas, context=None): + res = [] + res_partner = self.pool.get('res.partner') + for linkedin_data in linkedin_datas: + partner_ids = res_partner.search(cr, uid, ["|", ("linkedin_id", "=", linkedin_data['id']), + "&", ("linkedin_id", "=", False), + "|", ("name", "ilike", linkedin_data['firstName'] + "%" + linkedin_data['lastName']), ("name", "ilike", linkedin_data['lastName'] + "%" + linkedin_data['firstName'])], context=context) + if partner_ids: + partner = res_partner.read(cr, uid, partner_ids[0], ["image", "mobile", "phone", "parent_id", "name", "email", "function", "linkedin_id"], context=context) + if partner['linkedin_id'] and partner['linkedin_id'] != linkedin_data['id']: + partner.pop('id') + if partner['parent_id']: + partner['parent_id'] = partner['parent_id'][0] + for key, val in partner.items(): + if not val: + partner.pop(key) + res.append(partner) + else: + res.append({}) + return res + _columns = { 'linkedin_id': fields.char(string="LinkedIn ID", size=50), 'linkedin_url': fields.char(string="LinkedIn url", size=100, store=True),