From 61a719d861eedc64b0136a4873e72f4beafbf94c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandre=20D=C3=ADaz?=
Date: Wed, 3 Jul 2019 11:12:11 +0200
Subject: [PATCH 1/4] [IMP] mail_tracking: Cc
---
mail_tracking/README.rst | 2 +-
mail_tracking/models/__init__.py | 1 +
mail_tracking/models/mail_mail.py | 1 -
mail_tracking/models/mail_message.py | 39 ++++++++++++++++-
mail_tracking/models/mail_thread.py | 42 +++++++++++++++++++
.../static/src/xml/mail_tracking.xml | 18 +++++---
mail_tracking/tests/test_mail_tracking.py | 28 +++++++++++++
7 files changed, 121 insertions(+), 10 deletions(-)
create mode 100644 mail_tracking/models/mail_thread.py
diff --git a/mail_tracking/README.rst b/mail_tracking/README.rst
index b13c35deb..5c2d05960 100644
--- a/mail_tracking/README.rst
+++ b/mail_tracking/README.rst
@@ -23,7 +23,7 @@ Email tracking
:target: https://runbot.odoo-community.org/runbot/205/12.0
:alt: Try me on Runbot
-|badge1| |badge2| |badge3| |badge4| |badge5|
+|badge1| |badge2| |badge3| |badge4| |badge5|
This module shows email notification tracking status for any messages in
mail thread (chatter). Each notified partner will have an intuitive icon just
diff --git a/mail_tracking/models/__init__.py b/mail_tracking/models/__init__.py
index 847f98f0e..42736005c 100644
--- a/mail_tracking/models/__init__.py
+++ b/mail_tracking/models/__init__.py
@@ -7,3 +7,4 @@ from . import mail_message
from . import mail_tracking_email
from . import mail_tracking_event
from . import res_partner
+from . import mail_thread
diff --git a/mail_tracking/models/mail_mail.py b/mail_tracking/models/mail_mail.py
index 2342d1c89..37edb9786 100644
--- a/mail_tracking/models/mail_mail.py
+++ b/mail_tracking/models/mail_mail.py
@@ -4,7 +4,6 @@
import time
from datetime import datetime
from email.utils import COMMASPACE
-
from odoo import models, fields
diff --git a/mail_tracking/models/mail_message.py b/mail_tracking/models/mail_message.py
index a6bcc6831..38d10e063 100644
--- a/mail_tracking/models/mail_message.py
+++ b/mail_tracking/models/mail_message.py
@@ -1,12 +1,18 @@
# Copyright 2016 Antonio Espinosa -
+# Copyright 2019 Alexandre Díaz
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-from odoo import models, api
+from odoo import models, api, fields
+from odoo.tools import email_split
class MailMessage(models.Model):
_inherit = "mail.message"
+ # Recipients
+ email_cc = fields.Char("Cc", help='Additional recipients that receive a '
+ '"Carbon Copy" of the e-mail')
+
def _tracking_status_map_get(self):
return {
'False': 'waiting',
@@ -58,10 +64,37 @@ class MailMessage(models.Model):
for partner in partners:
# If there is partners not included, then status is 'unknown'
partner_trackings.append((
- 'unknown', False, partner.name, partner.id))
+ 'unknown', False, partner.name, partner.id, partner.email))
res[message.id] = partner_trackings
return res
+ @api.multi
+ def _get_email_cc(self):
+ """This method gets all Cc mails and the associated partner if exist.
+ The result is a dictionary by 'message id' with a list of tuples
+ (str:email_cc, list:[partner id, partner display_name] or False)
+ """
+ res = {}
+ ResPartnerObj = self.env['res.partner']
+ for message in self:
+ email_cc_list = email_split(message.email_cc)
+ email_cc_list_checked = []
+ if any(email_cc_list):
+ partners = ResPartnerObj.search([
+ ('email', 'in', email_cc_list)
+ ])
+ email_cc_list = set(email_cc_list)
+ for partner in partners:
+ email_cc_list.discard(partner.email)
+ email_cc_list_checked.append(
+ (partner.email, [partner.id, partner.display_name]))
+ for email in email_cc_list:
+ email_cc_list_checked.append((email, False))
+ res.update({
+ message.id: email_cc_list_checked
+ })
+ return res
+
@api.model
def _message_read_dict_postprocess(self, messages, message_tree):
res = super(MailMessage, self)._message_read_dict_postprocess(
@@ -69,9 +102,11 @@ class MailMessage(models.Model):
mail_message_ids = {m.get('id') for m in messages if m.get('id')}
mail_messages = self.browse(mail_message_ids)
partner_trackings = mail_messages.tracking_status()
+ email_cc = mail_messages._get_email_cc()
for message_dict in messages:
mail_message_id = message_dict.get('id', False)
if mail_message_id:
message_dict['partner_trackings'] = \
partner_trackings[mail_message_id]
+ message_dict['email_cc'] = email_cc[mail_message_id]
return res
diff --git a/mail_tracking/models/mail_thread.py b/mail_tracking/models/mail_thread.py
new file mode 100644
index 000000000..c5ce2acef
--- /dev/null
+++ b/mail_tracking/models/mail_thread.py
@@ -0,0 +1,42 @@
+# Copyright 2019 Alexandre Díaz
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import models, api, _
+from email.utils import getaddresses
+from odoo.tools import email_split_and_format
+
+
+class MailThread(models.AbstractModel):
+ _inherit = "mail.thread"
+
+ @api.multi
+ @api.returns('self', lambda value: value.id)
+ def message_post(self, *args, **kwargs):
+ new_message = super().message_post(*args, **kwargs)
+ email_cc = kwargs.get('cc')
+ if email_cc:
+ new_message.sudo().write({
+ 'email_cc': email_cc,
+ })
+ return new_message
+
+ @api.multi
+ def message_get_suggested_recipients(self):
+ res = super().message_get_suggested_recipients()
+ ResPartnerObj = self.env['res.partner']
+ for record in self:
+ messages = record.message_ids.filtered('email_cc')
+ for msg in messages:
+ email_cc_list = email_split_and_format(msg.email_cc)
+ for cc in email_cc_list:
+ email_parts = getaddresses([cc])[0]
+ partner_id = record.message_partner_info_from_emails(
+ [email_parts[1]])[0].get('partner_id')
+ if not partner_id:
+ res[record.id].append((False, cc, _('Cc')))
+ else:
+ partner = ResPartnerObj.browse(partner_id,
+ self._prefetch)
+ record._message_add_suggested_recipient(
+ res, partner=partner, reason=_('Cc'))
+ return res
diff --git a/mail_tracking/static/src/xml/mail_tracking.xml b/mail_tracking/static/src/xml/mail_tracking.xml
index 27d79883e..167b453cf 100644
--- a/mail_tracking/static/src/xml/mail_tracking.xml
+++ b/mail_tracking/static/src/xml/mail_tracking.xml
@@ -1,37 +1,43 @@
-
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
diff --git a/mail_tracking/tests/test_mail_tracking.py b/mail_tracking/tests/test_mail_tracking.py
index 551664087..2ddcfc8c5 100644
--- a/mail_tracking/tests/test_mail_tracking.py
+++ b/mail_tracking/tests/test_mail_tracking.py
@@ -113,6 +113,34 @@ class TestMailTracking(TransactionCase):
tracking_email.event_create('open', metadata)
self.assertEqual(tracking_email.state, 'opened')
+ def test_email_cc(self):
+ message = self.env['mail.message'].create({
+ 'subject': 'Message test',
+ 'author_id': self.sender.id,
+ 'email_from': self.sender.email,
+ 'message_type': 'comment',
+ 'model': 'res.partner',
+ 'res_id': self.recipient.id,
+ 'partner_ids': [(4, self.recipient.id)],
+ 'email_cc': 'unnamed@test.com, sender@example.com',
+ 'body': 'This is a test message
',
+ })
+
+ message_dict = message.message_format()[0]
+ self.assertEqual(len(message_dict['email_cc']), 2)
+ # mail cc
+ # 'mail.message' First check Cc with res.partner
+ email_cc = message_dict['email_cc'][0]
+ self.assertEqual(email_cc[0], 'sender@example.com')
+ self.assertTrue(email_cc[1])
+ email_cc = message_dict['email_cc'][1]
+ self.assertEqual(email_cc[0], 'unnamed@test.com')
+ self.assertFalse(email_cc[1])
+ # suggested recipients
+ recipients = self.recipient.message_get_suggested_recipients()
+ self.assertEqual(recipients[self.recipient.id][0][1],
+ 'unnamed@test.com')
+
def mail_send(self, recipient):
mail = self.env['mail.mail'].create({
'subject': 'Test subject',
From c36b61b1a1ff93f22b1232fbd989460f6de8a19b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandre=20D=C3=ADaz?=
Date: Wed, 3 Jul 2019 11:12:11 +0200
Subject: [PATCH 2/4] [MIG] mail_tracking: Adapt Cc to 12.0
---
mail_tracking/README.rst | 10 ++++-
mail_tracking/models/mail_mail.py | 1 +
mail_tracking/models/mail_message.py | 7 ++--
mail_tracking/readme/CONTRIBUTORS.rst | 1 +
mail_tracking/readme/USAGE.rst | 7 +++-
mail_tracking/static/description/index.html | 2 +
mail_tracking/static/src/js/mail_tracking.js | 40 ++++++++++++++++++-
.../static/src/xml/mail_tracking.xml | 31 ++++++++++++--
8 files changed, 89 insertions(+), 10 deletions(-)
diff --git a/mail_tracking/README.rst b/mail_tracking/README.rst
index 5c2d05960..f4ff09fc5 100644
--- a/mail_tracking/README.rst
+++ b/mail_tracking/README.rst
@@ -23,7 +23,7 @@ Email tracking
:target: https://runbot.odoo-community.org/runbot/205/12.0
:alt: Try me on Runbot
-|badge1| |badge2| |badge3| |badge4| |badge5|
+|badge1| |badge2| |badge3| |badge4| |badge5|
This module shows email notification tracking status for any messages in
mail thread (chatter). Each notified partner will have an intuitive icon just
@@ -70,6 +70,9 @@ These are all available status icons:
.. |unknown| image:: mail_tracking/static/src/img/unknown.png
:width: 10px
+.. |cc| image:: static/src/img/cc.png
+ :width: 10px
+
|unknown| **Unknown**: No email tracking info available. Maybe this notified partner has 'Receive Inbox Notifications by Email' == 'Never'
|waiting| **Waiting**: Waiting to be sent
@@ -82,12 +85,14 @@ These are all available status icons:
|opened| **Opened**: Opened by partner
+|cc| **Cc**: It's a Carbon-Copy recipient. Can't know the status so is 'Unknown'
+
+
If you want to see all tracking emails and events you can go to
* Settings > Technical > Email > Tracking emails
* Settings > Technical > Email > Tracking events
-
Bug Tracker
===========
@@ -116,6 +121,7 @@ Contributors
* David Vidal
* Ernesto Tejeda
* Rafael Blasco
+ * Alexandre Díaz
Other credits
~~~~~~~~~~~~~
diff --git a/mail_tracking/models/mail_mail.py b/mail_tracking/models/mail_mail.py
index 37edb9786..2342d1c89 100644
--- a/mail_tracking/models/mail_mail.py
+++ b/mail_tracking/models/mail_mail.py
@@ -4,6 +4,7 @@
import time
from datetime import datetime
from email.utils import COMMASPACE
+
from odoo import models, fields
diff --git a/mail_tracking/models/mail_message.py b/mail_tracking/models/mail_message.py
index 38d10e063..7492021e6 100644
--- a/mail_tracking/models/mail_message.py
+++ b/mail_tracking/models/mail_message.py
@@ -106,7 +106,8 @@ class MailMessage(models.Model):
for message_dict in messages:
mail_message_id = message_dict.get('id', False)
if mail_message_id:
- message_dict['partner_trackings'] = \
- partner_trackings[mail_message_id]
- message_dict['email_cc'] = email_cc[mail_message_id]
+ message_dict.update({
+ 'partner_trackings': partner_trackings[mail_message_id],
+ 'email_cc': email_cc[mail_message_id],
+ })
return res
diff --git a/mail_tracking/readme/CONTRIBUTORS.rst b/mail_tracking/readme/CONTRIBUTORS.rst
index 81d195371..78a16cba0 100644
--- a/mail_tracking/readme/CONTRIBUTORS.rst
+++ b/mail_tracking/readme/CONTRIBUTORS.rst
@@ -5,3 +5,4 @@
* David Vidal
* Ernesto Tejeda
* Rafael Blasco
+ * Alexandre Díaz
diff --git a/mail_tracking/readme/USAGE.rst b/mail_tracking/readme/USAGE.rst
index 87df760bd..4bf4a0745 100644
--- a/mail_tracking/readme/USAGE.rst
+++ b/mail_tracking/readme/USAGE.rst
@@ -22,6 +22,9 @@ These are all available status icons:
.. |unknown| image:: mail_tracking/static/src/img/unknown.png
:width: 10px
+.. |cc| image:: static/src/img/cc.png
+ :width: 10px
+
|unknown| **Unknown**: No email tracking info available. Maybe this notified partner has 'Receive Inbox Notifications by Email' == 'Never'
|waiting| **Waiting**: Waiting to be sent
@@ -34,8 +37,10 @@ These are all available status icons:
|opened| **Opened**: Opened by partner
+|cc| **Cc**: It's a Carbon-Copy recipient. Can't know the status so is 'Unknown'
+
+
If you want to see all tracking emails and events you can go to
* Settings > Technical > Email > Tracking emails
* Settings > Technical > Email > Tracking events
-
diff --git a/mail_tracking/static/description/index.html b/mail_tracking/static/description/index.html
index 90220f00e..dfddbbbed 100644
--- a/mail_tracking/static/description/index.html
+++ b/mail_tracking/static/description/index.html
@@ -409,6 +409,7 @@ status icon will appear just right to name of notified partner.
Sent: Sent to SMTP server configured
Delivered: Delivered to final MX server
Opened: Opened by partner
+
Cc: It’s a Carbon-Copy recipient. Can’t know the status so is ‘Unknown’
If you want to see all tracking emails and events you can go to
- Settings > Technical > Email > Tracking emails
@@ -440,6 +441,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
- David Vidal
- Ernesto Tejeda
- Rafael Blasco
+- Alexandre Díaz
diff --git a/mail_tracking/static/src/js/mail_tracking.js b/mail_tracking/static/src/js/mail_tracking.js
index 828ba7807..cc2336038 100644
--- a/mail_tracking/static/src/js/mail_tracking.js
+++ b/mail_tracking/static/src/js/mail_tracking.js
@@ -28,6 +28,7 @@ odoo.define('mail_tracking.partner_tracking', function(require){
init: function (parent, data, emojis) {
this._super.apply(this, arguments);
this._partnerTrackings = data.partner_trackings || [];
+ this._emailCc = data.email_cc || [];
},
/**
@@ -37,7 +38,16 @@ odoo.define('mail_tracking.partner_tracking', function(require){
* @return {boolean}
*/
hasPartnerTrackings: function () {
- return !!(this._partnerTrackings && (this._partnerTrackings.length > 0));
+ return _.some(this._partnerTrackings);
+ },
+
+ /**
+ * State whether this message contains some email Cc values
+ *
+ * @return {boolean}
+ */
+ hasEmailCc: function () {
+ return _.some(this._emailCc);
},
/**
@@ -53,6 +63,34 @@ odoo.define('mail_tracking.partner_tracking', function(require){
}
return this._partnerTrackings;
},
+
+ /**
+ * Get the email Cc values of this message
+ * If this message has no email Cc values, returns []
+ *
+ * @return {Array}
+ */
+ getEmailCc: function () {
+ if (!this.hasEmailCc()) {
+ return [];
+ }
+ return this._emailCc;
+ },
+
+ /**
+ * Check if the email is an Cc
+ * If this message has no email Cc values, returns false
+ *
+ * @return {Boolean}
+ */
+ isEmailCc: function (email) {
+ if (!this.hasEmailCc()) {
+ return false;
+ }
+ return _.some(this._emailCc, function (item) {
+ return item[0] === email;
+ });
+ },
});
ThreadWidget.include({
diff --git a/mail_tracking/static/src/xml/mail_tracking.xml b/mail_tracking/static/src/xml/mail_tracking.xml
index 167b453cf..f02640f84 100644
--- a/mail_tracking/static/src/xml/mail_tracking.xml
+++ b/mail_tracking/static/src/xml/mail_tracking.xml
@@ -48,16 +48,17 @@
-
+
To:
+
- -
+ -
-
@@ -73,6 +74,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From d81ad09da44a6fa400bfc049e86e81955a88127c Mon Sep 17 00:00:00 2001
From: oca-travis
Date: Fri, 19 Jul 2019 07:47:33 +0000
Subject: [PATCH 3/4] [UPD] Update mail_tracking.pot
---
mail_tracking/i18n/mail_tracking.pot | 33 +++++++++++++++++++++++++---
1 file changed, 30 insertions(+), 3 deletions(-)
diff --git a/mail_tracking/i18n/mail_tracking.pot b/mail_tracking/i18n/mail_tracking.pot
index 2a53f76a2..1506ab501 100644
--- a/mail_tracking/i18n/mail_tracking.pot
+++ b/mail_tracking/i18n/mail_tracking.pot
@@ -27,6 +27,12 @@ msgid " * The 'Error' status indicates that there was an error when trying to se
""
msgstr ""
+#. module: mail_tracking
+#: model:ir.model.fields,help:mail_tracking.field_mail_compose_message__email_cc
+#: model:ir.model.fields,help:mail_tracking.field_mail_message__email_cc
+msgid "Additional recipients that receive a \"Carbon Copy\" of the e-mail"
+msgstr ""
+
#. module: mail_tracking
#: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search
msgid "Bounce"
@@ -47,6 +53,15 @@ msgstr ""
msgid "Bounced"
msgstr ""
+#. module: mail_tracking
+#: code:addons/mail_tracking/models/mail_thread.py:36
+#: code:addons/mail_tracking/models/mail_thread.py:41
+#: model:ir.model.fields,field_description:mail_tracking.field_mail_compose_message__email_cc
+#: model:ir.model.fields,field_description:mail_tracking.field_mail_message__email_cc
+#, python-format
+msgid "Cc"
+msgstr ""
+
#. module: mail_tracking
#: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search
msgid "Click"
@@ -143,6 +158,11 @@ msgstr ""
msgid "Email Score"
msgstr ""
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_thread
+msgid "Email Thread"
+msgstr ""
+
#. module: mail_tracking
#: model_terms:ir.ui.view,arch_db:mail_tracking.view_res_partner_filter
msgid "Email bounced"
@@ -288,7 +308,7 @@ msgstr ""
#. module: mail_tracking
#. openerp-web
-#: code:addons/mail_tracking/static/src/js/mail_tracking.js:88
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:126
#, python-format
msgid "Message tracking"
msgstr ""
@@ -403,6 +423,13 @@ msgstr ""
msgid "State"
msgstr ""
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/xml/mail_tracking.xml:96
+#, python-format
+msgid "Status: unknown"
+msgstr ""
+
#. module: mail_tracking
#: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__name
#: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search
@@ -419,7 +446,7 @@ msgstr ""
#. module: mail_tracking
#. openerp-web
-#: code:addons/mail_tracking/static/src/xml/mail_tracking.xml:47
+#: code:addons/mail_tracking/static/src/xml/mail_tracking.xml:53
#, python-format
msgid "To:"
msgstr ""
@@ -445,7 +472,7 @@ msgstr ""
#. module: mail_tracking
#. openerp-web
-#: code:addons/mail_tracking/static/src/js/mail_tracking.js:68
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:106
#, python-format
msgid "Tracking partner"
msgstr ""
From 1bfb50fa598c682f3b6eeedd0cc9cc50734ead3c Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Fri, 19 Jul 2019 07:58:21 +0000
Subject: [PATCH 4/4] mail_tracking 12.0.1.1.0
---
mail_tracking/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mail_tracking/__manifest__.py b/mail_tracking/__manifest__.py
index 80f71809f..1f072b4fd 100644
--- a/mail_tracking/__manifest__.py
+++ b/mail_tracking/__manifest__.py
@@ -7,7 +7,7 @@
{
"name": "Email tracking",
"summary": "Email tracking system for all mails sent",
- "version": "12.0.1.0.1",
+ "version": "12.0.1.1.0",
"category": "Social Network",
"website": "http://github.com/OCA/social",
"author": "Tecnativa, "