diff --git a/mail_tracking/README.rst b/mail_tracking/README.rst index b13c35deb..f4ff09fc5 100644 --- a/mail_tracking/README.rst +++ b/mail_tracking/README.rst @@ -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/__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, " 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 "" 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_message.py b/mail_tracking/models/mail_message.py index a6bcc6831..7492021e6 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,12 @@ 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.update({ + 'partner_trackings': partner_trackings[mail_message_id], + '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/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: Sent to SMTP server configured

delivered Delivered: Delivered to final MX server

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

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 27d79883e..f02640f84 100644 --- a/mail_tracking/static/src/xml/mail_tracking.xml +++ b/mail_tracking/static/src/xml/mail_tracking.xml @@ -1,37 +1,43 @@