diff options
| author | Thibault Delavallée <tde@openerp.com> | 2014-03-17 15:32:31 +0100 |
|---|---|---|
| committer | Thibault Delavallée <tde@openerp.com> | 2014-03-17 15:32:31 +0100 |
| commit | 11a1c91c5593f7ce89f6965affcd021158f303ed (patch) | |
| tree | 179298f914dafa72c37a325dba6f59f4f2c9874d /addons/mass_mailing/models/mail_thread.py | |
| parent | 86934c116736dcec9249e64d8fa7ff6a735a3b48 (diff) | |
[REF] mass_mailing: moved files in models/data/views directories.
bzr revid: tde@openerp.com-20140317143231-4jp3egoqvolenwxs
Diffstat (limited to 'addons/mass_mailing/models/mail_thread.py')
| -rw-r--r-- | addons/mass_mailing/models/mail_thread.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/addons/mass_mailing/models/mail_thread.py b/addons/mass_mailing/models/mail_thread.py new file mode 100644 index 00000000000..a4ff15a1a3f --- /dev/null +++ b/addons/mass_mailing/models/mail_thread.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/> +# +############################################################################## + +import logging + +from openerp import tools +from openerp.addons.mail.mail_message import decode +from openerp.addons.mail.mail_thread import decode_header +from openerp.osv import osv + +_logger = logging.getLogger(__name__) + + +class MailThread(osv.Model): + """ Update MailThread to add the feature of bounced emails and replied emails + in message_process. """ + _name = 'mail.thread' + _inherit = ['mail.thread'] + + def message_route_check_bounce(self, cr, uid, message, context=None): + """ Override to verify that the email_to is the bounce alias. If it is the + case, log the bounce, set the parent and related document as bounced and + return False to end the routing process. """ + bounce_alias = self.pool['ir.config_parameter'].get_param(cr, uid, "mail.bounce.alias", context=context) + message_id = message.get('Message-Id') + email_from = decode_header(message, 'From') + email_to = decode_header(message, 'To') + + # 0. Verify whether this is a bounced email (wrong destination,...) -> use it to collect data, such as dead leads + if bounce_alias in email_to: + bounce_match = tools.bounce_re.search(email_to) + if bounce_match: + bounced_model, bounced_thread_id = None, False + bounced_mail_id = bounce_match.group(1) + stat_ids = self.pool['mail.mail.statistics'].set_bounced(cr, uid, mail_mail_ids=[bounced_mail_id], context=context) + for stat in self.pool['mail.mail.statistics'].browse(cr, uid, stat_ids, context=context): + bounced_model = stat.model + bounced_thread_id = stat.res_id + _logger.info('Routing mail from %s to %s with Message-Id %s: bounced mail from mail %s, model: %s, thread_id: %s', + email_from, email_to, message_id, bounced_mail_id, bounced_model, bounced_thread_id) + if bounced_model and bounced_model in self.pool and hasattr(self.pool[bounced_model], 'message_receive_bounce') and bounced_thread_id: + self.pool[bounced_model].message_receive_bounce(cr, uid, [bounced_thread_id], mail_id=bounced_mail_id, context=context) + return False + + return True + + def message_route(self, cr, uid, message, message_dict, model=None, thread_id=None, + custom_values=None, context=None): + if not self.message_route_check_bounce(cr, uid, message, context=context): + return [] + return super(MailThread, self).message_route(cr, uid, message, message_dict, model, thread_id, custom_values, context) + + def message_receive_bounce(self, cr, uid, ids, mail_id=None, context=None): + """Called by ``message_process`` when a bounce email (such as Undelivered + Mail Returned to Sender) is received for an existing thread. The default + behavior is to check is an integer ``message_bounce`` column exists. + If it is the case, its content is incremented. """ + if self._all_columns.get('message_bounce'): + for obj in self.browse(cr, uid, ids, context=context): + self.write(cr, uid, [obj.id], {'message_bounce': obj.message_bounce + 1}, context=context) + + def message_route_process(self, cr, uid, message, message_dict, routes, context=None): + """ Override to update the parent mail statistics. The parent is found + by using the References header of the incoming message and looking for + matching message_id in mail.mail.statistics. """ + if message.get('References'): + message_ids = [x.strip() for x in decode(message['References']).split()] + self.pool['mail.mail.statistics'].set_replied(cr, uid, mail_message_ids=message_ids, context=context) + return super(MailThread, self).message_route_process(cr, uid, message, message_dict, routes, context=context) |
