From 0fd2b031ef4970cd7bb534437422295ddbf12307 Mon Sep 17 00:00:00 2001 From: David Date: Mon, 19 Mar 2018 16:41:26 +0100 Subject: [PATCH] [MIG] mail_tracking: Migration to 11.0 --- mail_tracking/README.rst | 11 +- mail_tracking/__init__.py | 3 - mail_tracking/__manifest__.py | 8 +- mail_tracking/controllers/__init__.py | 3 - mail_tracking/controllers/main.py | 9 +- mail_tracking/data/tracking_data.xml | 2 +- mail_tracking/hooks.py | 3 +- mail_tracking/models/__init__.py | 3 - mail_tracking/models/ir_mail_server.py | 18 +- mail_tracking/models/mail_mail.py | 3 +- mail_tracking/models/mail_message.py | 3 +- mail_tracking/models/mail_tracking_email.py | 24 +-- mail_tracking/models/mail_tracking_event.py | 3 +- mail_tracking/models/res_partner.py | 3 +- .../security/mail_tracking_email_security.xml | 2 +- .../static/src/css/mail_tracking.css | 2 +- mail_tracking/static/src/js/mail_tracking.js | 163 ++++++++---------- .../static/src/xml/mail_tracking.xml | 4 +- mail_tracking/tests/__init__.py | 2 +- mail_tracking/tests/test_mail_tracking.py | 13 +- mail_tracking/views/assets.xml | 2 +- .../views/mail_tracking_email_view.xml | 2 +- .../views/mail_tracking_event_view.xml | 2 +- mail_tracking/views/res_partner_view.xml | 2 +- 24 files changed, 122 insertions(+), 168 deletions(-) diff --git a/mail_tracking/README.rst b/mail_tracking/README.rst index 3eb00cc7..cd16fd36 100644 --- a/mail_tracking/README.rst +++ b/mail_tracking/README.rst @@ -10,7 +10,6 @@ This module shows email notification tracking status for any messages in mail thread (chatter). Each notified partner will have an intuitive icon just right to his name. - Installation ============ @@ -20,7 +19,6 @@ you need to add ``mail_tracking`` addon to wide load addons list (by default, only ``web`` addon), setting ``--load`` option. For example, ``--load=web,mail_tracking`` - Usage ===== @@ -63,7 +61,7 @@ These are all available status icons: .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/205/10.0 + :target: https://runbot.odoo-community.org/runbot/205/11.0 If you want to see all tracking emails and events you can go to @@ -93,8 +91,11 @@ Images Contributors ------------ -* Pedro M. Baeza -* Antonio Espinosa +* `Tecnativa `_: + + * Pedro M. Baeza + * Antonio Espinosa + * David Vidal Maintainer ---------- diff --git a/mail_tracking/__init__.py b/mail_tracking/__init__.py index e32deff2..919fa6ef 100644 --- a/mail_tracking/__init__.py +++ b/mail_tracking/__init__.py @@ -1,7 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -# flake8: noqa from . import models from . import controllers diff --git a/mail_tracking/__manifest__.py b/mail_tracking/__manifest__.py index dac53f67..6abefc03 100644 --- a/mail_tracking/__manifest__.py +++ b/mail_tracking/__manifest__.py @@ -1,13 +1,13 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - +# Copyright 2016 Antonio Espinosa - +# Copyright 2018 David Vidal - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Email tracking", "summary": "Email tracking system for all mails sent", - "version": "10.0.1.1.1", + "version": "11.0.1.0.0", "category": "Social Network", - "website": "http://www.tecnativa.com", + "website": "http://github.com/OCA/social", "author": "Tecnativa, " "Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/mail_tracking/controllers/__init__.py b/mail_tracking/controllers/__init__.py index 73e11057..2a06c0b7 100644 --- a/mail_tracking/controllers/__init__.py +++ b/mail_tracking/controllers/__init__.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -# flake8: noqa from . import main diff --git a/mail_tracking/controllers/main.py b/mail_tracking/controllers/main.py index 9be9730c..1b00616b 100644 --- a/mail_tracking/controllers/main.py +++ b/mail_tracking/controllers/main.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - +# Copyright 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import werkzeug @@ -8,7 +7,7 @@ from odoo import api, http, registry, SUPERUSER_ID import logging _logger = logging.getLogger(__name__) -BLANK = 'R0lGODlhAQABAIAAANvf7wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==' +BLANK = b'R0lGODlhAQABAIAAANvf7wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==' def _env_get(db, callback, tracking_id, event_type, **kw): @@ -22,7 +21,7 @@ def _env_get(db, callback, tracking_id, event_type, **kw): reg = registry(db) except OperationalError: _logger.warning("Selected BD '%s' not found", db) - except: # pragma: no cover + except Exception: # pragma: no cover _logger.warning("Selected BD '%s' connection error", db) if reg: _logger.info("New environment for database '%s'", db) @@ -83,5 +82,5 @@ class MailTrackingController(http.Controller): # Always return GIF blank image response = werkzeug.wrappers.Response() response.mimetype = 'image/gif' - response.data = BLANK.decode('base64') + response.data = BLANK return response diff --git a/mail_tracking/data/tracking_data.xml b/mail_tracking/data/tracking_data.xml index 320ca782..1ab193b8 100644 --- a/mail_tracking/data/tracking_data.xml +++ b/mail_tracking/data/tracking_data.xml @@ -1,5 +1,5 @@ - diff --git a/mail_tracking/hooks.py b/mail_tracking/hooks.py index 8d3dc43d..afe6e657 100644 --- a/mail_tracking/hooks.py +++ b/mail_tracking/hooks.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - +# Copyright 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import logging diff --git a/mail_tracking/models/__init__.py b/mail_tracking/models/__init__.py index 42a28f51..f0ebf2ac 100644 --- a/mail_tracking/models/__init__.py +++ b/mail_tracking/models/__init__.py @@ -1,7 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -# flake8: noqa from . import ir_mail_server from . import mail_mail diff --git a/mail_tracking/models/ir_mail_server.py b/mail_tracking/models/ir_mail_server.py index f6eae129..8902ac06 100644 --- a/mail_tracking/models/ir_mail_server.py +++ b/mail_tracking/models/ir_mail_server.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - +# Copyright 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import re @@ -20,16 +19,10 @@ class IrMailServer(models.Model): def _tracking_email_id_body_get(self, body): body = body or '' - tracking_email_id = False # https://regex101.com/r/lW4cB1/2 match = re.search( r']*data-odoo-tracking-email=["\']([0-9]*)["\']', body) - if match: - try: - tracking_email_id = int(match.group(1)) - except: # pragma: no cover - pass - return tracking_email_id + return int(match.group(1)) if match.group(1) else False def build_email(self, email_from, email_to, subject, body, email_cc=None, email_bcc=None, reply_to=False, attachments=None, @@ -64,14 +57,14 @@ class IrMailServer(models.Model): mail_server = mail_server_ids[0] if mail_server_ids else None if mail_server: smtp_server_used = mail_server.smtp_host - else: # pragma: no cover + else: smtp_server_used = smtp_server or tools.config.get('smtp_server') return smtp_server_used @api.model def send_email(self, message, mail_server_id=None, smtp_server=None, smtp_port=None, smtp_user=None, smtp_password=None, - smtp_encryption=None, smtp_debug=False): + smtp_encryption=None, smtp_debug=False, smtp_session=None): message_id = False tracking_email = self._tracking_email_get(message) smtp_server_used = self.sudo()._smtp_server_get( @@ -82,7 +75,8 @@ class IrMailServer(models.Model): message, mail_server_id=mail_server_id, smtp_server=smtp_server, smtp_port=smtp_port, smtp_user=smtp_user, smtp_password=smtp_password, - smtp_encryption=smtp_encryption, smtp_debug=smtp_debug) + smtp_encryption=smtp_encryption, smtp_debug=smtp_debug, + smtp_session=smtp_session) except Exception as e: if tracking_email: tracking_email.smtp_error(self, smtp_server_used, e) diff --git a/mail_tracking/models/mail_mail.py b/mail_tracking/models/mail_mail.py index 58df1385..2625f4c3 100644 --- a/mail_tracking/models/mail_mail.py +++ b/mail_tracking/models/mail_mail.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - +# Copyright 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import time diff --git a/mail_tracking/models/mail_message.py b/mail_tracking/models/mail_message.py index da24ecce..a6bcc683 100644 --- a/mail_tracking/models/mail_message.py +++ b/mail_tracking/models/mail_message.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - +# Copyright 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import models, api diff --git a/mail_tracking/models/mail_tracking_email.py b/mail_tracking/models/mail_tracking_email.py index e7ca6516..f9a3e03f 100644 --- a/mail_tracking/models/mail_tracking_email.py +++ b/mail_tracking/models/mail_tracking_email.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - +# Copyright 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import logging -import urlparse +import urllib.parse import time import re from datetime import datetime @@ -93,27 +92,20 @@ class MailTrackingEmail(models.Model): string="Tracking events", comodel_name='mail.tracking.event', inverse_name='tracking_email_id', readonly=True) - @api.model - def _email_score_tracking_filter(self, domain, order='time desc', - limit=10): - """Default tracking search. Ready to be inherited.""" - return self.search(domain, limit=limit, order=order) - @api.model def email_is_bounced(self, email): if email: - return len(self._email_score_tracking_filter([ + return self.search_count([ ('recipient_address', '=', email.lower()), ('state', 'in', ('error', 'rejected', 'spam', 'bounced')), - ])) > 0 + ]) > 0 return False @api.model def email_score_from_email(self, email): if email: - return self._email_score_tracking_filter([ - ('recipient_address', '=', email.lower()) - ]).email_score() + return self.search([ + ('recipient_address', '=', email.lower())]).email_score() return 0. @api.model @@ -183,7 +175,7 @@ class MailTrackingEmail(models.Model): 'db': self.env.cr.dbname, 'tracking_email_id': self.id, }) - track_url = urlparse.urljoin(base_url, path_url) + track_url = urllib.parse.urljoin(base_url, path_url) return ( '' % { @@ -197,7 +189,7 @@ class MailTrackingEmail(models.Model): if event and event.recipient_address: recipients.append(event.recipient_address) else: - recipients = list(filter(None, self.mapped('recipient_address'))) + recipients = [x for x in self.mapped('recipient_address') if x] for recipient in recipients: self.env['res.partner'].search([ ('email', '=ilike', recipient) diff --git a/mail_tracking/models/mail_tracking_event.py b/mail_tracking/models/mail_tracking_event.py index d4c62c49..e3deab8e 100644 --- a/mail_tracking/models/mail_tracking_event.py +++ b/mail_tracking/models/mail_tracking_event.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - +# Copyright 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import re diff --git a/mail_tracking/models/res_partner.py b/mail_tracking/models/res_partner.py index 5d10ac81..6c6a319b 100644 --- a/mail_tracking/models/res_partner.py +++ b/mail_tracking/models/res_partner.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Antonio Espinosa - +# Copyright 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import models, api, fields diff --git a/mail_tracking/security/mail_tracking_email_security.xml b/mail_tracking/security/mail_tracking_email_security.xml index 3928ff7f..306851f1 100644 --- a/mail_tracking/security/mail_tracking_email_security.xml +++ b/mail_tracking/security/mail_tracking_email_security.xml @@ -1,5 +1,5 @@ - diff --git a/mail_tracking/static/src/css/mail_tracking.css b/mail_tracking/static/src/css/mail_tracking.css index bca73d3a..9f372225 100644 --- a/mail_tracking/static/src/css/mail_tracking.css +++ b/mail_tracking/static/src/css/mail_tracking.css @@ -1,4 +1,4 @@ -/* © 2016 Antonio Espinosa - +/* Copyright 2016 Antonio Espinosa - License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). */ .mail_tracking span { diff --git a/mail_tracking/static/src/js/mail_tracking.js b/mail_tracking/static/src/js/mail_tracking.js index 7932bf8f..a06da95e 100644 --- a/mail_tracking/static/src/js/mail_tracking.js +++ b/mail_tracking/static/src/js/mail_tracking.js @@ -1,98 +1,83 @@ -/* © 2016 Antonio Espinosa - +/* Copyright 2016 Antonio Espinosa - + Copyright 2018 David Vidal - License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). */ odoo.define('mail_tracking.partner_tracking', function(require){ -"use strict"; + "use strict"; -var core = require('web.core'); -var session = require('web.session'); -var Model = require('web.Model'); -var ActionManager = require('web.ActionManager'); -var ChatThread = require('mail.ChatThread'); + var core = require('web.core'); + var session = require('web.session'); + var data = require('web.data'); + var ActionManager = require('web.ActionManager'); + var chat_manager = require('mail.chat_manager'); + var ChatThread = require('mail.ChatThread'); + var Chatter = require('mail.Chatter'); -var _t = core._t; -var MessageModel = new Model('mail.message', session.context); + var _t = core._t; - -ChatThread.include({ - _preprocess_message: function (message) { - var msg = this._super.apply(this, arguments); - msg.partner_trackings = msg.partner_trackings || []; + // chat_manager is a simple dictionary, not an OdooClass + chat_manager._make_message_super = chat_manager.make_message; + chat_manager.make_message = function(data) { + var msg = this._make_message_super(data); + msg.partner_trackings = data.partner_trackings || []; return msg; - }, - on_tracking_partner_click: function (event) { - var partner_id = this.$el.find(event.currentTarget).data('partner'); - var state = { - 'model': 'res.partner', - 'id': partner_id, - 'title': _t("Tracking partner"), - }; - event.preventDefault(); - this.action_manager.do_push_state(state); - var action = { - type:'ir.actions.act_window', - view_type: 'form', - view_mode: 'form', - res_model: 'res.partner', - views: [[false, 'form']], - target: 'current', - res_id: partner_id, - }; - this.do_action(action); - }, - on_tracking_status_click: function (event) { - var tracking_email_id = $(event.currentTarget).data('tracking'); - var state = { - 'model': 'mail.tracking.email', - 'id': tracking_email_id, - 'title': _t("Message tracking"), - }; - event.preventDefault(); - this.action_manager.do_push_state(state); - var action = { - type:'ir.actions.act_window', - view_type: 'form', - view_mode: 'form', - res_model: 'mail.tracking.email', - views: [[false, 'form']], - target: 'new', - res_id: tracking_email_id, - }; - this.do_action(action); - }, - bind_events: function () { - this.$el.on('click', '.o_mail_action_tracking_partner', - this.on_tracking_partner_click); - this.$el.on('click', '.o_mail_action_tracking_status', - this.on_tracking_status_click); - }, - init: function (parent, options) { - this._super.apply(this, arguments); - this.action_manager = this.findAncestor(function(ancestor){ - return ancestor instanceof ActionManager; - }); - }, - start: function () { - this._super(); - this.bind_events(); - }, - render: function(messages, options) { - var self = this, render_super = this._super, - msgs = {}, - msg_ids = []; - // Update trackings (async) each time we re-render thread - _.each(messages, function (message) { - msgs[message.id] = message; - msg_ids.push(message.id); - }); - MessageModel.call('tracking_status', [msg_ids]).then(function (trackings) { - _.each(trackings, function (tracking, id) { - msgs[id].partner_trackings = tracking; - }); - render_super.apply(self, [messages, options]); - }); - }, + }; + ChatThread.include({ + events: _.extend(ChatThread.prototype.events, { + 'click .o_mail_action_tracking_partner': 'on_tracking_partner_click', + 'click .o_mail_action_tracking_status': 'on_tracking_status_click', + }), + _preprocess_message: function (message) { + var msg = this._super.apply(this, arguments); + msg.partner_trackings = msg.partner_trackings || []; + return msg; + }, + on_tracking_partner_click: function (event) { + var partner_id = this.$el.find(event.currentTarget).data('partner'); + var state = { + 'model': 'res.partner', + 'id': partner_id, + 'title': _t("Tracking partner"), + }; + event.preventDefault(); + this.action_manager.do_push_state(state); + var action = { + type:'ir.actions.act_window', + view_type: 'form', + view_mode: 'form', + res_model: 'res.partner', + views: [[false, 'form']], + target: 'current', + res_id: partner_id, + }; + this.do_action(action); + }, + on_tracking_status_click: function (event) { + var tracking_email_id = $(event.currentTarget).data('tracking'); + var state = { + 'model': 'mail.tracking.email', + 'id': tracking_email_id, + 'title': _t("Message tracking"), + }; + event.preventDefault(); + this.action_manager.do_push_state(state); + var action = { + type:'ir.actions.act_window', + view_type: 'form', + view_mode: 'form', + res_model: 'mail.tracking.email', + views: [[false, 'form']], + target: 'new', + res_id: tracking_email_id, + }; + this.do_action(action); + }, + init: function (parent, options) { + this._super.apply(this, arguments); + this.action_manager = this.findAncestor(function(ancestor){ + return ancestor instanceof ActionManager; + }); + }, + }); }); - -}); // odoo.define diff --git a/mail_tracking/static/src/xml/mail_tracking.xml b/mail_tracking/static/src/xml/mail_tracking.xml index 68b5d12b..5bc278da 100644 --- a/mail_tracking/static/src/xml/mail_tracking.xml +++ b/mail_tracking/static/src/xml/mail_tracking.xml @@ -1,5 +1,5 @@ -