diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 7afd9367e1b724a827fec192896d862616f730a3..a8145e302eff2507df5618b783fadd7de871488c 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 6104de36b493578a164f402cfc4d607d0cf21100..f9b44044a2cc19e46fe10b26cb9ea2ab93371bf0 100644 --- a/addons/crm/views/crm_lead_views.xml +++ b/addons/crm/views/crm_lead_views.xml @@ -127,7 +127,7 @@ </sheet> <div class="oe_chatter"> <field name="message_follower_ids" widget="mail_followers"/> - <field name="message_ids" widget="mail_thread"/> + <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/> </div> </form> </field> @@ -497,7 +497,7 @@ <div class="oe_chatter"> <field name="message_follower_ids" widget="mail_followers"/> <field name="activity_ids" widget="mail_activity"/> - <field name="message_ids" widget="mail_thread"/> + <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/> </div> </form> </field> diff --git a/addons/event/models/event.py b/addons/event/models/event.py index de8117e0ceec7fcf62407f4406e3e43cfe9a94f7..c5c3e50a15792b5e77218ecec15f1c3065a25e85 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 05995070924ceb4da64a6d49b1f35a8adc138b72..dab9536edac8f5765f2fa66468166cd8cd315946 100644 --- a/addons/event/views/event_views.xml +++ b/addons/event/views/event_views.xml @@ -499,7 +499,7 @@ </sheet> <div class="oe_chatter"> <field name="message_follower_ids" widget="mail_followers"/> - <field name="message_ids" widget="mail_thread"/> + <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/> </div> </form> </field> diff --git a/addons/hr_recruitment/models/hr_recruitment.py b/addons/hr_recruitment/models/hr_recruitment.py index f5e164a4affb05bc7123c54be005fc5c339616a8..9302b9a5ce516cda0719b27c518db30f42f06cca 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 f2269a9a991d20de1a8ed8477f57967478fc6573..27a3e33aab2bff5fe06c2fd17f16682971229849 100644 --- a/addons/hr_recruitment/views/hr_recruitment_views.xml +++ b/addons/hr_recruitment/views/hr_recruitment_views.xml @@ -159,7 +159,7 @@ <div class="oe_chatter"> <field name="message_follower_ids" widget="mail_followers"/> <field name="activity_ids" widget="mail_activity"/> - <field name="message_ids" widget="mail_thread"/> + <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/> </div> </form> </field> diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index e9197a7292dfac72d95bed2ea2bba7d74d1932be..6d3b1f0fcc32d1f0454a8cd765a976fd795ef0c0 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 da9c6eee5fadbc370f8736456da02c903eda8533..c799cf6a70aa41320bb9003710a7a544df91853e 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 340c82c349f0ad25259accbbc65b13e3a8ac915a..cd36e12768cdf59387897b4d3049d5de4ab01780 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 526225ac0964696fd79049e86f18dcc26db80752..5e4a8757d68914504862e718abfb187f92ac998c 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 b217f68c7b45460534fe2672ee9a4a9f22252827..383bead65dff21ec91a65a32d1783f1cbe137444 100644 --- a/addons/project_issue/views/project_issue_views.xml +++ b/addons/project_issue/views/project_issue_views.xml @@ -61,7 +61,7 @@ <div class="oe_chatter"> <field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/> <field name="activity_ids" widget="mail_activity"/> - <field name="message_ids" widget="mail_thread"/> + <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/> </div> </form> </field> diff --git a/addons/website_event_track/models/event_track.py b/addons/website_event_track/models/event_track.py index 9b46b618d6e11fc001f1fe2e4458fd271a0dfbd5..7da7dc9395c2fc68716253f8ab8eae37dd2fd5c1 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 0e10a43aa0c409c108f8bd0c4cf42d85aae37e69..1266f0a9d30162dd468826f4b05389d9b221adbc 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 @@ <div class="oe_chatter"> <field name="message_follower_ids" widget="mail_followers"/> <field name="activity_ids" widget="mail_activity"/> - <field name="message_ids" widget="mail_thread"/> + <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/> </div> </form> </field>