summaryrefslogtreecommitdiff
path: root/addons/mail/static/src
diff options
context:
space:
mode:
authorGéry Debongnie <ged@odoo.com>2017-03-05 09:34:56 +0100
committerAaron Bohy <aab@odoo.com>2017-04-11 19:44:38 +0200
commite5740270568404d71a3bc093074a085c9c2eded8 (patch)
tree7b84740d92c550236de25a37cf37d244760bdbf3 /addons/mail/static/src
parent0df9968433389e0d504276cd711473c2eef937ae (diff)
[REF] web,*: remove 'web.model' and 'web.dataModel
Use this.rpc instead of Model object, with web.ajax if necessary. nb: EventDispatcherMixin include now the custom_events managment instead of widget
Diffstat (limited to 'addons/mail/static/src')
-rw-r--r--addons/mail/static/src/js/activity.js13
-rw-r--r--addons/mail/static/src/js/chat_manager.js401
-rw-r--r--addons/mail/static/src/js/chatter.js37
-rw-r--r--addons/mail/static/src/js/chatter_composer.js8
-rw-r--r--addons/mail/static/src/js/client_action.js31
-rw-r--r--addons/mail/static/src/js/composer.js18
-rw-r--r--addons/mail/static/src/js/followers.js14
7 files changed, 306 insertions, 216 deletions
diff --git a/addons/mail/static/src/js/activity.js b/addons/mail/static/src/js/activity.js
index 9c81966929a..d1afae2e675 100644
--- a/addons/mail/static/src/js/activity.js
+++ b/addons/mail/static/src/js/activity.js
@@ -52,14 +52,18 @@ var AbstractActivityField = AbstractField.extend({
// private
_markActivityDone: function (id) {
- return this.performModelRPC('mail.activity', 'action_done', [[id]]);
+ return this.rpc('mail.activity', 'action_done')
+ .args([[id]])
+ .exec();
},
_readActivities: function () {
var self = this;
var missing_ids = _.difference(this.value.res_ids, _.pluck(this.activities, 'id'));
var fetch_def;
if (missing_ids.length) {
- fetch_def = this.performModelRPC('mail.activity', 'read', [missing_ids]);
+ fetch_def = this.rpc('mail.activity', 'read')
+ .args([missing_ids])
+ .exec();
}
return $.when(fetch_def).then(function (results) {
// filter out activities that are no longer linked to this record
@@ -164,8 +168,9 @@ var Activity = AbstractActivityField.extend({
_onUnlinkActivity: function (event) {
event.preventDefault();
var activity_id = $(event.currentTarget).data('activity-id');
- return this
- .performModelRPC('mail.activity', 'unlink', [[activity_id]])
+ return this.rpc('mail.activity', 'unlink')
+ .args([[activity_id]])
+ .exec()
.then(this._reload.bind(this, {activity: true}));
},
_onMarkActivityDone: function (event) {
diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js
index 86438de1c9b..709ff965df9 100644
--- a/addons/mail/static/src/js/chat_manager.js
+++ b/addons/mail/static/src/js/chat_manager.js
@@ -7,10 +7,11 @@ var config = require('web.config');
var Bus = require('web.Bus');
var core = require('web.core');
var data = require('web.data');
-var Model = require('web.Model');
var session = require('web.session');
var time = require('web.time');
var web_client = require('web.web_client');
+var Class = require('web.Class');
+var Mixins = require('web.mixins');
var _t = core._t;
var _lt = core._lt;
@@ -18,11 +19,6 @@ var LIMIT = 25;
var preview_msg_max_size = 350; // optimal for native english speakers
var ODOOBOT_ID = "ODOOBOT";
-var MessageModel = new Model('mail.message', session.user_context);
-var ChannelModel = new Model('mail.channel', session.user_context);
-var UserModel = new Model('res.users', session.user_context);
-var PartnerModel = new Model('res.partner', session.user_context);
-
// Private model
//----------------------------------------------------------------------------------
var messages = [];
@@ -367,62 +363,6 @@ function remove_message_from_channel (channel_id, message) {
});
}
-// options: domain, load_more
-function fetch_from_channel (channel, options) {
- options = options || {};
- var domain =
- (channel.id === "channel_inbox") ? [['needaction', '=', true]] :
- (channel.id === "channel_starred") ? [['starred', '=', true]] :
- [['channel_ids', 'in', channel.id]];
- var cache = get_channel_cache(channel, options.domain);
-
- if (options.domain) {
- domain = new data.CompoundDomain(domain, options.domain || []);
- }
- if (options.load_more) {
- var min_message_id = cache.messages[0].id;
- domain = new data.CompoundDomain([['id', '<', min_message_id]], domain);
- }
-
- return MessageModel.call('message_fetch', [domain], {limit: LIMIT, context: session.user_context}).then(function (msgs) {
- if (!cache.all_history_loaded) {
- cache.all_history_loaded = msgs.length < LIMIT;
- }
- cache.loaded = true;
-
- _.each(msgs, function (msg) {
- add_message(msg, {channel_id: channel.id, silent: true, domain: options.domain});
- });
- var channel_cache = get_channel_cache(channel, options.domain || []);
- return channel_cache.messages;
- });
-}
-
-// options: force_fetch
-function fetch_document_messages (ids, options) {
- var loaded_msgs = _.filter(messages, function (message) {
- return _.contains(ids, message.id);
- });
- var loaded_msg_ids = _.pluck(loaded_msgs, 'id');
-
- options = options || {};
- if (options.force_fetch || _.difference(ids.slice(0, LIMIT), loaded_msg_ids).length) {
- var ids_to_load = _.difference(ids, loaded_msg_ids).slice(0, LIMIT);
-
- return MessageModel.call('message_format', [ids_to_load], {context: session.user_context}).then(function (msgs) {
- var processed_msgs = [];
- _.each(msgs, function (msg) {
- processed_msgs.push(add_message(msg, {silent: true}));
- });
- return _.sortBy(loaded_msgs.concat(processed_msgs), function (msg) {
- return msg.id;
- });
- });
- } else {
- return $.when(loaded_msgs);
- }
-}
-
function update_channel_unread_counter (channel, counter) {
if (channel.unread_counter > 0 && counter === 0) {
unread_conversation_counter = Math.max(0, unread_conversation_counter-1);
@@ -436,10 +376,6 @@ function update_channel_unread_counter (channel, counter) {
chat_manager.bus.trigger("update_channel_unread_counter", channel);
}
-var channel_seen = _.throttle(function (channel) {
- return ChannelModel.call('channel_seen', [[channel.id]], {}, {shadow: true});
-}, 3000);
-
// Notification handlers
// ---------------------------------------------------------------------------------
function on_notification (notifications) {
@@ -657,12 +593,137 @@ function on_transient_message_notification (data) {
// Public interface
//----------------------------------------------------------------------------------
-var chat_manager = {
+var ChatManager = Class.extend(Mixins.EventDispatcherMixin, Mixins.ServicesMixin, {
// these two functions are exposed for extensibility purposes and shouldn't be called by other modules
make_message: make_message,
make_channel: make_channel,
+ init: function (parent) {
+ var self = this;
+ Mixins.EventDispatcherMixin.init.call(this);
+ this.setParent(parent);
+
+ this.bus = new Bus();
+ this.bus.on('client_action_open', null, function (open) {
+ client_action_open = open;
+ });
+
+ bus.on('notification', null, on_notification);
+
+ this.channel_seen = _.throttle(function (channel) {
+ return self.rpc('mail.channel', 'channel_seen')
+ .args([[channel.id]])
+ .exec({shadow: true});
+ }, 3000);
+ },
+
+ start: function () {
+ this.is_ready = session.is_bound.then(function(){
+ return session.rpc('/mail/client_action');
+ }).then(this._onMailClientAction.bind(this));
+
+ add_channel({
+ id: "channel_inbox",
+ name: _lt("Inbox"),
+ type: "static",
+ }, { display_needactions: true });
+
+ add_channel({
+ id: "channel_starred",
+ name: _lt("Starred"),
+ type: "static"
+ });
+ },
+
+ _onMailClientAction: function (result) {
+ _.each(result.channel_slots, function (channels) {
+ _.each(channels, add_channel);
+ });
+ needaction_counter = result.needaction_inbox_counter;
+ starred_counter = result.starred_counter;
+ commands = _.map(result.commands, function (command) {
+ return _.extend({ id: command.name }, command);
+ });
+ mention_partner_suggestions = result.mention_partner_suggestions;
+ discuss_menu_id = result.menu_id;
+
+ // Shortcodes: canned responses and emojis
+ _.each(result.shortcodes, function (s) {
+ if (s.shortcode_type === 'text') {
+ canned_responses.push(_.pick(s, ['id', 'source', 'substitution']));
+ } else {
+ emojis.push(_.pick(s, ['id', 'source', 'substitution', 'description']));
+ emoji_substitutions[_.escape(s.source)] = s.substitution;
+ }
+ });
+ bus.start_polling();
+ },
+
+ // options: domain, load_more
+ _fetchFromChannel: function (channel, options) {
+ options = options || {};
+ var domain =
+ (channel.id === "channel_inbox") ? [['needaction', '=', true]] :
+ (channel.id === "channel_starred") ? [['starred', '=', true]] :
+ [['channel_ids', 'in', channel.id]];
+ var cache = get_channel_cache(channel, options.domain);
+
+ if (options.domain) {
+ domain = new data.CompoundDomain(domain, options.domain || []).eval();
+ }
+ if (options.load_more) {
+ var min_message_id = cache.messages[0].id;
+ domain = new data.CompoundDomain([['id', '<', min_message_id]], domain).eval();
+ }
+
+ return this.rpc('mail.message', 'message_fetch')
+ .args([domain])
+ .kwargs({limit: LIMIT, context: session.user_context})
+ .exec()
+ .then(function (msgs) {
+ if (!cache.all_history_loaded) {
+ cache.all_history_loaded = msgs.length < LIMIT;
+ }
+ cache.loaded = true;
+
+ _.each(msgs, function (msg) {
+ add_message(msg, {channel_id: channel.id, silent: true, domain: options.domain});
+ });
+ var channel_cache = get_channel_cache(channel, options.domain || []);
+ return channel_cache.messages;
+ });
+ },
+ // options: force_fetch
+ _fetchDocumentMessages : function (ids, options) {
+ var loaded_msgs = _.filter(messages, function (message) {
+ return _.contains(ids, message.id);
+ });
+ var loaded_msg_ids = _.pluck(loaded_msgs, 'id');
+
+ options = options || {};
+ if (options.force_fetch || _.difference(ids.slice(0, LIMIT), loaded_msg_ids).length) {
+ var ids_to_load = _.difference(ids, loaded_msg_ids).slice(0, LIMIT);
+
+ return this.rpc('mail.message', 'message_format')
+ .args([ids_to_load])
+ .kwargs({context: session.user_context})
+ .exec()
+ .then(function (msgs) {
+ var processed_msgs = [];
+ _.each(msgs, function (msg) {
+ processed_msgs.push(add_message(msg, {silent: true}));
+ });
+ return _.sortBy(loaded_msgs.concat(processed_msgs), function (msg) {
+ return msg.id;
+ });
+ });
+ } else {
+ return $.when(loaded_msgs);
+ }
+ },
+
post_message: function (data, options) {
+ var self = this;
options = options || {};
// This message will be received from the mail composer as html content subtype
@@ -682,12 +743,15 @@ var chat_manager = {
}
if ('channel_id' in options) {
// post a message in a channel or execute a command
- return ChannelModel.call(data.command ? 'execute_command' : 'message_post', [options.channel_id], _.extend(msg, {
- message_type: 'comment',
- content_subtype: 'html',
- subtype: 'mail.mt_comment',
- command: data.command,
- }));
+ return this.rpc('mail.channel', data.command ? 'execute_command' : 'message_post')
+ .args([options.channel_id])
+ .kwargs(_.extend(msg, {
+ message_type: 'comment',
+ content_subtype: 'html',
+ subtype: 'mail.mt_comment',
+ command: data.command,
+ }))
+ .exec();
}
if ('model' in options && 'res_id' in options) {
// post a message in a chatter
@@ -699,14 +763,20 @@ var chat_manager = {
subtype_id: data.subtype_id,
});
- var model = new Model(options.model);
- return model.call('message_post', [options.res_id], msg).then(function (msg_id) {
- return MessageModel.call('message_format', [msg_id]).then(function (msgs) {
- msgs[0].model = options.model;
- msgs[0].res_id = options.res_id;
- add_message(msgs[0]);
+ return this.rpc(options.model, 'message_post')
+ .args([options.res_id])
+ .kwargs(msg)
+ .exec()
+ .then(function (msg_id) {
+ return self.rpc('mail.message', 'message_format')
+ .args([msg_id])
+ .exec()
+ .then(function (msgs) {
+ msgs[0].model = options.model;
+ msgs[0].res_id = options.res_id;
+ add_message(msgs[0]);
+ });
});
- });
}
},
@@ -719,7 +789,7 @@ var chat_manager = {
if ('channel_id' in options && options.load_more) {
// get channel messages, force load_more
channel = this.get_channel(options.channel_id);
- return fetch_from_channel(channel, {domain: options.domain || {}, load_more: true});
+ return this._fetchFromChannel(channel, {domain: options.domain || {}, load_more: true});
}
if ('channel_id' in options) {
// channel message, check in cache first
@@ -728,12 +798,12 @@ var chat_manager = {
if (channel_cache.loaded) {
return $.when(channel_cache.messages);
} else {
- return fetch_from_channel(channel, {domain: options.domain});
+ return this._fetchFromChannel(channel, {domain: options.domain});
}
}
if ('ids' in options) {
// get messages from their ids (chatter is the main use case)
- return fetch_document_messages(options.ids, options).then(function(result) {
+ return this._fetchDocumentMessages(options.ids, options).then(function(result) {
chat_manager.mark_as_read(options.ids);
return result;
});
@@ -742,16 +812,24 @@ var chat_manager = {
// get messages for a chatter, when it doesn't know the ids (use
// case is when using the full composer)
var domain = [['model', '=', options.model], ['res_id', '=', options.res_id]];
- MessageModel.call('message_fetch', [domain], {limit: 30}).then(function (msgs) {
- return _.map(msgs, add_message);
- });
+ this.rpc('mail.message', 'message_fetch')
+ .args([domain])
+ .kwargs({limit: 30})
+ .exec()
+ .then(function (msgs) {
+ return _.map(msgs, add_message);
+ });
}
},
toggle_star_status: function (message_id) {
- return MessageModel.call('toggle_message_starred', [[message_id]]);
+ return this.rpc('mail.message', 'toggle_message_starred')
+ .args([[message_id]])
+ .exec();
},
unstar_all: function () {
- return MessageModel.call('unstar_all', [[]], {});
+ return this.rpc('mail.message', 'unstar_all')
+ .args([[]])
+ .exec();
},
mark_as_read: function (message_ids) {
var ids = _.filter(message_ids, function (id) {
@@ -760,24 +838,30 @@ var chat_manager = {
return !message || message.is_needaction;
});
if (ids.length) {
- return MessageModel.call('set_message_done', [ids]);
+ return this.rpc('mail.message', 'set_message_done')
+ .args([ids])
+ .exec();
} else {
return $.when();
}
},
mark_all_as_read: function (channel, domain) {
if ((channel.id === "channel_inbox" && needaction_counter) || (channel && channel.needaction_counter)) {
- return MessageModel.call('mark_all_as_read', [], {channel_ids: channel.id !== "channel_inbox" ? [channel.id] : [], domain: domain});
+ return this.rpc('mail.message', 'mark_all_as_read')
+ .kwargs({channel_ids: channel.id !== "channel_inbox" ? [channel.id] : [], domain: domain})
+ .exec();
}
return $.when();
},
undo_mark_as_read: function (message_ids, channel) {
- return MessageModel.call('mark_as_unread', [message_ids, [channel.id]]);
+ return this.rpc('mail.message', 'mark_as_unread')
+ .args([message_ids, [channel.id]])
+ .exec();
},
mark_channel_as_seen: function (channel) {
if (channel.unread_counter > 0 && channel.type !== 'static') {
update_channel_unread_counter(channel, 0);
- channel_seen(channel);
+ this.channel_seen(channel);
}
},
@@ -802,8 +886,9 @@ var chat_manager = {
return mention_partner_suggestions;
}
if (!channel.members_deferred) {
- channel.members_deferred = ChannelModel
- .call("channel_fetch_listeners", [channel.uuid], {}, {shadow: true})
+ channel.members_deferred = this.rpc('mail.channel', "channel_fetch_listeners")
+ .args([channel.uuid])
+ .exec({shadow: true})
.then(function (members) {
var suggestions = [];
_.each(mention_partner_suggestions, function (partners) {
@@ -864,21 +949,23 @@ var chat_manager = {
},
detach_channel: function (channel) {
- return ChannelModel.call("channel_minimize", [channel.uuid, true], {}, {shadow: true});
+ return this.rpc('mail.channel', "channel_minimize")
+ .args([channel.uuid, true])
+ .exec({shadow: true});
},
remove_chatter_messages: function (model) {
messages = _.reject(messages, function (message) {
return message.channel_ids.length === 0 && message.model === model;
});
},
- bus: new Bus(),
create_channel: function (name, type) {
var method = type === "dm" ? "channel_get" : "channel_create";
var args = type === "dm" ? [[name]] : [name, type];
- return ChannelModel
- .call(method, args)
+ return this.rpc('mail.channel', method)
+ .args(args)
+ .exec()
.then(add_channel);
},
join_channel: function (channel_id, options) {
@@ -891,8 +978,9 @@ var chat_manager = {
// channel already joined
channel_defs[channel_id] = $.when(channel);
} else {
- channel_defs[channel_id] = ChannelModel
- .call('channel_join_and_get_info', [[channel_id]])
+ channel_defs[channel_id] = this.rpc('mail.channel', 'channel_join_and_get_info')
+ .args([[channel_id]])
+ .exec()
.then(function (result) {
return add_channel(result, options);
});
@@ -900,7 +988,10 @@ var chat_manager = {
return channel_defs[channel_id];
},
open_and_detach_dm: function (partner_id) {
- return ChannelModel.call('channel_get_and_minimize', [[partner_id]]).then(add_channel);
+ return this.rpc('mail.channel', 'channel_get_and_minimize')
+ .args([[partner_id]])
+ .exec()
+ .then(add_channel);
},
open_channel: function (channel) {
chat_manager.bus.trigger(client_action_open ? 'open_channel' : 'detach_channel', channel);
@@ -908,14 +999,20 @@ var chat_manager = {
unsubscribe: function (channel) {
if (_.contains(['public', 'private'], channel.type)) {
- return ChannelModel.call('action_unfollow', [[channel.id]]);
+ return this.rpc('mail.channel', 'action_unfollow')
+ .args([[channel.id]])
+ .exec();
} else {
- return ChannelModel.call('channel_pin', [channel.uuid, false]);
+ return this.rpc('mail.channel', 'channel_pin')
+ .args([channel.uuid, false])
+ .exec();
}
},
close_chat_session: function (channel_id) {
var channel = this.get_channel(channel_id);
- ChannelModel.call("channel_fold", [], {uuid : channel.uuid, state : "closed"}, {shadow: true});
+ this.rpc('mail.channel', "channel_fold")
+ .kwargs({uuid : channel.uuid, state : "closed"})
+ .exec({shadow: true});
},
fold_channel: function (channel_id, folded) {
var args = {
@@ -924,7 +1021,9 @@ var chat_manager = {
if (_.isBoolean(folded)) {
args.state = folded ? 'folded' : 'open';
}
- return ChannelModel.call("channel_fold", [], args, {shadow: true});
+ return this.rpc('mail.channel', "channel_fold")
+ .kwargs(args)
+ .exec({shadow: true});
},
/**
* Special redirection handling for given model and id
@@ -947,17 +1046,23 @@ var chat_manager = {
};
if (res_model === "res.partner") {
var domain = [["partner_id", "=", res_id]];
- UserModel.call("search", [domain]).then(function (user_ids) {
- if (user_ids.length && user_ids[0] !== session.uid && dm_redirection_callback) {
- self.create_channel(res_id, 'dm').then(dm_redirection_callback);
- } else {
- redirect_to_document(res_model, res_id);
- }
- });
+ this.rpc('res.users', "search")
+ .args([domain])
+ .exec()
+ .then(function (user_ids) {
+ if (user_ids.length && user_ids[0] !== session.uid && dm_redirection_callback) {
+ self.create_channel(res_id, 'dm').then(dm_redirection_callback);
+ } else {
+ redirect_to_document(res_model, res_id);
+ }
+ });
} else {
- new Model(res_model).call('get_formview_id', [[res_id], session.user_context]).then(function (view_id) {
- redirect_to_document(res_model, res_id, view_id);
- });
+ this.rpc(res_model, 'get_formview_id')
+ .args([[res_id], session.user_context])
+ .exec()
+ .then(function (view_id) {
+ redirect_to_document(res_model, res_id, view_id);
+ });
}
},
@@ -978,7 +1083,9 @@ var chat_manager = {
if (!channels_preview_def) {
if (missing_channels.length) {
var missing_channel_ids = _.pluck(missing_channels, 'id');
- channels_preview_def = ChannelModel.call('channel_fetch_preview', [missing_channel_ids], {}, {shadow: true});
+ channels_preview_def = this.rpc('mail.channel', 'channel_fetch_preview')
+ .args([missing_channel_ids])
+ .exec({shadow: true});
} else {
channels_preview_def = $.when();
}
@@ -1013,7 +1120,9 @@ var chat_manager = {
});
if (!values.length) {
// extend the research to all users
- def = PartnerModel.call('im_search', [search_val, limit || 20], {}, {shadow: true});
+ def = this.rpc('res.partner', 'im_search')
+ .args([search_val, limit || 20])
+ .exec({shadow: true});
} else {
def = $.when(values);
}
@@ -1024,58 +1133,16 @@ var chat_manager = {
return _.sortBy(autocomplete_data, 'label');
});
},
-};
-
-chat_manager.bus.on('client_action_open', null, function (open) {
- client_action_open = open;
});
-// Initialization
-// ---------------------------------------------------------------------------------
-function init () {
- add_channel({
- id: "channel_inbox",
- name: _lt("Inbox"),
- type: "static",
- }, { display_needactions: true });
-
- add_channel({
- id: "channel_starred",
- name: _lt("Starred"),
- type: "static"
- });
-
- bus.on('notification', null, on_notification);
-
- return session.is_bound.then(function(){
- return session.rpc('/mail/client_action');
- }).then(function (result) {
- _.each(result.channel_slots, function (channels) {
- _.each(channels, add_channel);
- });
- needaction_counter = result.needaction_inbox_counter;
- starred_counter = result.starred_counter;
- commands = _.map(result.commands, function (command) {
- return _.extend({ id: command.name }, command);
- });
- mention_partner_suggestions = result.mention_partner_suggestions;
- discuss_menu_id = result.menu_id;
-
- // Shortcodes: canned responses and emojis
- _.each(result.shortcodes, function (s) {
- if (s.shortcode_type === 'text') {
- canned_responses.push(_.pick(s, ['id', 'source', 'substitution']));
- } else {
- emojis.push(_.pick(s, ['id', 'source', 'substitution', 'description']));
- emoji_substitutions[_.escape(s.source)] = s.substitution;
- }
- });
-
- bus.start_polling();
- });
-}
-
-chat_manager.is_ready = init();
+var CallService = Class.extend(Mixins.EventDispatcherMixin, Mixins.ServiceProvider, {
+ init: function () {
+ Mixins.ServiceProvider.init.call(this);
+ Mixins.EventDispatcherMixin.init.call(this);
+ },
+});
+var chat_manager = new ChatManager(new CallService());
+chat_manager.start();
return chat_manager;
diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js
index 55b0766dd79..67f29ab1bbb 100644
--- a/addons/mail/static/src/js/chatter.js
+++ b/addons/mail/static/src/js/chatter.js
@@ -245,25 +245,28 @@ var Chatter = Widget.extend(chat_mixin, {
this.suggested_partners_def = $.Deferred();
var method = 'message_get_suggested_recipients';
var args = [[this.context.default_res_id], this.context];
- this.performModelRPC(this.record.model, method, args).then(function (result) {
- if (!self.suggested_partners_def) {
- return; // widget has been reset (e.g. we just switched to another record)
- }
- var suggested_partners = [];
- var thread_recipients = result[self.context.default_res_id];
- _.each(thread_recipients, function (recipient) {
- var parsed_email = utils.parse_email(recipient[1]);
- suggested_partners.push({
- checked: true,
- partner_id: recipient[0],
- full_name: recipient[1],
- name: parsed_email[0],
- email_address: parsed_email[1],
- reason: recipient[2],
+ this.rpc(this.record.model, method)
+ .args(args)
+ .exec()
+ .then(function (result) {
+ if (!self.suggested_partners_def) {
+ return; // widget has been reset (e.g. we just switched to another record)
+ }
+ var suggested_partners = [];
+ var thread_recipients = result[self.context.default_res_id];
+ _.each(thread_recipients, function (recipient) {
+ var parsed_email = utils.parse_email(recipient[1]);
+ suggested_partners.push({
+ checked: true,
+ partner_id: recipient[0],
+ full_name: recipient[1],
+ name: parsed_email[0],
+ email_address: parsed_email[1],
+ reason: recipient[2],
+ });
});
+ self.suggested_partners_def.resolve(suggested_partners);
});
- self.suggested_partners_def.resolve(suggested_partners);
- });
}
this.suggested_partners_def.then(function (suggested_partners) {
self._openComposer({ is_log: false, suggested_partners: suggested_partners });
diff --git a/addons/mail/static/src/js/chatter_composer.js b/addons/mail/static/src/js/chatter_composer.js
index e9bc075bf3b..4e7eb6a14ec 100644
--- a/addons/mail/static/src/js/chatter_composer.js
+++ b/addons/mail/static/src/js/chatter_composer.js
@@ -125,7 +125,9 @@ var ChatterComposer = composer.BasicComposer.extend({
var def;
if (names_to_find.length > 0) {
var args = [[this.context.default_res_id], names_to_find];
- def = this.performModelRPC(this.model, 'message_partner_info_from_emails', args);
+ def = this.rpc(this.model, 'message_partner_info_from_emails')
+ .args(args)
+ .exec();
}
// for unknown names + incomplete partners -> open popup - cancel = remove from recipients
@@ -171,7 +173,9 @@ var ChatterComposer = composer.BasicComposer.extend({
var def;
if (new_names_to_find.length > 0) {
var args = [[self.context.default_res_id], new_names_to_find, true];
- self.performModelRPC(self.model, 'message_partner_info_from_emails', args);
+ self.rpc(self.model, 'message_partner_info_from_emails')
+ .args(args)
+ .exec();
}
$.when(def).pipe(function (result) {
result = result || [];
diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js
index 1f2e5eb1de7..e461161c437 100644
--- a/addons/mail/static/src/js/client_action.js
+++ b/addons/mail/static/src/js/client_action.js
@@ -12,7 +12,6 @@ var core = require('web.core');
var data = require('web.data');
var Dialog = require('web.Dialog');
var dom = require('web.dom');
-var Model = require('web.Model');
var pyeval = require('web.pyeval');
var SearchView = require('web.SearchView');
@@ -70,8 +69,10 @@ var PartnerInviteDialog = Dialog.extend({
var self = this;
var data = this.$input.select2('data');
if(data.length >= 1){
- var ChannelModel = new Model('mail.channel');
- return ChannelModel.call('channel_invite', [this.channel_id], {partner_ids: _.pluck(data, 'id')})
+ return this.rpc('mail.channel', 'channel_invite')
+ .args([this.channel_id])
+ .kwargs({partner_ids: _.pluck(data, 'id')})
+ .exec()
.then(function(){
var names = _.escape(_.pluck(data, 'text').join(', '));
var notification = _.str.sprintf(_t('You added <b>%s</b> to the conversation.'), names);
@@ -380,18 +381,20 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
},
do_search_channel: function(search_val){
- var Channel = new Model("mail.channel");
- return Channel.call('channel_search_to_join', [search_val]).then(function(result){
- var values = [];
- _.each(result, function(channel){
- var escaped_name = _.escape(channel.name);
- values.push(_.extend(channel, {
- 'value': escaped_name,
- 'label': escaped_name,
- }));
+ return this.rpc('mail.channel', 'channel_search_to_join')
+ .args([search_val])
+ .exec()
+ .then(function(result){
+ var values = [];
+ _.each(result, function(channel){
+ var escaped_name = _.escape(channel.name);
+ values.push(_.extend(channel, {
+ 'value': escaped_name,
+ 'label': escaped_name,
+ }));
+ });
+ return values;
});
- return values;
- });
},
set_channel: function (channel) {
diff --git a/addons/mail/static/src/js/composer.js b/addons/mail/static/src/js/composer.js
index 4d471577922..b8a25cda7e3 100644
--- a/addons/mail/static/src/js/composer.js
+++ b/addons/mail/static/src/js/composer.js
@@ -7,7 +7,6 @@ var utils = require('mail.utils');
var core = require('web.core');
var data = require('web.data');
var dom = require('web.dom');
-var Model = require('web.Model');
var session = require('web.session');
var Widget = require('web.Widget');
@@ -417,9 +416,6 @@ var BasicComposer = Widget.extend(chat_mixin, {
// Emojis
this.emoji_container_classname = 'o_composer_emoji';
-
- this.PartnerModel = new Model('res.partner');
- this.ChannelModel = new Model('mail.channel');
},
start: function () {
@@ -665,18 +661,22 @@ var BasicComposer = Widget.extend(chat_mixin, {
// Mention
mention_fetch_throttled: function (model, method, kwargs) {
+ var self = this;
// Delays the execution of the RPC to prevent unnecessary RPCs when the user is still typing
var def = $.Deferred();
clearTimeout(this.mention_fetch_timer);
this.mention_fetch_timer = setTimeout(function () {
- return model.call(method, kwargs).then(function (results) {
- def.resolve(results);
- });
+ return self.rpc(model, method)
+ .kwargs(kwargs)
+ .exec()
+ .then(function (results) {
+ def.resolve(results);
+ });
}, 200);
return def;
},
mention_fetch_channels: function (search) {
- return this.mention_fetch_throttled(this.ChannelModel, 'get_mention_suggestions', {
+ return this.mention_fetch_throttled('mail.channel', 'get_mention_suggestions', {
limit: this.options.mention_fetch_limit,
search: search,
}).then(function (suggestions) {
@@ -706,7 +706,7 @@ var BasicComposer = Widget.extend(chat_mixin, {
});
if (!suggestions.length && !self.options.mention_partners_restricted) {
// no result found among prefetched partners, fetch other suggestions
- suggestions = self.mention_fetch_throttled(self.PartnerModel, 'get_mention_suggestions', {
+ suggestions = mention_fetch_throttled('res.partner', 'get_mention_suggestions', {
limit: limit,
search: search,
});
diff --git a/addons/mail/static/src/js/followers.js b/addons/mail/static/src/js/followers.js
index 9d71039c229..d56d5944d6b 100644
--- a/addons/mail/static/src/js/followers.js
+++ b/addons/mail/static/src/js/followers.js
@@ -219,7 +219,10 @@ var Followers = AbstractField.extend({
partner_ids: [this.partnerID],
context: {}, // new Context(this.build_context(), {}) // fixme
};
- this.performModelRPC(this.model, 'message_subscribe', [[this.res_id]], kwargs)
+ this.rpc(this.model, 'message_subscribe')
+ .args([[this.res_id]])
+ .kwargs(kwargs)
+ .exec()
.then(this._reload.bind(this));
},
/**
@@ -239,7 +242,9 @@ var Followers = AbstractField.extend({
ids.channel_ids,
{}, // new Context(self.build_context(), {}) // fixme
];
- self.performModelRPC(self.model, 'message_unsubscribe', args)
+ self.rpc(self.model, 'message_unsubscribe')
+ .args(args)
+ .exec()
.then(self._reload.bind(self));
def.resolve();
},
@@ -281,7 +286,10 @@ var Followers = AbstractField.extend({
var kwargs = _.extend({}, ids);
kwargs.subtype_ids = checklist;
kwargs.context = {}; // new Context(this.build_context(), {}); // fixme
- this.performModelRPC(this.model, 'message_subscribe', [[this.res_id]], kwargs)
+ this.rpc(this.model, 'message_subscribe')
+ .args([[this.res_id]])
+ .kwargs(kwargs)
+ .exec()
.then(this._reload.bind(this));
}
},