diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py
index 7afd9367e1b..a8145e302ef 100644
--- a/addons/crm/models/crm_lead.py
+++ b/addons/crm/models/crm_lead.py
@@ -1113,6 +1113,19 @@ class Lead(models.Model):
update_vals[key] = res.group(2).lower()
return super(Lead, self).message_update(msg_dict, update_vals=update_vals)
+ def _message_post_after_hook(self, message):
+ if self.email_from and not self.partner_id:
+ # we consider that posting a message with a specified recipient (not a follower, a specific one)
+ # on a document without customer means that it was created through the chatter using
+ # suggested recipients. This heuristic allows to avoid ugly hacks in JS.
+ new_partner = message.partner_ids.filtered(lambda partner: partner.email == self.email_from)
+ if new_partner:
+ self.search([
+ ('partner_id', '=', False),
+ ('email_from', '=', new_partner.email),
+ ('stage_id.fold', '=', False)]).write({'partner_id': new_partner.id})
+ return super(Lead, self)._message_post_after_hook(message)
+
@api.multi
def message_partner_info_from_emails(self, emails, link_mail=False):
result = super(Lead, self).message_partner_info_from_emails(emails, link_mail=link_mail)
diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml
index 6104de36b49..f9b44044a2c 100644
--- a/addons/crm/views/crm_lead_views.xml
+++ b/addons/crm/views/crm_lead_views.xml
@@ -127,7 +127,7 @@
-
+
@@ -497,7 +497,7 @@
-
+
diff --git a/addons/event/models/event.py b/addons/event/models/event.py
index de8117e0cee..c5c3e50a157 100644
--- a/addons/event/models/event.py
+++ b/addons/event/models/event.py
@@ -447,6 +447,20 @@ class EventRegistration(models.Model):
pass
return recipients
+ def _message_post_after_hook(self, message):
+ if self.email and not self.partner_id:
+ # we consider that posting a message with a specified recipient (not a follower, a specific one)
+ # on a document without customer means that it was created through the chatter using
+ # suggested recipients. This heuristic allows to avoid ugly hacks in JS.
+ new_partner = message.partner_ids.filtered(lambda partner: partner.email == self.email)
+ if new_partner:
+ self.search([
+ ('partner_id', '=', False),
+ ('email', '=', new_partner.email),
+ ('state', 'not in', ['cancel']),
+ ]).write({'partner_id': new_partner.id})
+ return super(EventRegistration, self)._message_post_after_hook(message)
+
@api.multi
def action_send_badge_email(self):
""" Open a window to compose an email, with the template - 'event_badge'
diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml
index 05995070924..dab9536edac 100644
--- a/addons/event/views/event_views.xml
+++ b/addons/event/views/event_views.xml
@@ -499,7 +499,7 @@
-
+
diff --git a/addons/hr_recruitment/models/hr_recruitment.py b/addons/hr_recruitment/models/hr_recruitment.py
index f5e164a4aff..9302b9a5ce5 100644
--- a/addons/hr_recruitment/models/hr_recruitment.py
+++ b/addons/hr_recruitment/models/hr_recruitment.py
@@ -305,7 +305,6 @@ class Applicant(models.Model):
}
return res
-
@api.multi
def action_get_attachment_tree_view(self):
attachment_action = self.env.ref('base.action_attachment')
@@ -377,6 +376,19 @@ class Applicant(models.Model):
defaults.update(custom_values)
return super(Applicant, self).message_new(msg, custom_values=defaults)
+ def _message_post_after_hook(self, message):
+ if self.email_from and not self.partner_id:
+ # we consider that posting a message with a specified recipient (not a follower, a specific one)
+ # on a document without customer means that it was created through the chatter using
+ # suggested recipients. This heuristic allows to avoid ugly hacks in JS.
+ new_partner = message.partner_ids.filtered(lambda partner: partner.email == self.email_from)
+ if new_partner:
+ self.search([
+ ('partner_id', '=', False),
+ ('email_from', '=', new_partner.email),
+ ('stage_id.fold', '=', False)]).write({'partner_id': new_partner.id})
+ return super(Applicant, self)._message_post_after_hook(message)
+
@api.multi
def create_employee_from_applicant(self):
""" Create an hr.employee from the hr.applicants """
diff --git a/addons/hr_recruitment/views/hr_recruitment_views.xml b/addons/hr_recruitment/views/hr_recruitment_views.xml
index f2269a9a991..27a3e33aab2 100644
--- a/addons/hr_recruitment/views/hr_recruitment_views.xml
+++ b/addons/hr_recruitment/views/hr_recruitment_views.xml
@@ -159,7 +159,7 @@
-
+
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py
index e9197a7292d..6d3b1f0fcc3 100644
--- a/addons/mail/models/mail_thread.py
+++ b/addons/mail/models/mail_thread.py
@@ -1894,8 +1894,14 @@ class MailThread(models.AbstractModel):
self.sudo().write({'message_last_post': fields.Datetime.now()})
if new_message.author_id and model and self.ids and message_type != 'notification' and not self._context.get('mail_create_nosubscribe'):
self.message_subscribe([new_message.author_id.id], force=False)
+
+ self._message_post_after_hook(new_message)
+
return new_message
+ def _message_post_after_hook(self, message):
+ pass
+
@api.multi
def message_post_with_view(self, views_or_xmlid, **kwargs):
""" Helper method to send a mail / post a message using a view_id to
diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js
index da9c6eee5fa..c799cf6a70a 100644
--- a/addons/mail/static/src/js/chatter.js
+++ b/addons/mail/static/src/js/chatter.js
@@ -58,6 +58,7 @@ var Chatter = Widget.extend(chat_mixin, {
this.fields.thread = new ThreadField(this, mailFields.mail_thread, record, options);
var nodeOptions = this.record.fieldsInfo.form[mailFields.mail_thread].options;
this.hasLogButton = nodeOptions.display_log_button;
+ this.postRefresh = nodeOptions.post_refresh || 'never';
}
},
start: function () {
@@ -158,7 +159,12 @@ var Chatter = Widget.extend(chat_mixin, {
self.composer.focus();
}
self.composer.on('post_message', self, function (message) {
- self.fields.thread.postMessage(message).then(self._closeComposer.bind(self, true));
+ self.fields.thread.postMessage(message).then(function () {
+ self._closeComposer(true);
+ if (self.postRefresh === 'always' || (self.postRefresh === 'recipients' && message.partner_ids.length)) {
+ self.trigger_up('reload');
+ }
+ });
});
self.composer.on('need_refresh', self, self.trigger_up.bind(self, 'reload'));
self.composer.on('close_composer', null, self._closeComposer.bind(self, true));
diff --git a/addons/mail/static/src/js/chatter_composer.js b/addons/mail/static/src/js/chatter_composer.js
index 340c82c349f..cd36e12768c 100644
--- a/addons/mail/static/src/js/chatter_composer.js
+++ b/addons/mail/static/src/js/chatter_composer.js
@@ -173,7 +173,7 @@ var ChatterComposer = composer.BasicComposer.extend({
var new_names_to_find = _.difference(names_to_find, names_to_remove);
var def;
if (new_names_to_find.length > 0) {
- self._rpc({
+ def = self._rpc({
model: self.model,
method: 'message_partner_info_from_emails',
args: [[self.context.default_res_id], new_names_to_find, true],
diff --git a/addons/project_issue/models/project_issue.py b/addons/project_issue/models/project_issue.py
index 526225ac096..5e4a8757d68 100644
--- a/addons/project_issue/models/project_issue.py
+++ b/addons/project_issue/models/project_issue.py
@@ -327,6 +327,19 @@ class ProjectIssue(models.Model):
self.sudo().write({'date_action_last': fields.Datetime.now()})
return mail_message
+ def _message_post_after_hook(self, message):
+ if self.email_from and not self.partner_id:
+ # we consider that posting a message with a specified recipient (not a follower, a specific one)
+ # on a document without customer means that it was created through the chatter using
+ # suggested recipients. This heuristic allows to avoid ugly hacks in JS.
+ new_partner = message.partner_ids.filtered(lambda partner: partner.email == self.email_from)
+ if new_partner:
+ self.search([
+ ('partner_id', '=', False),
+ ('email_from', '=', new_partner.email),
+ ('stage_id.fold', '=', False)]).write({'partner_id': new_partner.id})
+ return super(ProjectIssue, self)._message_post_after_hook(message)
+
@api.multi
def message_get_email_values(self, notif_mail=None):
self.ensure_one()
diff --git a/addons/project_issue/views/project_issue_views.xml b/addons/project_issue/views/project_issue_views.xml
index b217f68c7b4..383bead65df 100644
--- a/addons/project_issue/views/project_issue_views.xml
+++ b/addons/project_issue/views/project_issue_views.xml
@@ -61,7 +61,7 @@
-
+
diff --git a/addons/website_event_track/models/event_track.py b/addons/website_event_track/models/event_track.py
index 9b46b618d6e..7da7dc9395c 100644
--- a/addons/website_event_track/models/event_track.py
+++ b/addons/website_event_track/models/event_track.py
@@ -160,6 +160,20 @@ class Track(models.Model):
track._message_add_suggested_recipient(recipients, email=track.partner_email, reason=_('Speaker Email'))
return recipients
+ def _message_post_after_hook(self, message):
+ if self.partner_email and not self.partner_id:
+ # we consider that posting a message with a specified recipient (not a follower, a specific one)
+ # on a document without customer means that it was created through the chatter using
+ # suggested recipients. This heuristic allows to avoid ugly hacks in JS.
+ new_partner = message.partner_ids.filtered(lambda partner: partner.email == self.partner_email)
+ if new_partner:
+ self.search([
+ ('partner_id', '=', False),
+ ('partner_email', '=', new_partner.email),
+ ('stage_id.is_cancel', '=', False),
+ ]).write({'partner_id': new_partner.id})
+ return super(Track, self)._message_post_after_hook(message)
+
@api.multi
def open_track_speakers_list(self):
return {
diff --git a/addons/website_event_track/views/event_track_views.xml b/addons/website_event_track/views/event_track_views.xml
index 0e10a43aa0c..1266f0a9d30 100644
--- a/addons/website_event_track/views/event_track_views.xml
+++ b/addons/website_event_track/views/event_track_views.xml
@@ -154,7 +154,7 @@
-
+