[IMP] mail_tracking: mail.thread filter for tracking errors

- Any model inheriting from mail.thread will have a filter available to
obtain records with errors in their messages trackings.
- The messages can be marked as done to avoid false positives when the
issues are solved.
pull/411/head
David 2019-07-05 14:20:27 +02:00 committed by Alexandre Díaz
parent abbd2a0eb8
commit 15d86bed66
5 changed files with 65 additions and 0 deletions

View File

@ -1,6 +1,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import ir_mail_server from . import ir_mail_server
from . import mail_thread
from . import mail_mail from . import mail_mail
from . import mail_message from . import mail_message
from . import mail_tracking_email from . import mail_tracking_email

View File

@ -9,9 +9,20 @@ from odoo.tools import email_split
class MailMessage(models.Model): class MailMessage(models.Model):
_inherit = "mail.message" _inherit = "mail.message"
# Recipients # Recipients
email_cc = fields.Char("Cc", help='Additional recipients that receive a ' email_cc = fields.Char("Cc", help='Additional recipients that receive a '
'"Carbon Copy" of the e-mail') '"Carbon Copy" of the e-mail')
mail_tracking_ids = fields.One2many(
comodel_name='mail.tracking.email',
inverse_name='mail_message_id',
string="Mail Trackings Associated with this message",
)
track_needs_action = fields.Boolean(
string="The message tracking will be considered"
"for filter tracking issues",
default=True,
)
def _tracking_status_map_get(self): def _tracking_status_map_get(self):
return { return {
@ -123,3 +134,11 @@ class MailMessage(models.Model):
message_dict['partner_trackings'] = \ message_dict['partner_trackings'] = \
partner_trackings[mail_message_id] partner_trackings[mail_message_id]
return res return res
@api.multi
def toggle_tracking_status(self):
"""Toggle message tracking action needed to ignore them in the tracking
issues filter"""
# a user should always be able to star a message he can read
self.check_access_rule('read')
self.track_needs_action = not self.track_needs_action

View File

@ -4,6 +4,7 @@
from odoo import models, api, _ from odoo import models, api, _
from email.utils import getaddresses from email.utils import getaddresses
from odoo.tools import email_split_and_format from odoo.tools import email_split_and_format
from lxml import etree
class MailThread(models.AbstractModel): class MailThread(models.AbstractModel):
@ -46,4 +47,33 @@ class MailThread(models.AbstractModel):
partner = ResPartnerObj.browse(partner_id, self._prefetch) partner = ResPartnerObj.browse(partner_id, self._prefetch)
record._message_add_suggested_recipient( record._message_add_suggested_recipient(
res, partner=partner, reason=_('Cc')) res, partner=partner, reason=_('Cc'))
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False,
submenu=False):
"""Add a filter to any model with mail.thread that will show up records
with tracking errors.
"""
res = super().fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar,
submenu=submenu)
if view_type != 'search':
return res
eview = etree.fromstring(res['arch'])
search_view = eview.xpath("//search")
filter_name = "message_ids_with_tracking_errors"
tracking_error_domain = """[
("message_ids.tracking_ids.state", "in",
"['error, 'rejected', 'spam', 'bounced', 'soft-bounced']"),
("message_ids.track_needs_action", "=", True)
]"""
new_filter = etree.Element(
'filter', {
'string': _('Messages with errors'),
'name': filter_name,
'domain': tracking_error_domain})
separator = etree.Element('separator', {})
new_filter.append(separator)
search_view.append(new_filter)
res['arch'] = etree.tostring(eview)
return res return res

View File

@ -19,12 +19,23 @@ odoo.define('mail_tracking.partner_tracking', function (require) {
msg.partner_trackings = data.partner_trackings || []; msg.partner_trackings = data.partner_trackings || [];
return msg; return msg;
}; };
chat_manager.toggle_tracking_status = function (message_id) {
return this._rpc({
model: 'mail.message',
method: 'toggle_tracking_status',
args: [[message_id]],
});
},
ChatThread.include({ ChatThread.include({
events: _.extend(ChatThread.prototype.events, { events: _.extend(ChatThread.prototype.events, {
'click .o_mail_action_tracking_partner': 'click .o_mail_action_tracking_partner':
'on_tracking_partner_click', 'on_tracking_partner_click',
'click .o_mail_action_tracking_status': 'on_tracking_status_click', 'click .o_mail_action_tracking_status': 'on_tracking_status_click',
'click .o_thread_message_tracking': function (event) {
var message_id = $(event.currentTarget).data('message-id');
this.trigger("toggle_tracking_status", message_id);
},
}), }),
_preprocess_message: function () { _preprocess_message: function () {
var msg = this._super.apply(this, arguments); var msg = this._super.apply(this, arguments);

View File

@ -47,6 +47,10 @@
</t> </t>
<t t-extend="mail.ChatThread.Message"> <t t-extend="mail.ChatThread.Message">
<t t-jquery="span[class='o_thread_icons']" t-operation="inside">
<i t-att-class="'fa fa-lg o_thread_icon o_thread_message_tracking ' + (message.track_needs_action ? 'fa-check-square' : 'fa-square-o')"
t-att-data-message-id="message.id" title="Trackin reviewed"/>
</t>
<t t-jquery="p[class='o_mail_info']" t-operation="after"> <t t-jquery="p[class='o_mail_info']" t-operation="after">
<p class="o_mail_tracking"> <p class="o_mail_tracking">
<strong>To:</strong> <strong>To:</strong>