diff --git a/mail_tracking_mailgun/__manifest__.py b/mail_tracking_mailgun/__manifest__.py index 644d930eb..1e7267d4a 100644 --- a/mail_tracking_mailgun/__manifest__.py +++ b/mail_tracking_mailgun/__manifest__.py @@ -1,12 +1,12 @@ # Copyright 2016 Tecnativa - Antonio Espinosa # Copyright 2016 Tecnativa - Carlos Dauden # Copyright 2017 Tecnativa - Pedro M. Baeza -# Copyright 2017-18 Tecnativa - David Vidal +# Copyright 2017 Tecnativa - David Vidal # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { "name": "Mail tracking for Mailgun", "summary": "Mail tracking and Mailgun webhooks integration", - "version": "16.0.1.0.0", + "version": "17.0.1.0.0", "category": "Social Network", "website": "https://github.com/OCA/social", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/mail_tracking_mailgun/models/mail_tracking_email.py b/mail_tracking_mailgun/models/mail_tracking_email.py index 410f33cb0..45cb2c37c 100644 --- a/mail_tracking_mailgun/models/mail_tracking_email.py +++ b/mail_tracking_mailgun/models/mail_tracking_email.py @@ -78,8 +78,8 @@ class MailTrackingEmail(models.Model): if not api_key: raise ValidationError(_("There is no Mailgun API key!")) api_url = icp.get_param("mailgun.api_url", "https://api.mailgun.net/v3") - catchall_domain = icp.get_param("mail.catchall.domain") - domain = icp.get_param("mailgun.domain", catchall_domain) + catchall_domain = self.env["mail.alias.domain"].sudo().search([], limit=1).name + domain = icp.get_param("mailgun.domain", catchall_domain or "") if not domain: raise ValidationError(_("A Mailgun domain value is needed!")) validation_key = icp.get_param("mailgun.validation_key") diff --git a/mail_tracking_mailgun/models/res_partner.py b/mail_tracking_mailgun/models/res_partner.py index 597d2a3d4..af1168d40 100644 --- a/mail_tracking_mailgun/models/res_partner.py +++ b/mail_tracking_mailgun/models/res_partner.py @@ -27,16 +27,17 @@ class ResPartner(models.Model): if not partner.email: continue event = event or self.env["mail.tracking.event"] - event_str = """ - %s - """ % ( - event.id or 0, - event.id or _("unknown"), + event_str = ( + f'{event.id or _("unknown")}' ) body = _( - "Email has been bounced: %(email)s\nReason: %(reason)s\nEvent: %(event_str)s" - ) % ({"email": partner.email, "reason": reason, "event_str": event_str}) + "Email has been bounced: %(email)s\nReason: " + "%(reason)s\nEvent: %(event_str)s", + email=partner.email, + reason=reason, + event_str=event_str, + ) # This function can be called by the non user via the callback_method set in # /mail/tracking/mailgun/all/. A sudo() is not enough to succesfully send # the bounce message in this circumstances. @@ -147,7 +148,7 @@ class ResPartner(models.Model): ) for partner in self: res = requests.get( - urljoin(api_url, "/v3/%s/bounces/%s" % (domain, partner.email)), + urljoin(api_url, f"/v3/{domain}/bounces/{partner.email}"), auth=("api", api_key), timeout=timeout, ) @@ -172,7 +173,7 @@ class ResPartner(models.Model): ) for partner in self: res = requests.post( - urljoin(api_url, "/v3/%s/bounces" % domain), + urljoin(api_url, "/v3/{domain}/bounces"), auth=("api", api_key), data={"address": partner.email}, timeout=timeout, @@ -195,7 +196,7 @@ class ResPartner(models.Model): ) for partner in self: res = requests.delete( - urljoin(api_url, "/v3/%s/bounces/%s" % (domain, partner.email)), + urljoin(api_url, f"/v3/{domain}/bounces/{partner.email}"), auth=("api", api_key), timeout=timeout, ) diff --git a/mail_tracking_mailgun/tests/test_mailgun.py b/mail_tracking_mailgun/tests/test_mailgun.py index 97433c19a..7f1a1859f 100644 --- a/mail_tracking_mailgun/tests/test_mailgun.py +++ b/mail_tracking_mailgun/tests/test_mailgun.py @@ -44,13 +44,14 @@ class TestMailgun(TransactionCase): ) return mail, tracking_email - def setUp(self): - super().setUp() - self.recipient = "to@example.com" - self.mail, self.tracking_email = self.mail_send() - self.domain = "example.com" + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.recipient = "to@example.com" + cls.mail, cls.tracking_email = cls.mail_send(cls) + cls.domain = "example.com" # Configure Mailgun through GUI - cf = Form(self.env["res.config.settings"]) + cf = Form(cls.env["res.config.settings"]) cf.mail_tracking_mailgun_enabled = True cf.mail_tracking_mailgun_api_key = ( cf.mail_tracking_mailgun_webhook_signing_key @@ -61,14 +62,17 @@ class TestMailgun(TransactionCase): config = cf.save() # Done this way as `hr_expense` adds this field again as readonly, and thus Form # doesn't process it correctly - config.alias_domain = self.domain + # Catchall + Alias + cls.alias_domain = cls.env["mail.alias.domain"].create( + {"catchall_alias": "TheCatchall", "name": cls.domain} + ) config.execute() - self.token = "f1349299097a51b9a7d886fcb5c2735b426ba200ada6e9e149" - self.timestamp = "1471021089" - self.signature = ( + cls.token = "f1349299097a51b9a7d886fcb5c2735b426ba200ada6e9e149" + cls.timestamp = "1471021089" + cls.signature = ( "4fb6d4dbbe10ce5d620265dcd7a3c0b8" "ca0dede1433103891bc1ae4086e9d5b2" ) - self.event = { + cls.event = { "log-level": "info", "id": "oXAVv5URCF-dKv8c6Sa7T", "timestamp": 1471021089.0, @@ -83,21 +87,21 @@ class TestMailgun(TransactionCase): "event": "delivered", "recipient": "to@example.com", "user-variables": { - "odoo_db": self.env.cr.dbname, - "tracking_email_id": self.tracking_email.id, + "odoo_db": cls.env.cr.dbname, + "tracking_email_id": cls.tracking_email.id, }, } - self.metadata = { + cls.metadata = { "ip": "127.0.0.1", "user_agent": False, "os_family": False, "ua_family": False, } - self.partner = self.env["res.partner"].create( + cls.partner = cls.env["res.partner"].create( {"name": "Mr. Odoo", "email": "mrodoo@example.com"} ) - self.response = {"items": [self.event]} - self.MailTrackingController = MailTrackingController() + cls.response = {"items": [cls.event]} + cls.MailTrackingController = MailTrackingController() @contextmanager def _request_mock(self, reset_replay_cache=True): @@ -138,10 +142,14 @@ class TestMailgun(TransactionCase): self.env["mail.tracking.email"]._mailgun_values() def test_no_domain(self): - self.env["ir.config_parameter"].set_param("mail.catchall.domain", "") + # Avoid pre-existing domains + self.env["mail.alias"].search( + [("alias_domain_id", "!=", False)] + ).alias_domain_id = False + self.env["mail.alias.domain"].search([]).unlink() with self.assertRaises(ValidationError): self.env["mail.tracking.email"]._mailgun_values() - # now we set an specific domain for Mailgun: + # Now we set an specific domain for Mailgun: # i.e: we configure new EU zone without loosing old domain statistics self.env["ir.config_parameter"].set_param("mailgun.domain", "eu.example.com") self.test_event_delivered() @@ -295,7 +303,7 @@ class TestMailgun(TransactionCase): ua_type = "browser" self.event.update( { - "event": "unsubscribed", + "event": "unsub", "city": "Mountain View", "country": "US", "region": "CA", diff --git a/mail_tracking_mailgun/views/mail_tracking_email.xml b/mail_tracking_mailgun/views/mail_tracking_email.xml index f3efc6505..6e2f53b49 100644 --- a/mail_tracking_mailgun/views/mail_tracking_email.xml +++ b/mail_tracking_mailgun/views/mail_tracking_email.xml @@ -12,7 +12,7 @@ name="action_manual_check_mailgun" type="object" string="Re-sync Mailgun" - attrs="{'invisible': [('message_id', '=', False)]}" + invisible="not message_id" /> diff --git a/mail_tracking_mailgun/views/res_partner.xml b/mail_tracking_mailgun/views/res_partner.xml index 889183952..93dddbc89 100644 --- a/mail_tracking_mailgun/views/res_partner.xml +++ b/mail_tracking_mailgun/views/res_partner.xml @@ -14,12 +14,9 @@