From 4ba77c52f5d3287e7233eca604f2a086e3f29f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 9 Sep 2019 15:49:03 +0000 Subject: [PATCH] [FIX] phone_validation: fix MRO issue with phone.validation.mixin Issue is that when a model inherits from phone.Validation.mixin, then from mail.thread.phone (which inherits from phone.validation.mixin) we have an issue : TypeError: Cannot create a consistent method resolution order (MRO) for bases BaseModel, base, mail.thread, phone.validation.mixin, mail.thread.phone As fixing it could be complicated we have a way to avoid it: move conflicting code as it is used only in mail.thread.phone . In this commit we also import a file forgotten at d2809cbd941b20928cd1e48c50c1339888853d98 which triggers the issue itself. Task 2063049 (bug spotted) Task 2061765 (triggering the issue) closes odoo/odoo#36580 Signed-off-by: Thibault Delavallee (tde) --- addons/phone_validation/models/__init__.py | 1 + .../models/mail_thread_phone.py | 22 ++++++++++++++++++- .../models/phone_validation_mixin.py | 19 ---------------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/addons/phone_validation/models/__init__.py b/addons/phone_validation/models/__init__.py index ba75abd0ddb..1402c4c2c28 100644 --- a/addons/phone_validation/models/__init__.py +++ b/addons/phone_validation/models/__init__.py @@ -4,3 +4,4 @@ from . import phone_blacklist from . import phone_validation_mixin from . import mail_thread_phone +from . import res_partner diff --git a/addons/phone_validation/models/mail_thread_phone.py b/addons/phone_validation/models/mail_thread_phone.py index 3e166985f8e..f13161ad447 100644 --- a/addons/phone_validation/models/mail_thread_phone.py +++ b/addons/phone_validation/models/mail_thread_phone.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import api, fields, models, _ +from odoo.addons.phone_validation.tools import phone_validation from odoo.exceptions import UserError @@ -24,7 +25,7 @@ class PhoneMixin(models.AbstractModel): """ _name = 'mail.thread.phone' _description = 'Phone Blacklist Mixin' - _inherit = ['mail.thread', 'phone.validation.mixin'] + _inherit = ['mail.thread'] phone_sanitized = fields.Char( string='Sanitized Number', compute="_compute_phone_sanitized", compute_sudo=True, store=True, @@ -96,6 +97,25 @@ class PhoneMixin(models.AbstractModel): send an SMS on a record. """ return [] + def _phone_get_country_field(self): + if 'country_id' in self: + return 'country_id' + return False + + def phone_get_sanitized_numbers(self, number_fname='mobile', force_format='E164'): + res = dict.fromkeys(self.ids, False) + country_fname = self._phone_get_country_field() + for record in self: + number = record[number_fname] + res[record.id] = phone_validation.phone_sanitize_numbers_w_record([number], record, record_country_fname=country_fname, force_format=force_format)[number]['sanitized'] + return res + + def phone_get_sanitized_number(self, number_fname='mobile', force_format='E164'): + self.ensure_one() + country_fname = self._phone_get_country_field() + number = self[number_fname] + return phone_validation.phone_sanitize_numbers_w_record([number], self, record_country_fname=country_fname, force_format=force_format)[number]['sanitized'] + def _phone_set_blacklisted(self): return self.env['phone.blacklist'].sudo()._add([r.phone_sanitized for r in self]) diff --git a/addons/phone_validation/models/phone_validation_mixin.py b/addons/phone_validation/models/phone_validation_mixin.py index 10eccb9b307..a430a537c21 100644 --- a/addons/phone_validation/models/phone_validation_mixin.py +++ b/addons/phone_validation/models/phone_validation_mixin.py @@ -9,11 +9,6 @@ class PhoneValidationMixin(models.AbstractModel): _name = 'phone.validation.mixin' _description = 'Phone Validation Mixin' - def _phone_get_country_field(self): - if 'country_id' in self: - return 'country_id' - return False - def _phone_get_country(self): if 'country_id' in self and self.country_id: return self.country_id @@ -30,17 +25,3 @@ class PhoneValidationMixin(models.AbstractModel): force_format='INTERNATIONAL', raise_exception=False ) - - def phone_get_sanitized_numbers(self, number_fname='mobile', force_format='E164'): - res = dict.fromkeys(self.ids, False) - country_fname = self._phone_get_country_field() - for record in self: - number = record[number_fname] - res[record.id] = phone_validation.phone_sanitize_numbers_w_record([number], record, record_country_fname=country_fname, force_format=force_format)[number]['sanitized'] - return res - - def phone_get_sanitized_number(self, number_fname='mobile', force_format='E164'): - self.ensure_one() - country_fname = self._phone_get_country_field() - number = self[number_fname] - return phone_validation.phone_sanitize_numbers_w_record([number], self, record_country_fname=country_fname, force_format=force_format)[number]['sanitized']