Browse Source

[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
14.0
Quentin Groulard 3 years ago
committed by Zar21
parent
commit
6b79fc2112
  1. 24
      partner_email_check/migrations/13.0.1.0.0/post-migration.py
  2. 1
      partner_email_check/models/__init__.py
  3. 18
      partner_email_check/models/res_company.py
  4. 36
      partner_email_check/models/res_config_settings.py
  5. 25
      partner_email_check/models/res_partner.py
  6. 42
      partner_email_check/tests/test_partner_email_check.py
  7. 14
      partner_email_check/views/base_config_view.xml

24
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()

1
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

18
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",
)

36
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,
)

25
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):

42
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(

14
partner_email_check/views/base_config_view.xml

@ -14,6 +14,13 @@
</div>
<div class="o_setting_right_pane">
<label for="partner_email_check_filter_duplicates" />
<span
class="fa fa-lg fa-building-o"
title="Values set here are company-specific."
aria-label="Values set here are company-specific."
groups="base.group_multi_company"
role="img"
/>
<div class="text-muted">
Require partner email addresses to be unique
</div>
@ -25,6 +32,13 @@
</div>
<div class="o_setting_right_pane">
<label for="partner_email_check_check_deliverability" />
<span
class="fa fa-lg fa-building-o"
title="Values set here are company-specific."
aria-label="Values set here are company-specific."
groups="base.group_multi_company"
role="img"
/>
<div class="text-muted">
Ensure that partner email addresses can be delivered to
</div>

Loading…
Cancel
Save