From 764d5e1a1cbc6a30dc858acaf762b70ef7b5fed6 Mon Sep 17 00:00:00 2001 From: Sylvain GARANCHER Date: Tue, 8 Nov 2016 23:17:55 +0100 Subject: [PATCH] [FIX] We must now inherit from the base model, instead of monkey-patching --- base_phone/common.py | 71 +++++++++++++++++++++++++++++ base_phone/fields.py | 86 +---------------------------------- base_phone/models/__init__.py | 1 + base_phone/models/base.py | 31 +++++++++++++ 4 files changed, 104 insertions(+), 85 deletions(-) create mode 100644 base_phone/common.py create mode 100644 base_phone/models/base.py diff --git a/base_phone/common.py b/base_phone/common.py new file mode 100644 index 0000000..2ba4eec --- /dev/null +++ b/base_phone/common.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# © 2016 Akretion (http://www.akretion.com) +# Sébastien BEAU +# Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + +from . import fields as phone_fields +import logging +_logger = logging.getLogger(__name__) + +try: + import phonenumbers +except ImportError: + _logger.debug('Cannot `import phonenumbers`.') + + +def convert_phone_field(value, country_code): + _logger.debug( + 'convert_phone_field value=%s country=%s', value, country_code) + try: + res_parse = phonenumbers.parse( + value, country_code) + _logger.debug('res_parse=%s', res_parse) + new_value = phonenumbers.format_number( + res_parse, phonenumbers.PhoneNumberFormat.E164) + _logger.debug('new_value=%s', new_value) + except: + _logger.error( + "Cannot reformat the phone number '%s' to " + "international format with region=%s", + value, country_code) + new_value = value + return new_value + + +def convert_all_phone_fields(self, vals, fields_to_convert): + loc_vals = vals.copy() + for field in fields_to_convert: + country_key = self._fields[field].country_field + partner_key = self._fields[field].partner_field + country = False + if country_key: + if country_key in loc_vals: + country = self.env['res.country'].browse(vals[country_key]) + else: + country = self[country_key] + if partner_key and not country: + if partner_key in loc_vals: + partner = self.env['res.partner'].browse(vals[partner_key]) + else: + partner = self[partner_key] + if partner: + country = partner.country_id + if not country: + country = self.env.user.company_id.country_id + country_code = False + if country: + country_code = country.code.upper() + if loc_vals[field]: + loc_vals[field] = convert_phone_field( + loc_vals[field], country_code) + return loc_vals + + +def get_phone_fields(self, vals): + fields_to_convert = [] + for key in vals: + if isinstance(self._fields.get(key), phone_fields.Fax): + fields_to_convert.append(key) + return fields_to_convert diff --git a/base_phone/fields.py b/base_phone/fields.py index 6855624..eb1290b 100644 --- a/base_phone/fields.py +++ b/base_phone/fields.py @@ -5,7 +5,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import api, fields, models +from odoo import fields from operator import attrgetter import logging _logger = logging.getLogger(__name__) @@ -59,87 +59,3 @@ class Fax(fields.Char): class Phone(Fax): type = 'phone' - - -def convert_phone_field(value, country_code): - _logger.debug( - 'convert_phone_field value=%s country=%s', value, country_code) - try: - res_parse = phonenumbers.parse( - value, country_code) - _logger.debug('res_parse=%s', res_parse) - new_value = phonenumbers.format_number( - res_parse, phonenumbers.PhoneNumberFormat.E164) - _logger.debug('new_value=%s', new_value) - except: - _logger.error( - "Cannot reformat the phone number '%s' to " - "international format with region=%s", - value, country_code) - new_value = value - return new_value - - -def convert_all_phone_fields(self, vals, fields_to_convert): - loc_vals = vals.copy() - for field in fields_to_convert: - country_key = self._fields[field].country_field - partner_key = self._fields[field].partner_field - country = False - if country_key: - if country_key in loc_vals: - country = self.env['res.country'].browse(vals[country_key]) - else: - country = self[country_key] - if partner_key and not country: - if partner_key in loc_vals: - partner = self.env['res.partner'].browse(vals[partner_key]) - else: - partner = self[partner_key] - if partner: - country = partner.country_id - if not country: - country = self.env.user.company_id.country_id - country_code = False - if country: - country_code = country.code.upper() - if loc_vals[field]: - loc_vals[field] = convert_phone_field( - loc_vals[field], country_code) - return loc_vals - - -def get_phone_fields(self, vals): - fields_to_convert = [] - for key in vals: - if isinstance(self._fields.get(key), Fax): - fields_to_convert.append(key) - return fields_to_convert - -original_write = models.Model.write -original_create = models.Model.create - - -@api.multi -def write(self, vals): - fields_to_convert = get_phone_fields(self, vals) - if fields_to_convert: - for record in self: - loc_vals = convert_all_phone_fields( - record, vals, fields_to_convert) - original_write(record, loc_vals) - return True - else: - return original_write(self, vals) - - -@api.model -@api.returns('self', lambda value: value.id) -def create(self, vals): - fields_to_convert = get_phone_fields(self, vals) - if fields_to_convert: - vals = convert_all_phone_fields(self, vals, fields_to_convert) - return original_create(self, vals) - -models.Model.write = write -models.Model.create = create diff --git a/base_phone/models/__init__.py b/base_phone/models/__init__.py index 0b99d39..e4ebd1e 100644 --- a/base_phone/models/__init__.py +++ b/base_phone/models/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +from . import base from . import res_company from . import res_partner from . import phone_common diff --git a/base_phone/models/base.py b/base_phone/models/base.py new file mode 100644 index 0000000..fb53158 --- /dev/null +++ b/base_phone/models/base.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# © 2016 SYLEAM +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from .. import common +from odoo import models, api + + +class Base(models.AbstractModel): + _inherit = 'base' + + @api.multi + def write(self, vals): + fields_to_convert = common.get_phone_fields(self, vals) + if fields_to_convert: + for record in self: + loc_vals = common.convert_all_phone_fields( + record, vals, fields_to_convert) + super(Base, record).write(loc_vals) + return True + else: + return super(Base, self).write(vals) + + @api.model + @api.returns('self', lambda value: value.id) + def create(self, vals): + fields_to_convert = common.get_phone_fields(self, vals) + if fields_to_convert: + vals = common.convert_all_phone_fields( + self, vals, fields_to_convert) + return super(Base, self).create(vals)