From 0389b3043ba56938a19c8da3eb72a899a0b81ab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 24 Apr 2017 14:07:02 +0200 Subject: [PATCH 1/7] [FIX] mail: fixe issue with suggested recipients introduced with new views Somewhere in the new views refactoring, between file splitting and rpc engine quadruple refactoring, a deferred was lost. Due to this chatter does not have correct information about message recipients. This commit fixes it by putting the deferred back. --- addons/mail/static/src/js/chatter_composer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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], From ae04ea2bf5e662768673ac275d8f6926c7505411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 15 Mar 2017 10:13:40 +0100 Subject: [PATCH 2/7] [IMP] mail: add a post-process hook for message post Models inheriting from mail.thread can override this method and hook on post message_post event and perform some action depending on the business flow. Future commits will use that hook to update the record after posting a message, like updating the customer. --- addons/mail/models/mail_thread.py | 6 ++++++ 1 file changed, 6 insertions(+) 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 From 803d5cf04835fcf8e7ddb143e1ab140408beef93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 31 Mar 2017 11:36:11 +0200 Subject: [PATCH 3/7] [IMP] mail: add view reload option on chatter Purpose is to be able to reload the view after posting a message using the chatter. Reason behind that move is that records can be updated after processing message_post and this is the easiest solution to enable the reload feature without having an event-based chatter. --- addons/mail/static/src/js/chatter.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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)); From 38e6f352833062629ab1c16f8bc505aa84a0c7ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 15 Mar 2017 10:13:54 +0100 Subject: [PATCH 4/7] [IMP] crm: update lead after creating a partner from chatter suggestion When a message is posted through the chatter and creates a new partner the lead / opportunity is now updated so that the partner field is correctly set to the newly-created partner. Chatter on lead / opportunity now uses the reload option so that the view is reloaded after posting a message. The user therefore sees that the record has been updated accordingly. --- addons/crm/models/crm_lead.py | 13 +++++++++++++ addons/crm/views/crm_lead_views.xml | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) 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 @@
- +
From 4207b33b8860fc94c98713a204f35937ced9adae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 31 Mar 2017 11:36:31 +0200 Subject: [PATCH 5/7] [IMP] project_issue: update issue after creating a partner from chatter suggestion When a message is posted through the chatter and creates a new partner the issue is now updated so that the partner field is correctly set to the newly-created partner. Chatter on issue now uses the reload option so that the view is reloaded after posting a message. The user therefore sees that the record has been updated accordingly. --- addons/project_issue/models/project_issue.py | 13 +++++++++++++ addons/project_issue/views/project_issue_views.xml | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) 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 @@
- +
From 7da0ea30fb47ebeea409835d7b2dbfd274531af1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 31 Mar 2017 12:07:54 +0200 Subject: [PATCH 6/7] [IMP] hr_recruitment: update applicant after creating a partner from chatter suggestion When a message is posted through the chatter and creates a new partner the applicant is now updated so that the partner field is correctly set to the newly-created partner. Chatter on applicant now uses the reload option so that the view is reloaded after posting a message. The user therefore sees that the record has been updated accordingly. --- addons/hr_recruitment/models/hr_recruitment.py | 14 +++++++++++++- .../hr_recruitment/views/hr_recruitment_views.xml | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) 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 @@
- +
From 2090986b0676957b84b95291f8e941b24b1cb101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 18 Apr 2017 16:37:49 +0200 Subject: [PATCH 7/7] [IMP] event: update attendee and track after creating a partner from chatter suggestion When a message is posted through the chatter and creates a new partner the attendee or track is now updated so that the partner field is correctly set to the newly-created partner. Chatter on attendee or track now uses the reload option so that the view is reloaded after posting a message. The user therefore sees that the record has been updated accordingly. --- addons/event/models/event.py | 14 ++++++++++++++ addons/event/views/event_views.xml | 2 +- addons/website_event_track/models/event_track.py | 14 ++++++++++++++ .../views/event_track_views.xml | 2 +- 4 files changed, 30 insertions(+), 2 deletions(-) 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/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 @@
- +