From 6b79fc2112de350fde5c00c481bb5192386b8738 Mon Sep 17 00:00:00 2001 From: Quentin Groulard Date: Mon, 5 Jul 2021 18:16:49 +0200 Subject: [PATCH] [FIX] Remove email from copy data if duplicates not allowed [REF] Partner email chack params on company [IMP] email_check [IMP] test partner_email_check use SavepointCase --- .../migrations/13.0.1.0.0/post-migration.py | 24 +++++++++++ partner_email_check/models/__init__.py | 1 + partner_email_check/models/res_company.py | 18 ++++++++ .../models/res_config_settings.py | 36 ++-------------- partner_email_check/models/res_partner.py | 25 ++++++----- .../tests/test_partner_email_check.py | 42 ++++++++----------- .../views/base_config_view.xml | 14 +++++++ 7 files changed, 90 insertions(+), 70 deletions(-) create mode 100644 partner_email_check/migrations/13.0.1.0.0/post-migration.py create mode 100644 partner_email_check/models/res_company.py diff --git a/partner_email_check/migrations/13.0.1.0.0/post-migration.py b/partner_email_check/migrations/13.0.1.0.0/post-migration.py new file mode 100644 index 000000000..08c9e3fac --- /dev/null +++ b/partner_email_check/migrations/13.0.1.0.0/post-migration.py @@ -0,0 +1,24 @@ +# Copyright 2021 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + + +@openupgrade.migrate(use_env=True) +def migrate(env, version): + param_duplicate = env["ir.config_parameter"].search( + [("key", "=", "partner_email_check_filter_duplicates")] + ) + if param_duplicate: + env["res.company"].search([]).write( + {"partner_email_check_filter_duplicates": param_duplicate.value} + ) + param_duplicate.unlink() + param_deliverability = env["ir.config_parameter"].search( + [("key", "=", "partner_email_check_check_deliverability")] + ) + if param_deliverability: + env["res.company"].search([]).write( + {"partner_email_check_check_deliverability": param_deliverability.value} + ) + param_deliverability.unlink() diff --git a/partner_email_check/models/__init__.py b/partner_email_check/models/__init__.py index cf1724192..9483b9bfe 100644 --- a/partner_email_check/models/__init__.py +++ b/partner_email_check/models/__init__.py @@ -1,4 +1,5 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import res_company from . import res_config_settings from . import res_partner diff --git a/partner_email_check/models/res_company.py b/partner_email_check/models/res_company.py new file mode 100644 index 000000000..7bcf0c88d --- /dev/null +++ b/partner_email_check/models/res_company.py @@ -0,0 +1,18 @@ +# Copyright 2021 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + + _inherit = "res.company" + + partner_email_check_filter_duplicates = fields.Boolean( + string="Filter duplicate partner email addresses", + help="Don't allow multiple partners to have the same email address.", + ) + partner_email_check_check_deliverability = fields.Boolean( + string="Check deliverability of email addresses", + help="Don't allow email addresses with providers that don't exist", + ) diff --git a/partner_email_check/models/res_config_settings.py b/partner_email_check/models/res_config_settings.py index 07e8b6769..dee2dd2fb 100644 --- a/partner_email_check/models/res_config_settings.py +++ b/partner_email_check/models/res_config_settings.py @@ -1,43 +1,13 @@ -from odoo import api, fields, models +from odoo import fields, models class ResConfigSettings(models.TransientModel): _inherit = "res.config.settings" partner_email_check_filter_duplicates = fields.Boolean( - string="Filter duplicate partner email addresses", - help="Don't allow multiple partners to have the same email address.", + related="company_id.partner_email_check_filter_duplicates", readonly=False, ) partner_email_check_check_deliverability = fields.Boolean( - string="Check deliverability of email addresses", - help="Don't allow email addresses with providers that don't exist", + related="company_id.partner_email_check_check_deliverability", readonly=False, ) - - @api.model - def get_values(self): - res = super(ResConfigSettings, self).get_values() - conf = self.env["ir.config_parameter"].sudo() - res.update( - partner_email_check_filter_duplicates=conf.get_param( - "partner_email_check_filter_duplicates", "False" - ) - == "True", - partner_email_check_check_deliverability=conf.get_param( - "partner_email_check_check_deliverability", "False" - ) - == "True", - ) - return res - - def set_values(self): - super(ResConfigSettings, self).set_values() - conf = self.env["ir.config_parameter"].sudo() - conf.set_param( - "partner_email_check_filter_duplicates", - self.partner_email_check_filter_duplicates, - ) - conf.set_param( - "partner_email_check_check_deliverability", - self.partner_email_check_check_deliverability, - ) diff --git a/partner_email_check/models/res_partner.py b/partner_email_check/models/res_partner.py index d0b0eede4..cb41c24f7 100644 --- a/partner_email_check/models/res_partner.py +++ b/partner_email_check/models/res_partner.py @@ -24,6 +24,13 @@ except ImportError: class ResPartner(models.Model): _inherit = "res.partner" + def copy_data(self, default=None): + res = super(ResPartner, self).copy_data(default=default) + if self._should_filter_duplicates(): + for copy_vals in res: + copy_vals.pop("email", None) + return res + @api.model def email_check(self, emails): if config["test_enable"] and not self.env.context.get( @@ -31,7 +38,9 @@ class ResPartner(models.Model): ): return emails return ",".join( - self._normalize_email(email.strip()) for email in emails.split(",") + self._normalize_email(email.strip()) + for email in emails.split(",") + if email.strip() ) @api.constrains("email") @@ -72,20 +81,10 @@ class ResPartner(models.Model): return result["local"].lower() + "@" + result["domain_i18n"] def _should_filter_duplicates(self): - conf = ( - self.env["ir.config_parameter"] - .sudo() - .get_param("partner_email_check_filter_duplicates", "False") - ) - return conf == "True" + return self.env.company.partner_email_check_filter_duplicates def _should_check_deliverability(self): - conf = ( - self.env["ir.config_parameter"] - .sudo() - .get_param("partner_email_check_check_deliverability", "False") - ) - return conf == "True" + return self.env.company.partner_email_check_check_deliverability @api.model def create(self, vals): diff --git a/partner_email_check/tests/test_partner_email_check.py b/partner_email_check/tests/test_partner_email_check.py index ef6f8a508..6b3c5b5b4 100644 --- a/partner_email_check/tests/test_partner_email_check.py +++ b/partner_email_check/tests/test_partner_email_check.py @@ -4,22 +4,22 @@ from unittest.mock import patch from odoo.exceptions import UserError, ValidationError -from odoo.tests.common import TransactionCase +from odoo.tests.common import SavepointCase from odoo.tools.misc import mute_logger -class TestPartnerEmailCheck(TransactionCase): - def setUp(self): - super(TestPartnerEmailCheck, self).setUp() +class TestPartnerEmailCheck(SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) # Checks are disabled during tests unless this key is set - self.res_partner = self.env["res.partner"].with_context( + cls.res_partner = cls.env["res.partner"].with_context( test_partner_email_check=True ) - self.test_partner = self.res_partner.create({"name": "test"}) - self.wizard = self.env["res.config.settings"].create({}) - self.wizard.partner_email_check_filter_duplicates = False - self.wizard.partner_email_check_check_deliverability = False - self.wizard.set_values() + cls.test_partner = cls.res_partner.create({"name": "test"}) + cls.env.company.partner_email_check_filter_duplicates = False + cls.env.company.partner_email_check_check_deliverability = False def test_bad_email(self): """Test rejection of bad emails.""" @@ -70,8 +70,7 @@ class TestPartnerEmailCheck(TransactionCase): ) def disallow_duplicates(self): - self.wizard.partner_email_check_filter_duplicates = True - self.wizard.set_values() + self.env.company.partner_email_check_filter_duplicates = True def test_duplicate_addresses_disallowed(self): self.disallow_duplicates() @@ -90,13 +89,18 @@ class TestPartnerEmailCheck(TransactionCase): with self.assertRaises(UserError): self.test_partner.email = "foo@bar.org,email@domain.tld" + def test_duplicate_addresses_disallowed_copy_partner(self): + self.disallow_duplicates() + self.test_partner.write({"email": "email@domain.tld"}) + partner_copy = self.test_partner.copy() + self.assertFalse(partner_copy.email) + def test_duplicate_addresses_allowed_by_default(self): self.res_partner.create({"name": "alsotest", "email": "email@domain.tld"}) self.test_partner.email = "email@domain.tld" def check_deliverability(self): - self.wizard.partner_email_check_check_deliverability = True - self.wizard.set_values() + self.env.company.partner_email_check_check_deliverability = True def test_deliverable_addresses_allowed(self): self.check_deliverability() @@ -112,16 +116,6 @@ class TestPartnerEmailCheck(TransactionCase): # See https://github.com/JoshData/python-email-validator/pull/30 self.test_partner.email = "cezrik@acoa.nrdkt" - def test_config_getters(self): - other_wizard = self.env["res.config.settings"].create({}) - self.assertFalse(other_wizard.partner_email_check_check_deliverability) - self.assertFalse(other_wizard.partner_email_check_filter_duplicates) - self.disallow_duplicates() - self.check_deliverability() - other_wizard = self.env["res.config.settings"].create({}) - self.assertTrue(other_wizard.partner_email_check_check_deliverability) - self.assertTrue(other_wizard.partner_email_check_filter_duplicates) - @mute_logger("odoo.addons.partner_email_check.models.res_partner") def test_lacking_dependency_does_not_halt_execution(self): with patch( diff --git a/partner_email_check/views/base_config_view.xml b/partner_email_check/views/base_config_view.xml index 1829b4490..1af3aed0f 100644 --- a/partner_email_check/views/base_config_view.xml +++ b/partner_email_check/views/base_config_view.xml @@ -14,6 +14,13 @@